Создание общедоступного узла Monero с поддержкой Tor Onion


Это большой вклад в работу сети Monero, предполагающий довольно сложные настройки. Если вы новичок, то вам это не нужно.

Конечная цель: Вы будете публично предлагать следующие услуги, где xxx.yyy.zzz.vvv будет IP-адресом вашего сервера.

  • xxx.yyy.zzz.vvv:18080 - клирнет P2P сервис (для других узлов)
  • xxx.yyy.zzz.vvv:18081 - клирнет RPC сервис (для кошельков)
  • yourlongv3onionaddress.onion:18083 - «луковый» P2P сервис (для других «луковых» узлов)
  • yourlongv3onionaddress.onion:18081 - «луковый» RPC сервис (для кошельков, подключающихся через Tor)

Почему используются разные P2P порты для клирнет и «луковых» сервисов? Это требование monerod.

Передача «плохих» транзакций с вашего IP-адреса

Как и в случае с любой службой широковещательной передачи или ретрансляции публичных данных, «плохой трафик» или в нашем случае «плохие транзакции» с точки зрения внешнего наблюдателя могут передаваться с IP-адреса вашего сервера, даже если на самом деле их источником пользователь удалённого кошелька. Это потенциальный риск, о котором следует помнить.

Зачем использовать именно эти настройки?​

Вы сможете безопасно и анонимно подключить свой десктоп и мобильные кошельки Monero к своему доверенному узлу Monero через Tor. Ваш узел всегда будет готов к использованию без каких-либо задержек (он будет всегда синхронизирован, в отличие от периодически работающего узла на ноутбуке).

Обслуживание блоков и транзакций в P2P сети Monero поможет новым пользователям загрузить и синхронизировать свои узлы. Это также усилит защиту P2P сети Monero от DDoS-атак и разделения.

Открытый интерфейс кошелька (RPC) позволяет любому пользователю подключить свои кошельки к сети Monero через ваш узел. Это полезно для новичков, которые еще не успели создать своих собственных узлов.

Сервис Tor Onion для интерфейса кошелька полезен для пользователей кошельков, подсоединяющихся через Tor, поскольку он смягчает риски проведения «атаки посредника» (MiTM) на выходные узлы Tor (которые вполне реальны). После подключения кошелька к «луковому» сервису проведение MiTM атаки не представляется реальным, поскольку в сети Tor применяется сквозная TLS защита соединений.

Сервис Tor Onion для P2P сети полезен для других пользователей полных узлов, поскольку он позволяет им транслировать транзакции по сети Tor (при помощи опции --tx-proxy).

Возможные предпосылки для создания узла​

Вы разбираетесь в администрировании Linux на базовом уровне. Вы ищете конкретное руководство Monero.

У вас есть администраторский доступ к серверу Linux с оперативной памятью 2 Гб и 120 Гб SSD (или 50 Гб для обрезанной версии узла). Эта информация актуальна на январь 2021.

Некоторые команды предназначены для Ubuntu, но вы легко переведёте их для используемого вами дистрибутива.

Установка Tor​

Установите Tor.

Измените /etc/tor/torrc, как показано ниже.

Включите сервис Tor при помощи команды systemctl enable tor и перезапустите его посредством команды systemctl restart tor

Убедитесь в том, что Tor работает, используя команду systemctl status tor@default

Новый луковый адрес и соответствующая пара ключей создаются демоном tor в директории /var/lib/tor/monero/. Возможно, вы захотите произвести резервное копирование, чтобы безопасно контролировать свой «луковый» адрес. Такое копирование происходит при каждой перезагрузке, когда вы добавляете новую HiddenServiceDir в конфигурацию torrc.

На данный момент необходимость в самом демоне Monero отсутствует. «Луковые» сервисы (также известные как «скрытые сервисы») просто будут ожидать, пока monerod локального хоста не появится на указанных портах 18081 и 18083.

/etc/tor/torrc

HiddenServiceDir /var/lib/tor/monero
HiddenServicePort 18081 127.0.0.1:18081    # интерфейс для кошелька (RPC)
HiddenServicePort 18083 127.0.0.1:18083    # интерфейс для P2P сети

Как работают «луковые» сервисы Tor?

Демон tor просто переносит трафик с виртуального «лукового» порта на фактический порт локального хоста, где какая-нибудь служба перехватит его (в нашем случае это будет monerod). По одному «луковому» адресу может находиться множество сервисов на различных виртуальных портах. Мы воспользуемся этой возможностью, чтобы иметь P2P и RPC сервисы monerod по одному «луковому» адресу. Вы можете создать любое количество «луковых» адресов на одном сервере или по одному IP-адресу, но в данном случае в этом нет необходимости.

Установка Monero

Создайте пользователя monero и группу useradd --system monero

Создайте директорию binaries (пока она будет пустой) mkdir -p /opt/monero и chown -R monero:monero /opt/monero

Создайте директорию data mkdir -p /srv/monero и chown -R monero:monero /srv/monero

Создайте директорию log mkdir -p /var/log/monero и chown -R monero:monero /var/log/monero

Вы можете без проблем изменить название вышеуказанных директорий в соответствии с вашими предпочтениями, но не забудьте после этого исправить путь.

Скачайте и проверьте файл.

Извлеките tar -xf monero-linux-x64-v0.17.1.9.tar.bz2 (измените имя файла соответствующим образом).

Переместите двоичные файлы в директорию /opt/monero/, используя mv monero-x86_64-linux-gnu-v0.17.1.9/* /opt/monero/, а затем chown -R monero:monero /opt/monero

Создайте /etc/monero.conf, как показано ниже и вставьте необходимые значения в соответствующие поля.

Создайте /etc/systemd/system/monero.service, как показано ниже.

Используя команду systemctl enable monero включите сервис Monero и перезапустите его командой systemctl restart monero

Проверьте, включился ли сервис, при помощи команды systemctl status monero

Проверьте, работает ли он надлежащим образом, используя tail -n100 /var/log/monero/monero.log

/etc/monero.conf

Это просто пример возможной конфигурации, и он ни в коем случае не является обязательным для реализации. Вы вольны вносить изменения. См. monerod reference.

Если вы изменили путь, внесите соответствующие корректировки.

Выведите ваш «луковый» адрес на экран, используя cat /var/lib/tor/monero/hostname, и вставьте его в поле опции anonymous-inbound option.

# /etc/monero.conf
#
# Конфигурационный файл для monerod. Все доступные опции можно найти в wiki.xmr.ru:
# https://wiki.xmr.ru/interacting/monerod.html

# Директория данных (база данных блокчейна и индексы)
data-dir=/srv/monero

# Опциональное обрезание
# prune-blockchain=1           # Обрезание позволяет сэкономить до 2/3 дискового пространства без ущерба для функциональности, но вклад в работу сети будет меньшим
# sync-pruned-blocks=1         # Позволяет скачать уже обрезанные блоки вместо того, чтобы обрезать их самостоятельно

check-updates=disabled         # Отключает проверку записей DNS TXT на наличие новой версии

# Файл журнала
log-file=/var/log/monero/monero.log
log-level=0                    # Минимальная запись журнала БЕЗ РЕГИСТРАЦИИ подключаемых одноранговых узлов или кошельков
max-log-file-size=2147483648   # Устанавливается значение 2 Гб, что позволяет избежать обрезания журнала демоном monerod; вместо этого следует конфигурировать logrotate

# Полный P2P узел
p2p-bind-ip=0.0.0.0            # Привязка ко всем интерфейсам (по умолчанию)
p2p-bind-port=18080            # Привязка к порту, используемому по умолчанию

# Открытый RPC узел
public-node=1                  # Предложение другим пользователям воспользоваться данным узлом в качестве удалённого для подсоединения их кошельков
confirm-external-bind=1        # Открыть узел (подтверждение)
rpc-bind-ip=0.0.0.0            # Привязка ко всем интерфейсам (для открытого узла)
rpc-bind-port=18081            # Привязка к порту, используемому по умолчанию (для открытого узла)
restricted-rpc=1               # Обязательно для интерфейса открытого узла
no-igd=1                       # Отключение распределение портов UPnP
no-zmq=1                       # Отключение ZMQ RPC сервера с целью сокращения поверхности атаки (не используется)

# RPC TLS
rpc-ssl=autodetect             # Использовать TLS, если клиент кошелька поддерживает этот протокол (задаётся по умолчанию); сертификат будет генерироваться каждый раз на ходу при каждом перезапуске

# Размер мемпула
max-txpool-weight=268435456    # Максимальный размер пула неподтверждённых транзакций в байтах (в данном случае 256 Мб, по умолчанию составляет ~618 Мб)

# Медленная, но надёжная запись в базу данных
db-sync-mode=safe

out-peers=64              # Обеспечивает значительно более быструю синхронизацию и передачу информации о транзакциях; используемое сегодня значение, равное 8, является недостаточным
in-peers=64               # По умолчанию значение не ограничено; здесь мы предпочитаем задавать верхний предел

limit-rate-up=1048576     # 1048576 КБ/с == 1 Гб/с; увеличение значения, используемого по умолчанию (2048 КБ/с); улучшение работы p2p сети
limit-rate-down=1048576   # 1048576 КБ/с == 1 Гб/с; увеличение значения, используемого по умолчанию (8192 КБ/с; служит для ускорения начальной синхронизации

# Tor: трансляция транзакций, сгенерированных подключёнными кошельками по сети Tor (не касается ретранслируемых транзакций)
tx-proxy=tor,127.0.0.1:9050,16

# Tor: добавление сид-узла P2P в сеть Tor
add-peer=moneroxmrxw44lku6qniyarpwgznpcwml4drq7vb24ppatlcg4kmxpqd.onion:18080
add-peer=monerozf6koypqrt.onion:18080
add-peer=zbjkbsxc5munw3qusl7j2hpcmikhqocdf4pqhnhtpzw5nt5jrmofptid.onion:18083        # https://github.com/monero-project/monero/blob/master/src/p2p/net_node.inl
add-peer=rno75kjcw3ein6i446sqby2xkyqjarb75oq36ah6c2mribyklzhurpyd.onion:28083        # Согласно Reddit, это основная сеть, несмотря на странное обозначение порта
add-peer=sqzrokz36lgkng2i2nlzgzns2ugcxqosflygsxbkybb4xn6gq3ouugqd.onion:18083        # Очень капризная опция, работает в 1 случае из 3

# Tor: указание своего «лукового» адреса для monerod с целью его дальнейшей публикации в P2P сети
anonymous-inbound=PASTE_YOUR_ONION_HOSTNAME:18083,127.0.0.1:18083,64

# Tor: будьте снисходительны к подключающимся кошелькам; рекомендуется http://xmrguide42y34onq.onion/remote_nodes
disable-rpc-ban=1

/etc/.../monero.service

# /etc/systemd/system/monero.service

[Unit]
Description=Monero Daemon
After=network.target
Wants=network.target

[Service]
ExecStart=/opt/monero/monerod --detach --config-file /etc/monero.conf --pidfile /run/monero/monerod.pid
ExecStartPost=/bin/sleep 0.1
Type=forking
PIDFile=/run/monero/monerod.pid

Restart=always
RestartSec=16

User=monero
Group=monero
RuntimeDirectory=monero

StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target

Открытие портов брандмауэра​

Если вы используете брандмауэр (а его следует использовать), откройте порты 18080 и 18081 для входящих TCP соединений. Это для входящих клирнет соединений, P2P и RPC соответственно.

Вам не нужно открывать каких-либо портов для Tor. «Луковые» сервисы работают с виртуальными портами. Демон tor не принимает входящие соединения напрямую, поэтому ему не нужны открытые порты.

Например, в случае с популярным брандмауэром UFW это делается следующим образом:

ufw allow 18080/tcp
ufw allow 18081/tcp

Для проверки используйте команду ufw status. Результат должен быть похож на приводимый ниже (порт 22, используемый SSH по умолчанию, не связан с Monero):

To                         Action      From
--                         ------      ----
22/tcp                     LIMIT       Anywhere                  
18080/tcp                  ALLOW       Anywhere                  
18081/tcp                  ALLOW       Anywhere                  
22/tcp (v6)                LIMIT       Anywhere (v6)             
18080/tcp (v6)             ALLOW       Anywhere (v6)             
18081/tcp (v6)             ALLOW       Anywhere (v6)   

Тестирование​

На сервере​

Перечислите все службы, отслеживающие порты, и убедитесь в том, что именно то, что и ожидается:

sudo netstat -lntpu

Результат должен содержать следующее (в любом порядке); очевидно, что значения PID будут отличаться.

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
...
tcp        0      0 0.0.0.0:18080           0.0.0.0:*               LISTEN      259255/monerod      
tcp        0      0 0.0.0.0:18081           0.0.0.0:*               LISTEN      259255/monerod      
tcp        0      0 127.0.0.1:18083         0.0.0.0:*               LISTEN      259255/monerod      
tcp        0      0 127.0.0.1:9050          0.0.0.0:*               LISTEN      258786/tor          

На клиентской машине​

Наконец, настала пора протестировать соединения с вашей клиентской машины.

Установите tor и torsocks на свой ноутбук. Они всё равно вам понадобятся для кошелька Monero.

Исключительно для тестирования вам также понадобятся nmap и proxychains.

Протестируйте клирнет P2P соединение:

nmap -Pn -p 18080 ВАШ_IP_АДРЕС

Протестируйте клирнет RPC соединение:

curl --digest -X POST http://ВАШ_IP_АДРЕС:18081/json_rpc -d '{"jsonrpc":"2.0","id":"0","method":"get_info"}' -H 'Content-Type: application/json'

Протестируйте «луковое» P2P соединение (пропустите, если у вас нет proxychains):

proxychains nmap -Pn -p 18083 ВАШ_ONION_АДРЕС.onion

Протестируйте «луковое» RPC соединение:

torsocks curl --digest -X POST http://ВАШ_ONION_АДРЕС.onion:18081/json_rpc -d '{"jsonrpc":"2.0","id":"0","method":"get_info"}' -H 'Content-Type: application/json'

Отладка​ и исправление ошибок

Tor:

  • Состояние: systemctl status tor@default
  • Записи в файле журнала регистрации: journalctl -xe --unit tor@default

Monero:

  • Состояние: systemctl status monero
  • Записи в файле журнал регистрации: tail -n100 /var/log/monero/monero.log
  • Дополнительная информация в файле журнал регистрации: измените log-level=0 to log-level=1 в файле monero.conf (не забудьте вернуть всё, как было, после того, как закончите).

Дальнейшие улучшения​

Периодические перезапуски

Вероятно, стоит добавить опцию периодического автоматического перезапуска tor и monerod каждые пару часов. Ни один из демонов не идеален; они могут зависать или им может не хватать памяти в критических ситуациях, например, как при недавних атаках на Tor v3 или DDoS атаках на сеть Monero. Одним из возможных способов реализации такой опции является использование таймеров systemd.