Делюсь советом для товарищей по несчастью, которые находятся за CGNAT провайдера и не могут открыть порты. Проделал это ради Soulseek и результаты поиска стали заметно лучше.
Если у вас есть удалённый сервер / VPS (подойдет самый слабый, если у вас не особо большие объемы трафика), вы можете форварднуть порт при помощи FRP или подобного туннелирующего протокола (раньше использовал Wireguard) - на гитхабе есть подробный README с примерами, так что заострять внимание не буду.
Однако возникает другая проблема - возьмем для примера Soulseek, хотя это актуально и для, например, торрента - наш клиент общается с сервером с "домашнего" IP, соответственно, сервер ожидает увидеть открытый порт на этом IP и про наш VPS он не знает. Как нам туннелировать трафик через VPS, чтобы всё общение шло через него?
Можно заморочиться со Squid/HAProxy, а можно поступить проще и организовать пересылку при помощи iptables.
Для этого разрешим IP forwarding на сервере, добавив строчку
После этого необходимо добавить следующие два правила в iptables:
Здесь порт - это порт сервера, как можно понять, а не тот, который мы пробросили до этого.
А теперь то, на что я убил вчера полдня. Если у вас на сервере стоит файрволл UFW, то вы должны явно разрешить IP forwarding:
Поздравляю, вы великолепны! Остаётся указать в качестве адреса сервера в настройках вашей программы адрес VPS вместо изначального сервера. И не забыть открыть порт на VPS, да:
Если у вас есть удалённый сервер / VPS (подойдет самый слабый, если у вас не особо большие объемы трафика), вы можете форварднуть порт при помощи FRP или подобного туннелирующего протокола (раньше использовал Wireguard) - на гитхабе есть подробный README с примерами, так что заострять внимание не буду.
Однако возникает другая проблема - возьмем для примера Soulseek, хотя это актуально и для, например, торрента - наш клиент общается с сервером с "домашнего" IP, соответственно, сервер ожидает увидеть открытый порт на этом IP и про наш VPS он не знает. Как нам туннелировать трафик через VPS, чтобы всё общение шло через него?
Можно заморочиться со Squid/HAProxy, а можно поступить проще и организовать пересылку при помощи iptables.
Для этого разрешим IP forwarding на сервере, добавив строчку
net.ipv4.ip_forward=1 в файл /etc/sysctl.d/99-sysctl.conf и выполнив sysctl -p.После этого необходимо добавить следующие два правила в iptables:
iptables -t nat -A PREROUTING -i <интерфейс> -p tcp --dport <порт> -j DNAT --to-destination <IP конечного сервера>:<порт>
iptables -t nat -A POSTROUTING -j MASQUERADE
Здесь порт - это порт сервера, как можно понять, а не тот, который мы пробросили до этого.
А теперь то, на что я убил вчера полдня. Если у вас на сервере стоит файрволл UFW, то вы должны явно разрешить IP forwarding:
ufw route allow in on <интерфейс> out on <интерфейс> to <IP конечного сервера> port <порт> proto tcp
Поздравляю, вы великолепны! Остаётся указать в качестве адреса сервера в настройках вашей программы адрес VPS вместо изначального сервера. И не забыть открыть порт на VPS, да:
ufw allow <порт>
❤🔥8
❤1
