我有 3 个接口(2 个 wan,1 个本地)并启用了转发,但只有一个传入接口(ppp0)可以到达本地目的地,以下是我的 iptable 命令:
iptables -t nat -A PREROUTING -i ppp0 -p tcp -m multiport --destination-ports 80,443 -j DNAT --to 10.66.66.253
iptables -t nat -A PREROUTING -i eth1 -p tcp -m multiport --destination-ports 80,443 -j DNAT --to 10.66.66.253
############
我怎样才能让 eth1 进入目的地?
这是我的 IP 规则和 rt_tables:
root@net:~# ip rule
0: from all lookup local
32762: from all fwmark 0x2 lookup int0.out
32763: from all fwmark 0x1 lookup ext0.out
32764: from all to 61.x.x.x lookup ext0.out
32765: from 61.x.x.x lookup ext0.out
32766: from all lookup main
32767: from all lookup default
root@net:~# ip route show table int0.out
default via 168.x.x.254 dev ppp0
10.66.66.0/24 dev eth2 scope link src 10.66.66.254
root@net:~# ip route show table ext0.out
default via 61.x.x.254 dev eth1
10.66.66.0/24 dev eth2 scope link src 10.66.66.254
我错过了什么(明白吗)?
谢谢你的帮助!
答案1
您应该在防火墙规则集中使用 connmark 目标,使回复通过与接收原始数据包相同的接口。在当前配置中,即使数据包已在接口上接收eth1
并进行了 DNAT,回复也会通过默认路由进行路由,因为尚未设置防火墙标记。
我明白了,您已经为防火墙标记的路由创建了附加规则。那么让我们使用它:
# set mark of the original redirected packets
iptables -t mangle -A PREROUTING -i eth1 -j MARK --set-mark 0x1
iptables -t mangle -A PREROUTING -i ppp0 -j MARK --set-mark 0x2
# save the firewall mark inside the conntrack entry (once for new connection)
iptables -t mangle -A POSTROUTING \
-o eth2 -m conntrack --ctstate NEW \
-j CONNMARK --save-mark
# for replies restore the firewall mark from conntrack entry
# to route replies through right interface
iptables -t mangle -A PREROUTING -i eth2 \
-j CONNMARK --restore-mark
您可以使用附加匹配来改进这些规则。您甚至可以避免使用 CONNMARK 而仅使用-m conntrack --ctstate DNAT --ctdir REPLY --ctorigdst ...
匹配。
还要检查 rp 过滤器并将其设置为loose
模式sysctl
。
要解决问题,请检查规则计数器(iptables-save -c
命令)、列出 conntrack 表(conntrack -L
命令)并运行 tcpdump。