Вот мой сценарий. У меня три хозяина.
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 (клиент или сервер). Вы должны увидеть, где происходит сбой при установлении связи.