El *_*rto 6 iptables openvpn port-forwarding
这是我的场景。我有三个主机。
1) GATEWAY 运行 OpenVPN 服务器。它有 1 个 LAN IP (192.168.1.10) 和 1 个 OpenVPN IP (10.8.0.1)。
2)LOCAL-CLIENT,与GATEWAY在同一个局域网内的机器,有1个局域网IP(192.168.1.12)
3) REMOTE-SERVER,一个 MySQL 服务器,它是 OpenVPN 服务器的客户端。它有 1 个公共 IP 和 1 个 OpenVPN IP (10.8.0.51)。
我希望能够通过 VPN 从本地客户端连接到远程服务器上的 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
Run Code Online (Sandbox Code Playgroud)
这适用于 GATEWAY,我可以使用 192.168.1.10 作为主机连接到 MySQL。但是当我从 LOCAL-CLIENT 尝试时,我收到“连接被拒绝”错误(使用 MySQL 客户端或 telnet 到端口 3306)。
我在这里缺少什么?
顺便说一句,我还尝试转发 HTTP 端口以针对也在远程服务器上运行的 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
Run Code Online (Sandbox Code Playgroud)
这是我在 GATEWAY 上的 iptables(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
Run Code Online (Sandbox Code Playgroud)
这是 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
Run Code Online (Sandbox Code Playgroud)
编辑:
根据@SmallClanger 的评论,我意识到我不需要进行任何端口转发或 NAT。LOCAL-CLIENT 能够通过其 VPN 的 IP 连接到远程服务器。为此,由于我的 VPN 网关不是默认网关,我必须在 LOCAL-CLIENT 上添加此静态路由:
ip route add 10.8.0.0/24 via 192.168.1.10 dev eth0
Run Code Online (Sandbox Code Playgroud)
我还必须删除 iptables 上的这条 FORWARD 规则,这会阻止 LOCAL-CLIENT 连接到任何 VPN 客户端:
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
Run Code Online (Sandbox Code Playgroud)
这是因为该OUTPUT
链仅作用于源自本地进程的数据包。(请参阅此处这张有用的图片。)
如果您将该规则替换为(或补充,如果您仍想从网关连接):
iptables -t nat -A PREROUTING -p tcp --dport 3306 -j DNAT --to 10.8.0.51
Run Code Online (Sandbox Code Playgroud)
而且,如果您尚未允许流量:
iptables -t filter -A FORWARD -p tcp -d 10.8.0.51 --dport 3306 -j ACCEPT
Run Code Online (Sandbox Code Playgroud)
然后您的连接应该会成功。由于它已经通过网关工作,因此您可以确定 MySQL 正在正确侦听并且其服务器正在接受连接。
但是,我怀疑您是否真的需要 NAT。单独的路由应该使用适当的FORWARD
规则来处理这个问题。该路由可以手动建立,也可以通过 VPN 服务器配置建立,这取决于您的要求。如果您想查看此选项,您可以将您的 openvpn 服务器配置和输出添加route -n
到您的帖子中吗?
编辑
为了确保连接通过 VPN 路由回,您需要一条从服务器到 LAN 的路由。要在 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
在服务器上将显示通过 VPN 适配器(客户端或服务器)的 mysql 流量。您应该能够看到连接握手哪里出了问题。
归档时间: |
|
查看次数: |
24175 次 |
最近记录: |