我如何让iptables正确使用隧道而不是NAT?

我有两个通过点对点隧道连接的NATnetworking,如下所示:

| 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在eth0上有一个公共IP,在vmbr0上有一个私有IP 10.110.1.1 ,通过一个ptp VPN与机器B连接,机器B在en0上有一个公共IP,在en1上有一个私有IP其他专用networking)

在两个公用IP上使用NAT的两个局域网上都有客户端。 这工作正常。 (它使用机器A上的iptables和机器B上的pfSense完成)

路由设置使得机器A可以ping机器B的私有IP 10.100.1.1 并且可以访问networkingB 10.100.0.0/16上的所有主机。 同样,机器B(以及networkingB上的所有主机 )可以访问机器A以及networkingA 10.110.1.0/16上的所有主机

但是,networkingA上的主机无法与networkingB上的主机build立连接(EG 10.110.1.2无法ping通,也无法通过SSH连接到10.100.10.50

怀疑这与A上的iptables安装有关,因为 10.100.10.5010.110.1.2 SSH都能正常工作,但是我不能以相反的方向进行SSH安装。 这对我说,我的iptables FILTER规则RELATED,ESTABLISHED作品,但不知何故,我怀疑机器A试图NAT和使用eth0新的连接。

我添加了ACCEPT destination 10.100.0.0/16 iptables规则到处都是我认为他们需要的,然后即使在我认为不需要的地方,当事情不起作用,仍然无法从networkingA传出连接到networkingB工作。

如何通过使用iptables的点对点隧道来正确连接两个NAT的专用networking?


附加信息:

机器上的iptables A:

 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.2stream量,但是缺less允许来自10.110.1.0/24stream量的规则。 添加该规则纠正了这个问题。


我使用tcpdumpnc发现了这个问题,如下所示:

  1. 10.100.10.50我执行了nc -kl 60321来侦听端口60321上的连接(我select了一个随机的端口,我知道这个端口并没有被我们运行的服务使用,以便尽量减lesstcpdump噪声)
  2. 在机器A和BI上执行tcpdump -s0 -X -i $dev port 60321其中我将$dev设置$dev NAT'ednetworking接口( vmbr0vmx0 )或ptp接口( tun0
  3. 10.110.1.2我发送数据到10.100.10.50使用: echo -e "test1\ntest2\ntest3" | nc 10.100.10.50 60321 echo -e "test1\ntest2\ntest3" | nc 10.100.10.50 60321
  4. 我看到机器A的局域网上的stream量,包括机器A和B的tun0接口,而不是机器B的局域网,所以这意味着问题是机器B上的路由/防火墙
  5. 我facepalmed并添加了缺less的防火墙规则