我有两个通过点对点隧道连接的 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
和一个10.110.1.1
上的私有 IP vmbr0
,并通过 ptp VPN 在互联网上与机器 B 相连,机器 B 有一个 上的公有 IPen0
和一个 上的私有 IP en1
(以及许多其他私有网络)
两个 LAN 上的客户端都使用具有两个公共 IP 的 NAT。这很好用。(这是在机器 A 上使用 iptables 并在机器 B 上使用 pfSense 完成的)
设置路由,使机器 A 可以 ping 通机器 B 的私有 IP10.100.1.1
和可以访问网络 B 上的所有主机10.100.0.0/16
。同样,机器 B(和所有主机在网络 B 上)可以访问计算机 A,以及网络 A 上的所有主机10.110.1.0/16
但是,网络 A 上的主机无法与网络 B 上的主机建立连接(例如,10.110.1.2
无法 ping 或通过 SSH 连接到10.100.10.50
)
我怀疑这与 A 上的 iptables 设置有关,因为 SSH从 10.100.10.50
可以10.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
答案1
太棒了,这是我犯的一个愚蠢的错误!机器 A 上的所有东西曾是如果设置正确,实际上是计算机 B 的防火墙规则阻止了此行为。计算机 B 有一条规则允许来自以下来源的流量,10.101.3.2
但丢失的允许来自 的流量的规则10.110.1.0/24
。添加该规则可解决问题。
tcpdump
我在使用和时发现了问题,nc
如下所示:
- 我
10.100.10.50
执行了nc -kl 60321
监听 60321 端口的连接(我选择了一个我知道没有被我们运行的服务使用的随机端口,以尽量减少噪音tcpdump
) - 在机器 A 和 BI 上执行
tcpdump -s0 -X -i $dev port 60321
,我将其设置$dev
为 NAT 网络接口(vmbr0
或vmx0
)或 ptp 接口(tun0
) - 我使用以下方式
10.110.1.2
发送数据10.100.10.50
:echo -e "test1\ntest2\ntest3" | nc 10.100.10.50 60321
- 我看到了机器 A 的 LAN 上的流量,包括机器 A 和 B 的
tun0
接口,但是不是在机器 B 的 LAN 上,这意味着问题出在机器 B 上的路由/防火墙上 - 我捂住脸,添加了缺失的防火墙规则