Назад | Перейти на главную страницу

Перенаправление портов через OpenVPN клиенту на OpenVZ

редактировать: Хорошо, я постараюсь прояснить это. То, что я пытаюсь достичь, - это просто переадресация порта через мой сервер openvpn, размещенный в OpenVZ, на службу, работающую на клиенте. Есть несколько различных сервисов, которые я бы хотел пересылать, например, веб-сервер или клиент Bittorent. Допустим, я просто хочу установить функциональное соединение netcat с этой топологией:

интернет ---> [-> сервер (1.2.3.4:15555)] - nat - / -> openvpn-server (10.8.0.1) - \ -> клиент, на котором запущен веб-сервер (10.8.0.6:15555)

или ....

(inet) ---> | (общедоступный IP-адрес) -nat-through-openvpn-server-- | -> to-client- \ 10.8.0.6 (пункт назначения)

Где inet представляет любой хост в Интернете, 1.2.3.4 представляет собой общедоступный IP-адрес моего сервера, а 10.8.0.6 представляет клиента ovpn, на котором будет размещен сервер, к которому я хотел бы получить доступ из-за VPN, по адресу / порту 1.2. .3.4: 15555

Вот мой ifconfig:

lo        Link encap:Local Loopback  
      inet addr:127.0.0.1  Mask:255.0.0.0
      UP LOOPBACK RUNNING  MTU:16436  Metric:1
      RX packets:1037374 errors:0 dropped:0 overruns:0 frame:0
      TX packets:1037374 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:0 
      RX bytes:141887598 (141.8 MB)  TX bytes:141887598 (141.8 MB)

tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  
      inet addr:10.8.0.1  P-t-P:10.8.0.2  Mask:255.255.255.255
      UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
      RX packets:1746329 errors:0 dropped:0 overruns:0 frame:0
      TX packets:3193026 errors:0 dropped:117 overruns:0 carrier:0
      collisions:0 txqueuelen:100 
      RX bytes:104945794 (104.9 MB)  TX bytes:4356609743 (4.3 GB)

venet0    Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  
      inet addr:127.0.0.2  P-t-P:127.0.0.2  Bcast:0.0.0.0  Mask:255.255.255.255
      UP BROADCAST POINTOPOINT RUNNING NOARP  MTU:1500  Metric:1
      RX packets:43166195 errors:0 dropped:0 overruns:0 frame:0
      TX packets:44728488 errors:0 dropped:11647 overruns:0 carrier:0
      collisions:0 txqueuelen:0 
      RX bytes:34214141842 (34.2 GB)  TX bytes:43166888251 (43.1 GB)

venet0:0  Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  
      inet addr:1.2.3.4  P-t-P:1.2.3.4  Bcast:1.2.3.4  Mask:255.255.255.255
      UP BROADCAST POINTOPOINT RUNNING NOARP  MTU:1500  Metric:1

venet0:1  Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  
      inet addr:1.2.3.5  P-t-P:1.2.3.5  Bcast:1.2.3.5  Mask:255.255.255.255
      UP BROADCAST POINTOPOINT RUNNING NOARP  MTU:1500  Metric:1

Поэтому я бы хотел, чтобы хосты в Интернете могли подключаться к прослушивателю netcat (или веб-серверу) на общедоступном IP-адресе сервера, преобразованном через NAT через сервер openvpn, к клиенту openvpn.

Я задал этот вопрос вчера вечером и удалил его, потому что думал, что понял ответ, но оказалось, что нет .. Если это похоже на повторяющийся вопрос, прошу прощения. Я искал и пытался следовать рекомендациям из других веток по этой теме. Ситуация такова, что у меня Ubuntu Minimal vps. Это контейнер OpenVZ. В основном он используется как сервер openvpn. Топология сети - p2p. Я пытаюсь перенаправить порт клиенту (скажем, 10.8.0.6, p2p 10.8.0.5) через общедоступный IP-адрес сервера (пример 1.2.3.4), чтобы определенная служба (скажем, apache) была доступна с адреса VPN 1.2. 3.4.

Я знаю, что, поскольку сервер является контейнером OpenVZ, необходимо использовать определенные обходные пути iptables, например, для openvpn:

iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -s $VPN_SN -j ACCEPT
iptables -A FORWARD -j REJECT
iptables -t nat -A POSTROUTING  -s $VPN_SN -o venet0 -j SNAT --to-source $OUTIP

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

iptables -A INPUT -i venet0 -d $EXTIP -p tcp --dport 80 -m state --state NEW -j ACCEPT
$IPT -t nat -A PREROUTING -p tcp -d $EXTIP --dport 80 -j REDIRECT --to-port 9001
iptables -A INPUT -i venet0 -p tcp --dport 9001 -j ACCEPT

Это тоже работает, хотя я бы предпочел, чтобы порт назначения (9001) не был открыт для всего мира, но иначе я не смог бы заставить его работать. То, что я вообще не могу заставить работать, - это пересылка трафика, предназначенного для общедоступного IP-адреса сервера ($ EXT_IP в приведенном выше примере) по определенному порту одному из клиентов VPN. Я пробовал делать это несколькими разными способами. (Мне также интересно, усложняет ли это топология точка-точка?) Я попытался использовать такие правила, как описано в другом потоке:

$IPT -A INPUT -p tcp -d $OUTIP --dport 15555 -j ACCEPT
$IPT -A FORWARD -i venet0 -p tcp --dport 15555 -j ACCEPT
$IPT -t nat -A PREROUTING -i venet0 -p tcp -m tcp --dport 15555 -j DNAT --to-destination 10.8.0.6:15555

(OUTIP означает исходящий IP-адрес или адрес venet0: 1. VPN-трафик направляется через venet0: 0 на venet0: 1)

Затем я настроил прослушиватель netcat: nc -l 0.0.0.0 -p 15555

И использовал этот сайт для проверки соединения, которое наконец показало некоторый прогресс:

invalid connection to [10.8.0.6] from (UNKNOWN) [66.240.174.69] 55814

По крайней мере, теперь я знаю, что трафик перенаправляется, и это начало. Поэтому я подумал, может быть, мне нужно добавить правило постмаршрутизации, чтобы трафик знал, куда нужно отправлять обратно.

$IPT -A POSTROUTING -t nat -p tcp -d 10.8.0.6 --dport 15555 -j SNAT --to-source $OUT_IP:15555

Получил тот же результат. я так разочарован тем, сколько часов я потратил, пытаясь переадресовать один порт для клиента. Я был бы очень признателен за помощь!

Наконец-то я заставил это работать. Оказывается, пакеты не пересылались через сервер. В итоге мне понадобились эти правила ниже. Я написал этот небольшой скрипт для включения / отключения правила переадресации портов.

## Port Forwarding to Client ##
fwd_EN="false" # Change to 'true' to enable
ext_if="venet0" # 
int_if="tun0" # 
int_ip="10.9.0.6" # client to forward to
int_PRT="15555"

if [[ $fwd_EN == "true" ]]; then

echo Warning: Port Forwarding enabled

$IPT -t nat -A PREROUTING -p tcp -i $ext_if --dport $int_PRT -j DNAT --to-dest $int_ip:$int_PRT
$IPT -A FORWARD -p tcp -i $ext_if -o $int_if -d $int_ip --dport $int_PRT -m state --state NEW -j ACCEPT
$IPT -A FORWARD -i $ext_if -o $int_if -d $int_ip -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A FORWARD -i $int_if -s $int_ip -o $ext_if -m state --state ESTABLISHED,RELATED -j ACCEPT

else echo Info: Port Forwarding Disabled

fi

Теперь я могу настроить прослушиватель nc на клиенте и с удаленного хоста запустить nc 1.2.3.4 15555 и связь работает!

anon@vpnclient:~$ nc -l -v -p 15555
Listening on [0.0.0.0] (family 0, port 15555)
Connection from [x.x.x.x] port 15555 [tcp/*] accepted (family 2, sport 58939)
Can you see me?
yes, I can!