Iptables:转发数据包不起作用

Iptables:转发数据包不起作用

我有 3 个 Linux 系统 A、B 和 C。A 是 TCP 客户端,并向 C 上的 TCP 服务器发送消息。A 只能看到 B 的外部 IP,即 wlan0 接口上的 192.168.0.3

------------------                ---------------------          --------------------------

  System A                         System B                      System C
  192.168.0.5 wlan0     <----->    192.168.0.3 wlan0                  
                                   192.168.61.73 eth0    <--->   192.168.61.81 eth0
  TCP Client                                                     TCP Server on 192.168.61.81
------------------               ----------------------          -------------------------

TCP 客户端向 192.168.0.3 发送消息。

这应该重定向到系统 C 的端口 8036 上 192.168.61.81 上运行的 TCP 服务器(通过 B 的 eth0 接口)。

因此,我编写了以下 IP 表规则,然后在 C 上启动服务器并从 A 上的 TCP 客户端发送消息。我可以在系统 B 上看到来自 wlan0 上的 A 的数据包,但它们从未被转发。系统 B 似乎正在接收来自 A 的 SYN 数据包,但将其丢弃(参见日志)。

这是我在系统 B 上所做的:

#Enable IP Forwarding for NAT
echo "1" > /proc/sys/net/ipv4/ip_forward

#Flush all iptable chains and start afresh
sudo iptables -F


#Forwarding rules

sudo iptables -A PREROUTING  -p tcp -m tcp -d 192.168.0.3 --dport 8036 -j DNAT --to-destination 192.168.61.81:8036

sudo iptables -A FORWARD -m state -p tcp -d 192.168.61.81 --dport 8036 --state NEW,ESTABLISHED,RELATED -j ACCEPT

sudo iptables -t nat -A POSTROUTING -p tcp -m tcp -s 192.168.61.81 --sport 8036 -j SNAT --to-source 192.168.0.3


#Enable logging
sudo iptables -A INPUT -j LOG --log-prefix INPUT
sudo iptables -A OUTPUT -j LOG --log-prefix OUTPUT
sudo iptables -A FORWARD -j LOG --log-prefix FORWARD

sudo iptables -A INPUT -j LOG --log-prefix 'drop:'
sudo iptables -A OUTPUT -j LOG --log-prefix 'drop:'
sudo iptables -A FORWARD -j LOG --log-prefix 'drop:'

tail -F /var/log/messages

系统 B 来自 /var/log/messages 的日志:(SYN 数据包被丢弃)

May  2 11:53:17 my-laptop kernel: [42879.905449] FORWARDIN=wlan0 OUT=eth0 SRC=192.168.0.5 DST=192.168.61.81 LEN=60 TOS=0x00 PREC=0x00 TTL=63 ID=30394 DF PROTO=TCP SPT=40582 DPT=8036 WINDOW=5840 RES=0x00 SYN URGP=0 

May  2 11:53:17 my-laptop kernel: [42879.905459] drop:IN=wlan0 OUT=eth0 SRC=192.168.0.5 DST=192.168.61.81 LEN=60 TOS=0x00 PREC=0x00 TTL=63 ID=30394 DF PROTO=TCP SPT=40582 DPT=8036 WINDOW=5840 RES=0x00 SYN URGP=0 

系统 B 上的内核 IP 路由表:

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.61.0    *               255.255.255.0   U     0      0        0 eth0
default         localhost       0.0.0.0         UG    0      0        0 eth0

请帮忙。

更新:

sudo iptables -L -n -v
Chain INPUT (policy ACCEPT 39844 packets, 25M bytes)
 pkts bytes target     prot opt in     out     source               destination         
26926   10M LOG        all  --  *      *       0.0.0.0/0            0.0.0.0/0           LOG flags 0 level 4 
12866 8559K LOG        all  --  *      *       0.0.0.0/0            0.0.0.0/0           LOG flags 0 level 4 prefix `INPUT' 
12862 8558K LOG        all  --  *      *       0.0.0.0/0            0.0.0.0/0           LOG flags 0 level 4 prefix `drop:' 

Chain FORWARD (policy ACCEPT 43 packets, 2580 bytes)
 pkts bytes target     prot opt in     out     source               destination         
   79  4740 ACCEPT     tcp  --  *      *       0.0.0.0/0            192.168.61.81       state NEW,RELATED,ESTABLISHED tcp dpt:8036 
   16   960 LOG        all  --  *      *       0.0.0.0/0            0.0.0.0/0           LOG flags 0 level 4 prefix `FORWARD' 
   16   960 LOG        all  --  *      *       0.0.0.0/0            0.0.0.0/0           LOG flags 0 level 4 prefix `drop:' 

Chain OUTPUT (policy ACCEPT 36130 packets, 4943K bytes)
 pkts bytes target     prot opt in     out     source               destination         
27863 4093K LOG        all  --  *      *       0.0.0.0/0            0.0.0.0/0           LOG flags 0 level 4 
14035 2296K LOG        all  --  *      *       0.0.0.0/0            0.0.0.0/0           LOG flags 0 level 4 prefix `OUTPUT' 
14034 2296K LOG        all  --  *      *       0.0.0.0/0            0.0.0.0/0           LOG flags 0 level 4 prefix `drop:' 


 sudo iptables -t nat -L -n -v
Chain PREROUTING (policy ACCEPT 252 packets, 63782 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    8   480 DNAT       tcp  --  *      *       0.0.0.0/0            192.168.0.3         tcp dpt:8036 to:192.168.61.81:8036 
  236 59206 LOG        all  --  *      *       0.0.0.0/0            0.0.0.0/0           LOG flags 0 level 4 

Chain OUTPUT (policy ACCEPT 3098 packets, 208K bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain POSTROUTING (policy ACCEPT 3121 packets, 210K bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 SNAT       tcp  --  *      *       192.168.61.81        0.0.0.0/0           tcp spt:8036 to:192.168.0.3 
 2975  199K LOG        all  --  *      *       0.0.0.0/0            0.0.0.0/0           LOG flags 0 level 4 

答案1

我发现我必须将系统 B 和系统 C 上的默认网关设置为 192.168.0.3,否则默认情况下 192.168.0.1(WLAN 路由器)被设置为默认路由。

一旦我设置了默认路线,一切都会顺利进行:)

答案2

我想说,对于一个简单的配置来说,配置很奇怪,不需要对 iptables、snat 等进行太多的干扰。在为 B 配置 ip 转发后,在 A 和 C 中设置静态路由以通过 B 到达彼此的网络就足够了。或者,如果您已经在本地网络中安装了路由器/网关,则可以直接在其中设置静态路由(尽管效率较低,因为通信数据包会再进行 2 次跳跃 - 到达路由器,然后到达 B)

相关内容