通过OpenVPN进行端口转发

这是我的场景。 我有三个主机。

1)运行OpenVPN服务器的GATEWAY。 它有1个LAN IP(192.168.1.10)和1个OpenVPN IP(10.8.0.1)。

2)LOCAL-CLIENT,与GATEWAY在同一局域网内的一台机器,有一个局域网IP(192.168.1.12)

3)REMOTE-SERVER,一个作为OpenVPN服务器客户端的MySQL服务器。 它有1个公共IP和1个OpenVPN IP(10.8.0.51)。

我希望能够通过VPN从LOCAL-CLIENT连接到远程服务器上的MySQL。

到目前为止,我已经启用了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作为主机。 但是,当我从本地客户端尝试时,我得到一个“连接被拒绝”错误(使用MySQL客户端或telnet端口3306)。

我在这里错过了什么?

顺便说一句,我也试着转发HTTP端口来testing运行在REMOTE-SERVER上的Apache,我也得到了相同的结果,所以这不是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 

这是我在GATEWAY上的iptables(AFAIK,大多数规则是由OpenVPN服务器添加的)。 这是在应用@SmallClangerbuild议的更改之后。

 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可以通过VPN的IP连接到REMOTE-SERVER。 为此,由于我的VPN网关不是默认网关,因此必须在LOCAL-CLIENT上添加此静态路由:

 ip route add 10.8.0.0/24 via 192.168.1.10 dev eth0 

我也不得不在iptables上删除这个阻止LOCAL-CLIENT连接到任何VPN客户端的FORWARD规则:

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

这是因为OUTPUT链只对来自本地进程的数据包起作用。 ( 在这里看到这个有用的图像。)

如果你replace(或补充,如果你还想连接forms的网关)该规则与:

 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规则。 该路由可以手动build立或通过VPN服务器configuration,这取决于您的要求。 如果你想看看这个选项,你可以添加你的openvpn服务器configuration和route -n的输出到你的文章吗?

编辑

为确保连接路由通过VPN,您需要从服务器到您的LAN的路由。 要在MySQL服务器上手动添加:

route add -net 192.168.1.0/24 dev tun0 (如果tun0是您的VPN客户端接口)。

如果有效,最好把它添加到你的VPN客户端config: route 192.168.1.0/24 (这将自动创build连接上的路由,而不pipe使用哪个通道接口或PPP端点地址)

一个有用的debugging提示:服务器上的tcpdump -i tun0 -qtln port 3306将显示通过VPN适配器(客户端或服务器)的mysqlstream量。 你应该能够看到连接握手的错误。