使用 iptables 作为路由器

使用 iptables 作为路由器

我有以下设置:

设置示意图

client: 
192.168.103.55                

"router"  
192.168.103.30 (eth3), 192.168.102.30 (eth2) 

server-1                   server-2
192.168.102.21 (eth2)      192.168.102.22 (eth2)

路由器实际上是一台小型Linux机器,运行iptables。

目标是以这样的方式配置 iptables,以便我可以通过路由器(服务器端为 192.168.102.30,客户端为 192.168.103.30)从服务器(192.168.102.21 和 .22)ping 到客户端(192.168.103.55)

服务器的路由配置如下:

192.168.103.55 via 192.168.102.30 dev eth2 

在路由器上,我在 IP 表中配置了以下规则:

*filter
:INPUT ACCEPT [1610193:248234329]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [1945999:238163662]
-A FORWARD -i eth3 -j ACCEPT
-A FORWARD -o eth3 -j ACCEPT
-A FORWARD -i eth2 -j ACCEPT
-A FORWARD -o eth2 -j ACCEPT
COMMIT
# Completed on Wed May  2 08:26:55 2018
# Generated by iptables-save v1.4.21 on Wed May  2 08:26:55 2018
*nat
:PREROUTING ACCEPT [5610:715368]
:INPUT ACCEPT [2029:121740]
:OUTPUT ACCEPT [326029:19788110]
:POSTROUTING ACCEPT [326029:19788110]
-A POSTROUTING -d 192.168.103.55/32 -o eth3 -j SNAT --to-source 192.168.103.30
COMMIT

来自 192.168.102.21 的 ping 到达客户端 (192.168.103.55),客户端向 192.168.103.30 发送回复。但回复未转发给客户端 (.55)。它卡在路由器中

我在这里遗漏了什么?

在此先感谢您的时间!

=================== 更新 =====================

Guntbert 建议转发已经完成。

需要 SNAT 规则才能让路由器知道将 ICMP 回复路由回哪个服务器。在我的第一个解释中,我忽略了第二个服务器。我现在更新了问题,以便为您提供完整的概述。

SNAT 似乎以某种方式工作,因为我可以看到 ICMP 回复数据包发送到正确的服务器:

[router ~]# tcpdump -ni eth2 icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth2, link-type EN10MB (Ethernet), capture size 65535 bytes

08:38:26.110245 IP 192.168.102.21 > 192.168.103.55: ICMP echo request, id 4471, seq 1, length 64
08:38:26.112722 IP 192.168.103.55 > 192.168.102.21: ICMP echo reply, id 4471, seq 1, length 64

08:39:53.238281 IP 192.168.102.22 > 192.168.103.55: ICMP echo request, id 8285, seq 1, length 64
08:39:53.239110 IP 192.168.103.55 > 192.168.102.22: ICMP echo reply, id 8285, seq 1, length 64

我认为接下来应该发生的事情是,回复中的源 IP(192.168.103.55)需要替换为路由器的 IP(192.168.102.30)。还是我错了?

答案1

  1. 您需要在内核中启用数据包转发

    • 编辑/etc/sysctl.conf并激活该行

      net.ipv4.ip_forward=1
      

      通过删除#开头的。

    • 重新启动或立即启用设置

      echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
      
  2. 不要使用 SNAT(实际上不要使用任何类型的 NAT根本)。您有两个网络,路由器连接到这两个网络(它在两个网络中都有分支)。因此,删除iptables-rules 中的第 3 行。

    • 从路由器中删除 NAT 规则
    • 配置所有系统通过路由器访问“其他”网络
      • 在服务器上用以下内容替换你的路线
        192.168.103.0/24 via 192.168.102.30 dev eth2
        (这告诉他们如何到达整个网络,而不仅仅是一个客户端)
      • 在客户端添加以下路由
        192.168.102.0/24 via 192.168.103.30 dev eth0

现在您将看到来自两个服务器的每个数据包都将通过原始源地址到达客户端。客户端知道如何到达该源地址,并且可以向执行 ping 操作的服务器发送回复。

相关内容