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

Проброс портов через OpenVPN

Вот мой сценарий. У меня три хозяина.

1) ШЛЮЗ, на котором запущен OpenVPN Server. Он имеет 1 IP-адрес LAN (192.168.1.10) и 1 IP-адрес OpenVPN (10.8.0.1).

2) LOCAL-CLIENT, машина в той же LAN, что и GATEWAY, с 1 IP-адресом LAN (192.168.1.12)

3) REMOTE-SERVER, сервер MySQL, который является КЛИЕНТОМ сервера OpenVPN. Он имеет 1 общедоступный IP-адрес и 1 IP-адрес OpenVPN (10.8.0.51).

Я хочу иметь возможность подключаться к MySQL на REMOTE-SERVER от LOCAL-CLIENT через VPN.

Пока что я включил переадресацию IP и добавил переадресацию порта следующим образом:

echo "1" > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A OUTPUT -p tcp --dport 3306 -j DNAT --to 10.8.0.51

Это работает с GATEWAY, я могу подключиться к MySQL, используя 192.168.1.10 в качестве хоста. Но когда я пытаюсь установить соединение с LOCAL-CLIENT, я получаю сообщение об ошибке «Соединение отклонено» (либо с использованием клиента MySQL, либо с помощью Telnet на порт 3306).

Что мне здесь не хватает?

Кстати, я также пробовал перенаправить HTTP-порт для проверки на Apache, который также работает на REMOTE-SERVER, и я получаю те же результаты, поэтому это не проблема MySQL.

Больше информации:

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.8.0.2        0.0.0.0         255.255.255.255 UH    0      0        0 tun0
10.8.0.0        10.8.0.2        255.255.255.0   UG    0      0        0 tun0
192.168.1.0     0.0.0.0         255.255.255.0   U     1      0        0 eth1
5.5.0.0         0.0.0.0         255.255.252.0   U     0      0        0 as0t0
5.5.4.0         0.0.0.0         255.255.252.0   U     0      0        0 as0t1
5.5.8.0         0.0.0.0         255.255.252.0   U     0      0        0 as0t2
5.5.12.0        0.0.0.0         255.255.252.0   U     0      0        0 as0t3
0.0.0.0         192.168.1.1     0.0.0.0         UG    0      0        0 eth1

Вот мои iptables на GATEWAY (AFAIK, большинство правил добавляются сервером OpenVPN). Это после применения изменений, предложенных @SmallClanger.

iptables -L -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
AS0_ACCEPT  all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED 
AS0_ACCEPT  all  --  0.0.0.0/0            0.0.0.0/0           
AS0_IN_PRE  all  --  0.0.0.0/0            0.0.0.0/0           mark match 0x2000000/0x2000000 
AS0_ACCEPT  tcp  --  0.0.0.0/0            192.168.1.10        state NEW tcp dpt:915 
AS0_ACCEPT  tcp  --  0.0.0.0/0            192.168.1.10        state NEW tcp dpt:914 
AS0_ACCEPT  udp  --  0.0.0.0/0            192.168.1.10        state NEW udp dpt:917 
AS0_ACCEPT  udp  --  0.0.0.0/0            192.168.1.10        state NEW udp dpt:916 
AS0_WEBACCEPT  all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED 
AS0_WEBACCEPT  tcp  --  0.0.0.0/0            192.168.1.10        state NEW tcp dpt:943 

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
AS0_ACCEPT  all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED 
AS0_IN_PRE  all  --  0.0.0.0/0            0.0.0.0/0           mark match 0x2000000/0x2000000 
AS0_OUT_S2C  all  --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     all  --  10.8.0.0/24          0.0.0.0/0           
REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-port-unreachable 
ACCEPT     tcp  --  0.0.0.0/0            10.8.0.51           tcp dpt:3306 

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
AS0_OUT_LOCAL  all  --  0.0.0.0/0            0.0.0.0/0           

Chain AS0_ACCEPT (7 references)
target     prot opt source               destination         
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           

Chain AS0_DNS (2 references)
target     prot opt source               destination         
ACCEPT     all  --  0.0.0.0/0            172.20.2.26         
DROP       all  --  0.0.0.0/0            0.0.0.0/0           

Chain AS0_IN (4 references)
target     prot opt source               destination         
ACCEPT     all  --  0.0.0.0/0            5.5.0.1             
ACCEPT     all  --  0.0.0.0/0            10.8.0.1            
ACCEPT     all  --  0.0.0.0/0            192.168.1.0/24      
AS0_IN_POST  all  --  0.0.0.0/0            0.0.0.0/0           

Chain AS0_IN_POST (1 references)
target     prot opt source               destination         
AS0_OUT    all  --  0.0.0.0/0            0.0.0.0/0           
DROP       all  --  0.0.0.0/0            0.0.0.0/0           

Chain AS0_IN_PRE (2 references)
target     prot opt source               destination         
AS0_DNS    tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:53 
AS0_DNS    udp  --  0.0.0.0/0            0.0.0.0/0           state NEW udp dpt:53 
AS0_IN     all  --  0.0.0.0/0            5.5.0.0/20          
AS0_IN     all  --  0.0.0.0/0            192.168.0.0/16      
AS0_IN     all  --  0.0.0.0/0            172.16.0.0/12       
AS0_IN     all  --  0.0.0.0/0            10.0.0.0/8          
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           

Chain AS0_OUT (2 references)
target     prot opt source               destination         
DROP       all  --  0.0.0.0/0            0.0.0.0/0           

Chain AS0_OUT_LOCAL (1 references)
target     prot opt source               destination         
DROP       icmp --  0.0.0.0/0            0.0.0.0/0           icmp type 5 
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           

Chain AS0_OUT_S2C (1 references)
target     prot opt source               destination         
AS0_OUT    all  --  0.0.0.0/0            0.0.0.0/0           

Chain AS0_WEBACCEPT (2 references)
target     prot opt source               destination         
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0 

Вот таблица NAT

iptables -L -n -t nat
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
AS0_NAT_PRE_REL_EST  all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED 
AS0_DPFWD_UDP  udp  --  0.0.0.0/0            192.168.1.10        udp dpt:1194 state NEW 
AS0_DPFWD_TCP  tcp  --  0.0.0.0/0            192.168.1.10        tcp dpt:443 state NEW 
DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:3306 to:10.8.0.51 

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
AS0_NAT_POST_REL_EST  all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED 
AS0_NAT_PRE  all  --  0.0.0.0/0            0.0.0.0/0           mark match 0x2000000/0x2000000 
MASQUERADE  all  --  10.8.0.0/24          0.0.0.0/0           

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain AS0_DPFWD_TCP (1 references)
target     prot opt source               destination         
DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0           to:192.168.1.10:914 
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           

Chain AS0_DPFWD_UDP (1 references)
target     prot opt source               destination         
DNAT       udp  --  0.0.0.0/0            0.0.0.0/0           to:192.168.1.10:916 
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           

Chain AS0_NAT (2 references)
target     prot opt source               destination         
SNAT       all  --  0.0.0.0/0            0.0.0.0/0           to:192.168.1.10 
SNAT       all  --  0.0.0.0/0            0.0.0.0/0           to:10.8.0.1 
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           

Chain AS0_NAT_POST_REL_EST (1 references)
target     prot opt source               destination         
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           

Chain AS0_NAT_PRE (1 references)
target     prot opt source               destination         
AS0_NAT_TEST  all  --  0.0.0.0/0            5.5.0.0/20          
AS0_NAT_TEST  all  --  0.0.0.0/0            192.168.0.0/16      
AS0_NAT_TEST  all  --  0.0.0.0/0            172.16.0.0/12       
AS0_NAT_TEST  all  --  0.0.0.0/0            10.0.0.0/8          
AS0_NAT    all  --  0.0.0.0/0            0.0.0.0/0           

Chain AS0_NAT_PRE_REL_EST (1 references)
target     prot opt source               destination         
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           

Chain AS0_NAT_TEST (4 references)
target     prot opt source               destination         
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     all  --  0.0.0.0/0            5.5.0.0/20          
AS0_NAT    all  --  0.0.0.0/0            0.0.0.0/0 

Редактировать:

Основываясь на комментариях @ SmallClanger, я понял, что мне не нужно делать переадресацию портов или NAT. LOCAL-CLIENT может подключаться к REMOTE-SERVER через свой IP-адрес VPN. Для этого, поскольку мой VPN-шлюз не является шлюзом по умолчанию, мне пришлось добавить этот статический маршрут в LOCAL-CLIENT:

ip route add 10.8.0.0/24 via 192.168.1.10 dev eth0

Мне также пришлось удалить это правило FORWARD на iptables, которое мешало LOCAL-CLIENT подключаться к любому VPN-клиенту:

REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable

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

Если вы замените (или дополните, если вы все еще хотите подключиться через шлюз) это правило:

iptables -t nat -A PREROUTING -p tcp --dport 3306 -j DNAT --to 10.8.0.51

И, если вы еще не разрешили трафик:

iptables -t filter -A FORWARD -p tcp -d 10.8.0.51 --dport 3306 -j ACCEPT

Тогда ваше соединение должно пройти. Поскольку он уже работает со шлюзом, вы можете быть уверены, что MySQL правильно слушает и что его сервер принимает соединение.

Однако я сомневаюсь, что вам вообще нужен NAT. С этим должна справиться только маршрутизация с соответствующими FORWARD правило. Эта маршрутизация может быть установлена ​​вручную или через конфигурацию сервера VPN, это зависит от ваших требований. Если вы хотите взглянуть на этот вариант, можете ли вы добавить конфигурацию сервера openvpn и вывод route -n на свой пост?

РЕДАКТИРОВАТЬ

Чтобы обеспечить обратное соединение через VPN, вам понадобится маршрут к вашей локальной сети от сервера. Чтобы добавить это вручную на сервер MySQL:

route add -net 192.168.1.0/24 dev tun0 (если tun0 это ваш клиентский интерфейс VPN).

Если это работает, лучше добавить это в конфигурацию вашего VPN-клиента: route 192.168.1.0/24 (Это автоматически создаст маршрут при подключении, независимо от используемого туннельного интерфейса или адресов конечных точек PPP)

Полезный совет по отладке: tcpdump -i tun0 -qtln port 3306 на сервере покажет вам трафик mysql, проходящий через адаптеры VPN (клиент или сервер). Вы должны увидеть, где происходит сбой при установлении связи.