iptables 在两个接口之间转发流量

iptables 在两个接口之间转发流量

我的设置如下(在同一主机上):

  • 网络接口卡 (NIC) eth0,静态 IP 为 192.168.1.10
  • 为 NIC eth0:0 添加标签,静态 IP 为 192.168.1.11
  • virbr0 上位于 192.168.122.11 的虚拟机(使用 KVM)

我可以使用其 IP 192.168.122.11 从主机通过 SSH 连接客户机,也可以使用其 IP 192.168.1.10 从 LAN 网络上的远程机器通过 SSH 连接主机。

我想让虚拟客户机能够通过标记的 NIC 从 LAN 访问,以便我可以通过从远程机器连接到 192.168.1.11 来通过 SSH 进入 192.168.122.11。

+--------------+
| Machine Ext2 |
+--------------+
       | ssh to 192.168.1.11:2222
       |
   +--------+
   | Router |
   +--------+
       |
       | (192.168.1.11:2222)
+----------------------------------------------+
| Machine Ext1 (Host)                          |
| <--> iptables <--> Guest (192.168.122.11:22) |
+----------------------------------------------+

我从网上的不同教程中获得了很多启发(看起来都差不多),但没有任何效果,我也无法找到正确的设置。

其想法是使用 iptables 创建 PREROUTING、FORWARD 和 POSTROUTING 规则,以便正确重定向传入和传出的流量。

我编辑了 /etc/sysctl.conf 以便 ip_fordward=1 并运行以下 iptables 命令:

$ sudo iptables -t nat -A PREROUTING -i virbr0 -p tcp -d 192.168.1.11 --dport 2222 -j DNAT --to-destination 192.168.122.11:22
$ sudo iptables -A FORWARD -p tcp -d 192.168.122.11 --dport 22 -j ACCEPT
$ sudo iptables -t nat -A POSTROUTING -o virbr0 -p tcp -d 192.168.122.11 -j ACCEPT

ping 192.168.1.11 仍可正常工作。但连接 192.168.1.11:2222 失败:

$ telnet 192.168.1.11 2222
$ telnet: Unable to connect to remote host: Connection refused

我觉得我快要完成它了,但是错过了一些东西......你能给我一点帮助吗?

此致,

答案1

  • 您的第一条规则是使用-i virbr0。如果它应该从 LAN 使用,那应该是-i eth0并且很可能是您的问题。
  • 如果您的默认 FORWARD 策略是 ACCEPT,那么您的第二条规则就毫无用处了。如果是 DROP,那么您需要在 FORWARD 中添加另一条规则来允许反向路径流。您能给出完整的 iptables 规则集吗:iptables-save -c
  • 您的第三条规则毫无用处。nat 表不需要任何显式 ACCEPT。反向流始终是正确的(使用 conntrack),因为它是有状态的。删除它。
  • 测试时,请务必从 LAN(其他系统)进行测试,而不是从主机进行测试(从主机本身进行测试不会使用 PREROUTING 或 FORWARDING,而是使用 nat 的 OUTPUT 和过滤器的 OUTPUT,因此至少需要其他 nat 规则)

相关内容