Создание eep-сайта на базе Nginx и I2Pd
Ввиду того, что прошлая статья изобилует неточностями и устаревшей инфой, мною было решено написать новую инструкцию, раскрывающую данную тему.
Предполагается, что у вас уже имеется следующее:
- Сервер на GNU/Linux или любой другой UNIX-подобной ОС, на которой представляется возможным установить/собрать и настроить нужное ПО. Конкретно в этой статья будут рассматриваться несколько дистрибутивов GNU/Linux. буду благодарен, если кто-то добавит информацию про другие ОС.
- Файлы сайта, к которым будут обращаться посетители;
- Желание связываться со скрытосетями и их пользователями.
Этап 1. Установка I2Pd[править]
Для начала, я думаю, стоит рассказать о нескольких преимуществах I2Pd при использовании на серверной стороне:
- Отсутствие необходимости держать Java Runtime;
- Как следствие предыдущего пункта - меньшая прожорливость и способность работать там, где проблемы с запуском Java (например, сервера на OpenVZ);
- Минималистичность, отсутствие ненужных для сервера вещей вроде i2psnark и susimail;
- Возможность присваивать посетителям адрес из подсети 127.0.0.0/8 на базе destination-хеша, тем самым с небольшой точностью различая их.
Способы установки детально расписаны в мануале. Ниже приведу выдержки из него тех вариантов, которые я пробовал.
Debian[править]
1. Импортируем PGP-ключ репозитория, выполнив эти команды:
$ gpg --keyserver keys.gnupg.net --recv-keys 98EBCFE2 $ gpg -a --export 98EBCFE2 | sudo apt-key add -
2. Добавляем репозитории - создаём в папке /etc/apt/sources.list файл i2pd.list и записывает туда следующие строчки (где release - название используемой версии (jessie, stretch и т.д):
deb http://repo.lngserv.ru/debian release main deb-src http://repo.lngserv.ru/debian release main
3. Собственно, устанавливаем i2pd:
$ sudo apt-get install i2pd
Ubuntu[править]
Здесь всё несколько быстрее. Достаточно выполнить следующие три команды:
$ sudo add-apt-repository ppa:purplei2p/i2pd $ sudo apt-get update $ sudo apt-get install i2pd
Сборка из исходников[править]
В том случае, если для вашего дистрибутива нет пакетов, можно собрать I2Pd из исходных кодов. Для этого требуются компилятор C++11 (GCC версии страше 4.7 или Clang), Cmake, библиотеки Boost (1.49 или старше), OpenSSL и ZLib.
1. Качаем исходники (если есть Git, то с помощью него, если нет, то можно скачать архивом):
$ git clone https://github.com/PurpleI2P/i2pd
либо
$ wget -O i2pd.tar.gz https://github.com/PurpleI2P/i2pd/archive/openssl.tar.gz $ tar xpf i2pd.tar.xz $ mv i2pd-openssl i2pd
2. Собираем исходники:
$ cd i2pd/build $ cmake . $ make
3. Далее можем устанавливать:
# make install
Этап 2. Настройка I2Pd[править]
Открываем/создаём i2pd.conf (в зависимости от дистрибутива и метода установки он может быть либо в /etc/i2pd/, либо в /var/lib/i2pd) и вносим пару настроек:
1. Включаем режим демона и сервиса, чтобы i2pd работал в фоне и хранил все настройки в /var/lib/:
daemon = true service = true
2. Выставляем нужную скорость в зависимости от ограничений скорости и трафика вашего хостера/провайдера: (как я понял, скорость измеряется в килобайтах в секунду. L = 32 КБ/c, O = 256 КБ/с, P = 2048 КБ/с, X = неограничено)
bandwidth = L
3. В том случае, если сайт будет крутиться на дешёвом VPS, я рекомендую выключить транзитный трафик, так как он будет слишком сильно забивать канал, из-за чего некоторые хостеры могут даже засуспендить сервер:
notransit = true share = 0 [limits] transittunnels = 0
После этого открываем/создаём tunnels.conf, находящийся в той же папке, и настраиваем в нём туннель:
[mycoolsite] type = http host = 127.0.0.1 port = 13337 keys = mycoolsite.dat
- [mycoolsite] - имя туннеля, которое будет отображаться в веб-панели;
- type = http - тип туннеля. Так как мы создаём туннель для сайта, то выбираем http;
- host = 127.0.0.1 и port = 13337 - указание насчёт того, какой ресурс туннелировать. Так как nginx будет крутиться на том же сервере, то host следует направить на 127.0.0.1. В качестве значения port стоит выбрать какое-нибудь пятизначное число в районе 10000-40000, и в дальнейшем запомнить его;
- keys = mycoolsite.dat - имя файла с приватным ключом сайта, лежащего в /var/lib/i2pd/. Если файла нет, то I2Pd сгенерирует его. После генерации стоит сохранить его в безопасное место, чтобы иметь возможность восстановить сайт на том же адресе после суспенда/падения/отключения сервера.
Далее перезагружаем I2Pd, чтобы применить новые настройки. Как это сделать - обращайтесь к мануалам вашего дистрибутива. В большинстве случаев достаточно одной из двух команд - "service i2pd restart" для систем с upstart и "systemctl restart i2pd" для систем с systemd.
После этого нужно зайти в веб-консоль и получить b32 и b64-адреса сайта. Если I2Pd запущен на той же машине, что и браузер, то идём на 127.0.0.1:7070, жмём на I2P Tunnels и видим имя туннеля вместе с b32-адресом. Сохраняем b32-адрес, нажимаем на него и видим поле текста с b64-адресом. Его тоже сохраняем. В том случае, если I2Pd на удалённом сервере, делаем SSH-туннель от него к своему компьютеру:
$ ssh -L 7071:127.0.0.1:7070 root@123.456.78.9
После чего уже на этом компьютере открываем в браузере 127.0.0.1:7071 и делаем то же самое.
Наконец, включаем запуск I2Pd при загрузке системы: "systemctl enable i2pd" для систем на базе systemd, насчёт остальных обращайтесь к мануалам.
Этап 3. Установка Nginx[править]
Так как Nginx всё-таки гораздо более популярный и востребованный продукт, то его преимущества и установку я подробным образом рассматривать не буду, лишь дам пару команд.
- Debian/Ubuntu: sudo apt-get install nginx;
- Fedora: sudo dnf install nginx;
- Arch: sudo pacman -S nginx;
И так далее. Лично я на своём Debian предпочитаю включать официальный mainline-рерозиторий от nginx и устанавливать веб-сервер оттуда.
Этап 4. Настройка nginx[править]
1. Стандартной конфигурации nginx в большинстве случаем достаточно, но я рекомендую изменить пару настроек. Открываем /etc/nginx/nginx.conf и изменяем его:
- В стандартной поставке nginx будет ругаться на слишком длинные b32-адреса и откажется запускаться (выдавая ошибку could not build server_names_hash). Это можно починить следующей строчкой в секции http:
server_names_hash_bucket_size 128;
- В той конфигурации, которую я предпочитаю использовать, настройки отдельных сайтов хранятся в /etc/nginx/sites-available, а nginx берёт их из симлинков в /etc/nginx/sites-enabled. По умолчанию же nginx настроен брать конфиги из /etc/nginx/conf.d. Поэтому меняем строчку "include /etc/nginx/conf.d/*.conf;" на "include /etc/nginx/sites-enabled/*.conf;", после чего создаём в /etc/nginx папки sites-available и sites-enabled.
2. После этого создаём файл /etc/nginx/sites-available/mycoolsite.conf и заполняем его:
server { listen 127.0.0.1:13337; server_name mycoolsite.i2p qge6prwkrvrmhtup7oixiolh5wununwzmmgf5vgus4ni5d46g7uo.b32.i2p; charset utf-8; root /var/www/mycoolsite; index index.html; access_log /dev/null; error_log /dev/null; }
- listen 127.0.0.1:13337 - адрес и порт, на котором будет крутится сайт. Если указать 127.0.0.1 в качестве адреса, то nginx будет принимать запросы только с локалхоста (то бишь, только с I2P-туннеля), с других источников (то бишь, клирнета) соединение идти не будет, что важно для безопасности.
- server_name mycoolsite.i2p qge6prwkrvrmhtup7oixiolh5wununwzmmgf5vgus4ni5d46g7uo.b32.i2p; - домены сайта, который будет хостить nginx. В данном случае - человечный домен из адресной книги и b32-адрес.
- charset utf-8; - стандартная кодировка для отправляемого посетителям содержимого. Сейчас весь мир на юникоде, так что не будем отставать.
- root /var/www/mycoolsite - путь к корневой директории сайта, где будут храниться все его данные.
- index index.html; - главная страница для каждой папки сайта. То есть, например, при открытии http://mycoolsite.i2p/directory/ будет открываться http://mycoolsite.i2p/directory/index.html, но без конкретного указания index.html в URL.
- access_log /dev/null; и error_log /dev/null - пути, в которые сохранять логи посещений и ошибок сайта. Если вам они нужны, то направьте параметр на что-нибудь вроде /var/log/nginx/mycoolsite.access.log и /var/log/nginx/mycoolsite.error.log. В моём же случае они сохраняются в /dev/null, что означает, что они не сохраняются.
3. Далее, когда конфигурация сервера готова, делаем симлик в sites-enabled:
$ sudo ln -s /etc/nginx/sites-available/mycoolsite.conf /etc/nginx/sites-enabled/
4. Затем создаём папку /var/www/mycoolsite или другую, которую вы указали в конфиге, и перемещаем туда все файлы сайта.
В конце-концов перезапускаем и добавляем nginx в автозагрузку. Делается это аналогично I2Pd.
Итог[править]
Если всё сделано правильно, то у вас будет доступный только из-под I2P сайт со статическим содержимым. Если что-то не получается - гуглите ошибки, ведь наверняка вы не одни такие. Насчёт других конфигураций (например, установки PHP) тоже гуглите, поскольку если описывать всё этот тут, то статья выйдет ещё более громоздкой.