在与接收人相同的界面上回复吗?


50

我有一个带有两个接口的系统。两个接口都连接到互联网。其中之一被设置为默认路由。这样做的副作用是,如果数据包从非默认路由接口进入,则答复将通过默认路由接口发回。有没有一种方法可以使用iptables(或其他方法)来跟踪连接并通过它来自的接口将回复发送回去?

Answers:


60
echo 200 isp2 >> /etc/iproute2/rt_tables
ip rule add from <interface_IP> dev <interface> table isp2
ip route add default via <gateway_IP> dev <interface> table isp2

上面不需要使用ipfilter标记任何数据包。之所以起作用,是因为传出(回复)数据包将具有最初用于连接到第二个接口的IP地址作为传出数据包上的源(来自)地址。


7
哇,这正是我想要的。如果有人在寻找基于RH的发行版,则可以将相关的rule和route命令放在名为'rule-eth0'或'route-eth0'的文件中(例如),这些文件将在ifup / ifdown上添加或删除。将这些文件放在ifcfg-eth0文件旁边。对于IPv6,内置了“ route6-eth0”功能,但还没有内置“ rule6-eth0”。
凯尔·布​​兰特利

18
对我来说,仅当我devip rule命令中省略参数时,它才起作用,所以运行ip rule add from <interface_IP> table isp2
cdauth

2
您可以通过在相关接口下的/ etc / network / interfaces中添加up ip rule add from <interface_IP> table isp2并将up ip route add default via <gateway_IP> dev ppp0 table isp2其添加到接口启动时创建它们。
g.rocket '16

4
我不得不删除dev <interface>ip rule得到它在我的箱子工作。如果我理解正确的话,dev <interface>就是过滤掉以某种方式设置在错误接口上的数据包,这些数据包需要通过被覆盖的路由争夺到正确的接口,但是按接口进行规则过滤可以阻止这种情况的发生。
宾基

2
像大多数其他人一样,我必须dev <interface>ip rule命令中删除该命令才能起作用。请更新答案!除了那个细节,它就像一个魅力。非常感谢@Peter!
MoonSweep '18

6

以下命令eth1为标记为1的数据包(到达localhost的数据包除外)创建备用路由表。的ip命令是从所述iproute2的套件(Ubuntu的:iproute 安装iproute http://bit.ly/software-smalliproute-doc的 安装iproute-doc的http://bit.ly/software-small)。

ip rule add fwmark 1 table 1
ip route add 127.0.0.0/0 table 1 dev lo
ip route add 0.0.0.0/0 table 1 dev eth1

另一半是识别必须获得标记1的数据包;然后iptables -t mangle -A OUTPUT … -j MARK --set-mark 1在这些数据包上使用它们,使其通过路由表1进行路由。我认为,应该执行以下操作(将1.2.3.4替换为非默认路由接口的地址):

iptables -t mangle -A OUTPUT -m conntrack --ctorigdst 1.2.3.4 -j MARK --set-mark 1

我不确定是否足够,传入的数据包可能需要另一个规则来告诉conntrack模块跟踪它们。


真好 我忘记了标记。那应该让我到那里。
肖恩·高夫

5

Peter建议的解决方案对本地生成的数据包有问题,我发现以下内容可以纠正此问题:

echo 200 isp2 >> /etc/iproute2/rt_tables
ip rule add from <interface_IP> table isp2 priority 900
ip rule add from dev <interface> table isp2 priority 1000
ip route add default via <gateway_IP> dev <interface> table isp2
ip route add <interface_prefix> dev <interface> proto static scope link src <interface_IP> table isp2

注意:您可能在上面的第四行遇到语法问题。在这种情况下,第四个命令的语法现在可能是这样:

ip rule add iif <interface> table isp2 priority 1000

尝试了很多,但是在我的情况下没有任何效果,除了这个。
agaggi's

3

我假设您正在运行Linux,并且进一步,您正在使用基于RedHat / CentOS的发行版。其他Unix和发行版将需要类似的步骤-但细节会有所不同。


从测试开始(请注意,这与@Peter的答案非常相似。我假设以下内容:

  • eno0是isp0,并且具有总体默认网关
  • eno1是isp1并具有IP /范围192.168.1.2/24和网关192.168.1.1

命令如下:

$ echo 200 isp1 >> /etc/iproute2/rt_tables
$ ip rule add from eno1 table isp1
$ ip route add default via 192.168.1.1 dev eno1 table isp1

防火墙不参与任何形式。答复数据包始终是从正确的IP发送的-但以前是通过错误的接口发送的。现在,来自正确IP的这些数据包将通过正确的接口发送。


假设上述工作正常,您现在可以使规则和路由更改永久生效。这取决于您使用的Unix版本。和以前一样,我假设基于RH / CentOS的Linux发行版。

$ echo "from eno1 table isp1" > /etc/sysconfig/network-scripts/rule-eno1
$ echo "default via 192.168.1.1 dev eno1 table isp1" > /etc/sysconfig/network-scripts/route-eno1

测试网络更改是否为永久更改:

$ ifdown eno1 ; ifup eno1

如果这不起作用,则在更高版本的RH / CentOS上,您还需要使用以下两个选项之一:

  • 不要使用默认的NetworkManager.service;请改用network.service。我还没有探索所需的确切步骤。我可以想象它涉及标准的chkconfigsystemctl命令来启用/禁用服务。
  • 安装NetworkManager-dispatcher-routing-rules程序包

我个人更喜欢安装rules软件包,因为它是更简单,更受支持的方法:

$ yum install NetworkManager-dispatcher-routing-rules

另一个强烈的建议是启用arp过滤,因为这可以防止双网络配置出现其他相关问题。使用RH / CentOS,将以下内容添加到/etc/sysctl.conf文件中:

net.ipv4.conf.default.arp_filter=1
net.ipv4.conf.all.arp_filter=1
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.