我有两个通过点对点隧道连接的 NAT 网络,如下所示:
| Machine A | | Machine B |
| 1.2.3.4 |<-10.101.3.2-------tun------10.101.3.1-> | 4.5.6.7 |
| 10.110.0.1 | | 10.100.1.1 |
-----+-------- --------+-----
| |
[ 10.110.1.0/24 net ] [ 10.100.0.0/16 net]
机器 A 有一个公共 IPeth0
和一个私有 IP 10.110.1.1
,vmbr0
并通过 ptp VPN 通过互联网与机器 B 连接,机器 B 有一个公共 IPen0
和一个私有 IP en1
(以及许多其他私有网络)
两个 LAN 上都有客户端使用带有两个公共 IP 的 NAT。这工作正常。(使用机器 A 上的 iptables 和机器 B 上的 pfSense 完成)
路由设置为机器 A 可以 ping 机器 B 的私有 ip 10.100.1.1
,并且可以访问网络 B 上的所有主机10.100.0.0/16
。同样,机器 B(以及网络 B 上的所有主机)可以访问机器 A,以及网络 A 上的所有主机10.110.1.0/16
但是,网络 A 上的主机无法与网络 B 上的主机建立连接(EG10.110.1.2
无法 ping 或 SSH 到10.100.10.50
)
我怀疑这与 A 上的 iptables 设置有关,因为 SSH from 10.100.10.50
to10.110.1.2
可以工作,但我不能然后反向 SSH。这对我说,我的 iptables FILTER 规则RELATED,ESTABLISHED
有效,但不知何故,我怀疑机器 A 正在尝试 NAT 并eth0
用于新连接。
我在所有我认为需要的地方添加了ACCEPT destination 10.100.0.0/16
iptables 规则,然后即使在我认为当事情不工作时不需要它们的地方,仍然无法从网络 A 到网络 B 的传出连接正常工作。
如何使用 iptables 通过点对点隧道正确连接两个经过 NAT 的专用网络?
附加信息:
机器 A 上的 iptables:
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere 10.100.0.0/16
DNAT tcp -- anywhere anywhere tcp dpt:http to:10.110.1.3:80
DNAT tcp -- anywhere anywhere tcp dpt:https to:10.110.1.3:443
DNAT tcp -- anywhere anywhere tcp dpt:xmpp-client to:10.110.1.4:5222
DNAT tcp -- anywhere anywhere tcp dpt:5281 to:10.110.1.4:5281
DNAT tcp -- anywhere anywhere tcp dpt:64738 to:10.110.1.4:64738
DNAT udp -- anywhere anywhere udp dpt:64738 to:10.110.1.4:64738
DNAT udp -- anywhere anywhere udp multiport dports isakmp,ipsec-nat-t to:10.110.1.10:1194
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere 10.100.0.0/16
ACCEPT all -- anywhere 10.101.0.0/16
MASQUERADE all -- 10.110.1.0/24 anywhere
MASQUERADE all -- 10.110.1.0/24 anywhere
MASQUERADE all -- 10.110.1.0/24 anywhere
Sooo,这是我的一个愚蠢的错误!机器 A 上的一切都设置正确,实际上是机器 B 的防火墙规则阻止了这一点。机器 B 有一条允许来自 的流量的规则,
10.101.3.2
但缺少允许来自 的流量的规则10.110.1.0/24
。添加该规则更正了该问题。我使用以下方法发现了
tcpdump
问题nc
:10.100.10.50
我执行nc -kl 60321
侦听端口 60321 上的连接时(我选择了一个我知道我们运行的服务没有使用的随机端口,以最大程度地减少噪音tcpdump
)tcpdump -s0 -X -i $dev port 60321
,我设置$dev
为 NAT'ed 网络的接口(vmbr0
或vmx0
)或 ptp 接口(tun0
)10.110.1.2
我发送数据以10.100.10.50
使用:echo -e "test1\ntest2\ntest3" | nc 10.100.10.50 60321
tun0
接口,但没有在机器 B 的 LAN 上,这意味着问题出在机器 B 上的路由/防火墙上