iptables:标记的数据包未通过配置的路由进行路由

iptables:标记的数据包未通过配置的路由进行路由

我需要配置一台防火墙服务器,该服务器有两条互联网线路(A 在 eth1 上,B 在 eth0 上)和一个内部网络(C 在 eth2 上)。除了默认路由表(通过 A / eth1)外,我还有两个路由表,每个路由表都有自己的默认网关。

我可以按预期通过互联网线路 A 和端口 22 上的 SSH 访问服务器。但是当我尝试通过互联网线路 B 访问它时,返回的 tcp/ip 数据包是通过互联网线路 A 发送的。

具有两个互联网连接的防火墙

显然,当我通过网络线路B连接到服务器时,我希望它通过网络线路B进行回复。

我怎样才能实现这个目标?


我目前尝试过的方法:我配置了 sshd,让它监听第二个端口 (122)。然后我添加了一个

#!/bin/bash

iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X
ip rule add from all fwmark 1 table 2

ip route flush cache
iptables -A OUTPUT -p tcp --sport 122 -j LOG
iptables -A OUTPUT -t mangle -p tcp --sport 122 -j MARK --set-mark 1

现在,我可以通过互联网线路 B 连接到服务器,但答案被记录为通过互联网线路 A 返回。


到目前为止我还尝试过:

我可以控制来自内部网络 C 中其他计算机的流量通过互联网线路 A 或 B 发送 - 只需在预路由表中标记它们的数据包即可:

$A -t mangle -A PREROUTING -p tcp --dport 80 -s 192.168.0.0/24 -j MARK --set-mark 2

效果很好。

答案1

您的设置需要使用 PBR(基于策略的路由)。您正在使用它,但尚未完成。您可以通过两种方式解决问题:

  • 简单方法:只需为每个上行链路添加两条规则,如ip rule add from <srv-IP-A> table <tbl-A> pref 1001ip rule add from <src-IP-B> table <tbl-B> pref 1002,其中AB是对应的链路。它只适用于来自服务器本身的流量,因为它总是从初始连接请求接收的相同 IP 地址回复。

  • 困难方法:使用CONNMARK目标。它适用于所有情况。逻辑:conntrack 条目与连接相关联,并且可能在其内部包含附加值。您可以将此值克隆到防火墙标记中/从防火墙标记中克隆,并在 iptables 规则中使用匹配。

相关内容