根据目的端口在不同接口上输出流量

根据目的端口在不同接口上输出流量

我的问题基本上与仅允许某些接口上的某些出站流量

我有两个接口eth1(10.0.0.2)和wlan0(192.168.0.2)。我的默认路线是eth1.假设我希望所有 https 流量都通过wlan0。现在,如果我使用另一个问题中建议的解决方案,https 流量将通过wlan0,但仍然具有 (10.0.0.2) 的源地址eth1。由于网关无法路由该地址wlan0,因此永远不会返回答案。最简单的方法是在应用程序中正确设置绑定地址,但在这种情况下它不适用。

我想我需要重写 src-addr:

# first mark it so that iproute can route it through wlan0
iptables -A OUTPUT -t mangle -o eth1 -p tcp --dport 443 -j MARK --set-mark 1
# now rewrite the src-addr
iptables -A POSTROUTING -t nat -o wlan0 -p tcp --dport 443 -j SNAT --to 192.168.0.2

现在 tcpdump 看到传出数据包很好,传入数据包到达 192.168.0.2,但是它们可能永远不会在应用程序中结束,因为我所看到的只是应用程序正在重新发送 SYN 数据包,尽管 SYN- ACK 已收到。

所以我想,也许我也需要重写传入地址:

iptables -A PREROUTING -t nat -i wlan0 -p tcp --sport 443 -j DNAT --to 10.0.0.2

但这也不起作用。所以我有点被困在这里了。有什么建议么?

答案1

你很接近了。

应用程序看不到返回流量的实际原因是内核内置的 IP 欺骗保护。即,返回流量与路由表不匹配,因此被丢弃。您可以通过关闭欺骗保护来解决此问题,如下所示:

sudo sysctl net.ipv4.conf.wlan0.rp_filter=0

但我不会推荐它。更合适的方法是创建备用路由实例。

  1. 标记是必要的。收下。
  2. 源NAT也是必要的。
  3. 最后的 DNAT 是不必要的,因此您可以将其删除。

确保您已iproute安装该软件包。如果你有这个ip命令,那么你就已经设置好了(看起来你已经这样做了,但如果没有先得到它)。

/etc/iproute2/rt_tables通过附加以下行来编辑并添加新表:

200 wlan-route

然后,您需要配置wlan-route以默认网关命名的新路由表,并创建规则以有条件地将流量发送到该表。我假设您的默认网关是 192.168.0.1。当然,这需要与您的实际网络相匹配,而不仅仅是我的假设。

ip route add default via 192.168.0.1 dev wlan0 table wlan-route
ip rule add fwmark 0x1 table wlan-route

最终的带注释的脚本将如下所示:

# Populate secondary routing table
ip route add default via 192.168.0.1 dev wlan0 table wlan-route
# Anything with this fwmark will use the secondary routing table
ip rule add fwmark 0x1 table wlan-route
# Mark these packets so that iproute can route it through wlan-route
iptables -A OUTPUT -t mangle -o eth1 -p tcp --dport 443 -j MARK --set-mark 1
# now rewrite the src-addr
iptables -A POSTROUTING -t nat -o wlan0 -p tcp --dport 443 -j SNAT --to 192.168.0.2

答案2

巴哈马特的解决方案是正确的;但是,请注意,我完成这项工作的唯一方法是禁用系统中每个接口的 rp_filter,而不仅仅是 NAT 中涉及的两个接口(本例中为 eth1 和 wlan0)。

for f in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 0 > $f; done
echo 1 > /proc/sys/net/ipv4/route/flush

(请参阅本页末尾的重要说明:高级路由指南-- 那里发布的链接不再存在,但我通过回程机找到了它)

答案3

一个建议:您应该始终使用--sport而不是--dport在输出链中。

NAT 会改变dport,这将使您的规则变得不可用。

答案4

我尝试做类似的事情。我有两个接口 wwan0(公制 700)和 eth0(公制 100)。我希望所有 https (443) 流量都通过 wwan0。我按照上面发布的示例进行操作,它适用于前几个数据包,然后我开始看到 FIN-WAIT-1 状态,然后它停止工作,FIN-WAIT-1 列表变得更大。不知道发生了什么。系统启动并开始向 eth0 发送一些 443 流量,然后我运行脚本,流量转到 wwan0,但在几百个数据包之后,有些东西饱和了,并且不断给出 FIN-WAIT-1。

我设置如下:

ip route add default dev wwan0 table wwan-route
ip rule add fwmark 0x1 table wwan-route
iptables -A OUTPUT -t mangle -p tcp --dport 443 -j MARK --set-mark 1
nft add table nat
nft add chain nat post { type nat hook postrouting priority 0 \; }
nft add rule ip nat post oifname wwan0 tcp dport 443 masquerade

路由表:

default via 192.168.1.1 dev eth0 proto dhcp metric 100 
default via 10.5.1.101 dev wwan0 proto static metric 700 
10.5.1.96/29 dev wwan0 proto kernel scope link src 10.5.1.100 metric 700 
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.127 metric 100 

所有 ip 路由显示表全部:

# ip route show table all
default via 192.168.1.1 dev eth0 table eth0rule 
default dev wwan0 table wwan-route scope link 
default via 192.168.1.1 dev eth0 proto dhcp metric 100 
default via 10.5.1.101 dev wwan0 proto static metric 700 
10.5.1.96/29 dev wwan0 proto kernel scope link src 10.5.1.100 metric 700 
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.127 metric 100 
broadcast 10.5.1.96 dev wwan0 table local proto kernel scope link src 10.5.1.100 
local 10.5.1.100 dev wwan0 table local proto kernel scope host src 10.5.1.100 
broadcast 10.5.1.103 dev wwan0 table local proto kernel scope link src 10.5.1.100 
broadcast 127.0.0.0 dev lo table local proto kernel scope link src 127.0.0.1 
local 127.0.0.0/8 dev lo table local proto kernel scope host src 127.0.0.1 
local 127.0.0.1 dev lo table local proto kernel scope host src 127.0.0.1 
broadcast 127.255.255.255 dev lo table local proto kernel scope link src 127.0.0.1 
broadcast 192.168.1.0 dev eth0 table local proto kernel scope link src 192.168.1.127 
local 192.168.1.127 dev eth0 table local proto kernel scope host src 192.168.1.127 
broadcast 192.168.1.255 dev eth0 table local proto kernel scope link src 192.168.1.127 

ip规则:

 ip rule
0:      from all lookup local
0:      from all fwmark 0x1 lookup wwan-route
1:      from 192.168.1.127 lookup eth0rule
32766:  from all lookup main
32767:  from all lookup default

和:

cat /etc/iproute2/rt_tables 
#
# reserved values
#
255     local
254     main
253     default
0       unspec
#
# local
#
#1      inr.ruhep
210 wwan-route
200 eth0rule

已经快到了,但还缺少一些东西。

相关内容