Перенести порт на VPN-клиент?


21

Я столкнулся с небольшой загадкой, и мне не повезло найти решение. Прямо сейчас я (к сожалению) подключен к сети через Verizon 3G. Они фильтруют весь входящий трафик, поэтому я не могу открыть порты, чтобы принимать соединения.

В настоящее время у меня есть виртуальная машина Linux на linode.com, и мне в голову пришла мысль установить pptpdи попытаться выполнить iptablesпереадресацию портов. Я pptpdустановил, и моя домашняя машина соединяется счастливо. Тем не менее, вот некоторая общая информация:

IP-адрес сервера (Debian) WAN: xxxx на eth0 - IP-адрес pptpd: yyy1 на ppp0 - IP-адрес клиента VPN: yyy100

Чтобы убедиться, что я не схожу с ума, я попытался установить некоторые соединения с сервера к открытым портам на клиенте, и клиент действительно принимает соединения через VPN IP.

Что я хочу сделать, это:

Интернет -> WAN IP: порт -> Переслать клиенту VPN IP: порт

Так, например, если бы у меня был открыт порт 6000 на моем клиенте, человек мог бы подключиться через telnet к xxxx: 6000, и сервер перехватил бы это и перенаправил бы его на 192.168.3.100:6000.

Я пробовал по крайней мере 20 различных Googled конфигов, iptablesи ни один еще не работал. У кого-нибудь есть какие-нибудь идеи или, может быть, даже совершенно другой подход, о котором я не знаю? Цель здесь состоит в том, чтобы прослушивать ужасно защищенное соединение, желательно как TCP, так и UDP трафик.

Ответы:


25

Вам нужно сделать три вещи на вашем VPN-сервере (Linode), чтобы сделать эту работу:

  1. Вы должны включить IP-пересылку:

    sysctl -w net.ipv4.ip_forward=1
    
  2. Настройте целевой NAT (DNAT) для переадресации порта. Вы, наверное, уже поняли это, потому что это стандартная переадресация портов, но для полноты:

    iptables -t nat -A PREROUTING -d x.x.x.x -p tcp --dport 6000 -j DNAT --to-dest y.y.y.100:6000
    
  3. Настройте исходный NAT (SNAT) так, чтобы с точки зрения вашего VPN-клиента соединение осуществлялось с VPN-сервера:

    iptables -t nat -A POSTROUTING -d y.y.y.100 -p tcp --dport 6000 -j SNAT --to-source y.y.y.1
    

Причина, по которой вам нужен SNAT, заключается в том, что в противном случае ваш VPN-клиент будет отправлять свои возвратные пакеты прямо на хост, который инициировал соединение (zzzz) через шлюз по умолчанию (т. Е. Verizon 3G), а не через VPN. Таким образом, исходный IP-адрес в возвращаемых пакетах будет вашим адресом Verizon 3G, а не хххх. Это вызывает всевозможные проблемы, поскольку zzzz действительно инициировал соединение с хххх

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

Также обратите внимание, что если вы хотите перенаправить порт 6000 на другой порт (скажем, 7000), тогда правило SNAT должно соответствовать 7000, а не 6000.


Привет AGWA, спасибо за ответ. У меня уже был ip_forwarding, и ваши правила работали отлично, хотя не изначально. Проблема заключалась в том, что (из-за моего iptables noobness) я не осознавал, что iptables -F не ​​сбрасывал записи nat, а iptables -L не перечислял их. После выяснения, как правильно их перечислить, я заметил несколько противоречивых записей из попыток раньше. После сброса и проверки ваших правил все работает отлично. Хотя один быстрый вопрос, в ваших правилах вы указываете tcp. Будет ли изменение этого параметра на «все» работать для трафика TCP / UDP?
Мерзкий бригандир

Пожалуйста! (Кстати, мне нравится iptables-saveпоказывать мои правила iptables - хотя вывод не предназначен для потребления человеком, он по-прежнему читабелен и показывает все ваши правила iptables.) Нет, к сожалению, вы не можете использовать там «все», потому что --dportтолько работает с протоколами, которые на самом деле имеют порты («все» будет включать, например, ICMP, который не имеет понятия о портах). Вам понадобятся отдельные правила для TCP и UDP.
AGWA

Спасибо за подсказку iptables-save. Все работает как положено как для TCP, так и для UDP. Приветствия.
Мерзкий бригандир

2
Просто обновление этого ответа заключается в том, что с iproute2 вы можете фактически настроить свой VPN-клиент на 2 шлюза и перенаправить трафик DNAT обратно через VPN. Это полезно, если вы не хотите использовать SNAT и весь трафик поступает с сервера vpn. thomas-krenn.com/en/wiki/Two_Default_Gateways_on_One_System содержит информацию о том, как это настроить.
PressingOnAlways

Работает у меня до тех пор, пока UFW отключен, хотя я разрешил 8080 в UFW, но как только я включаю UFW, этот материал переадресации не работает .. любая идея?
Судхир N

3

Я также имел эту проблему и пытался решить ее в течение нескольких часов .. Вот мое решение:

  • У меня было более одного VPNClientс тем же IPAddress. Поэтому я дал каждому из них статическийIPAddress

Определите каталог, в котором должны храниться клиентские скрипты, например / etc / openvpn / staticclients, и создайте каталог

mkdir /etc/openvpn/staticclients

Добавьте этот каталог как опцию в ваш конфигурационный файл openvpn на сервере:

client-config-dir /etc/openvpn/staticclients

Для каждого клиента вы должны создать файл. Имя файла должно соответствовать common nameатрибуту, указанному в сертификате клиента. Эта команда получает CN из сертификата компьютера:

Этот пример передает IPAddress10.1.134.110/10.1.134.109 Клиенту с common name TESTCLIENT, а также выдвигает дополнительный маршрут для подсети 10.1.135.0.

cat /etc/openvpn/staticclients/TESTCLIENT

ifconfig-push 10.1.134.110 10.1.134.109
push "route 10.1.135.0 255.255.255.0 10.1.134.62"
  • http://www.yougetsignal.com/tools/open-ports/ и http://canyouseeme.org/ неправильно определяли порты. Мне пришлось дополнительно запустить свое приложение на клиенте, чтобы веб-сайты могли видеть эти порты.

  • Нет необходимости в дополнительных SNATправилах. Нужны были только эти правила:

sysctl -w net.ipv4.ip_forward=1

iptables -t nat -A PREROUTING -p tcp --dport 28006 -j DNAT --to 10.1.134.110

2

На большинстве серверов переадресация ip отключена в конфигурации по умолчанию. Вам нужно включить его, если вы хотите перенаправить входящие соединения через VPN.

Попробуй это:

sysctl -w net.ipv4.ip_forward = 1

Я имею в виду в дополнение к конфигурации iptables.


0

То, чего вы хотите достичь, (возможно) очень возможно с помощью pptpdOpenVPN и iptables, однако, вы можете найти tinc лучшим кандидатом для этого варианта использования. Я только что прочитал это, которое описывает, как настроить tinc именно для этого варианта использования. Это (потенциально более простая) альтернатива части pptdpили OpenVPN. Тогда вам нужны точно такие же правила для iptables.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.