我怎样才能让 iptables 正确使用隧道而不是 NAT?

我怎样才能让 iptables 正确使用隧道而不是 NAT?

我有两个通过点对点隧道连接的 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如下所示:

  1. 10.100.10.50执行了nc -kl 60321监听 60321 端口的连接(我选择了一个我知道没有被我们运行的服务使用的随机端口,以尽量减少噪音tcpdump
  2. 在机器 A 和 BI 上执行tcpdump -s0 -X -i $dev port 60321,我将其设置$dev为 NAT 网络接口(vmbr0vmx0)或 ptp 接口(tun0
  3. 我使用以下方式10.110.1.2发送数据10.100.10.50echo -e "test1\ntest2\ntest3" | nc 10.100.10.50 60321
  4. 我看到了机器 A 的 LAN 上的流量,包括机器 A 和 B 的tun0接口,但是不是在机器 B 的 LAN 上,这意味着问题出在机器 B 上的路由/防火墙上
  5. 我捂住脸,添加了缺失的防火墙规则

相关内容