今天是路由日。您现在应该如何添加 IP 路由、基本使用以及对阅读本文ip rule
有很好的理解。iptables
这是在LinuxFr上交叉发布的(法语)。
问题
我有一个桥接模式的 ADSL 调制解调器(Freebox)和一个 DMZ 模式的光纤(Livebox)。除了选定的流量外,所有流量都通过 ADSL,另一流量通过光纤通道。这是我的设置,在相反的情况下,问题仍然是一样的。
为了缓解这个问题,我将讨论通过路由器、运行 Debian GNU/Linux 的流量,而不是该路由器产生的流量。
我的 ADSL 地址是 82.236.xxx.xxx,光纤是 90.76.xxx.xxx。
什么应该起作用
我们理所当然地认为mangle
这张桌子是空的。
> ip route show table livebox
default via 192.168.1.1 dev eth_livebox src 192.168.1.253
82.236.xxx.0/24 dev eth_adsl scope link src 82.236.xxx.xxx
192.168.0.0/24 dev bridge_local scope link src 192.168.0.253
192.168.1.0/24 dev eth_livebox scope link src 192.168.1.253
iptables -t mangle -I PREROUTING --destination 23.23.114.123 -j MARK --set-mark 1
ip rule add from all fwmark 0x1 lookup livebox
这是行不通的。这意味着当我这样做时
curl http://api.ipify.org/ --resolve api.ipify.org:80:23.23.114.123
从 LAN 客户端,不返回任何内容。
什么有效
表livebox
没有变化。然而,在刷新mangle
表之后,我们用这个填充它:
iptables -t mangle -I PREROUTING --source 23.23.114.123 -j TOS --set-tos 0x10
iptables -t mangle -I PREROUTING --destination 23.23.114.123 -j TOS --set-tos 0x10
ip rule add from all tos 0x10 lookup livebox
接着 :
> curl http://api.ipify.org/ --resolve api.ipify.org:80:23.23.114.123
90.76.xxx.xxx
为什么?
在这两个片段之间,我改变了两件事:
我撒了谎(遗漏):
rp_filter
我忘了说,在所有接口上,
rp_filter
都设置为 1。根据内核文档,值 1 代表RFC 3704中定义的严格反向路径检查。总而言之,当一个数据包进入接口时,内核交换IP 地址字段,
source
并destination
尝试路由这个新的假数据包。如果选择的路由通过数据包来自的接口出去,则检查正常。否则,数据包将被丢弃。因此,根据
What should work
,由于传入的数据包没有标记1
,因此严格的反向路径检查失败。确实,返回的数据包通过了eth_livebox
,但没有标记,它是根据main
表路由的,表中说通过eth_adsl
。这是一个失败。这就是更改编号的原因。2.为什么是 TOS 而不是 MARK ?
是的,当然,我尝试
-j MARK
返回数据包。这是行不通的。经过几个小时挖掘旧邮件列表消息后,我找到了这个:哦哦哦。所以我阅读了一些关于 TOS 的文档,因为我仍在寻找解决方案,所以我做的又快又脏。有用。这就是更改编号的原因。2.
可以更好吗?
我让你检查代码
fib_validate_source()
。老实说,这对我来说太重了。但在我看来,结果是不一致的。我知道它
TOS
在IP
标题内部,并且防火墙标记特定于主机内部。另一方面ip rule
,有一种语法可以在TOS
标头值或防火墙标记值上查找路由fwmark
。我不知道我现在真的应该做什么,这是我的结论,非排他性的。
放弃
rp_filter
公共接口的目标
rp_filter
是避免 DDoS,而且还可以过滤直接在我自己的托管网络中伪造数据包的流氓客户端。它有点像SPF,它保护其他参与者。在我的公共接口上,我显然有一个类似的路由条目
default via IP
,所以无论如何,rp_filter
都会得出可以回答数据包的结论。事实上,如果一个数据包到达我的路由器之前,那是因为我的 ISP 让它通过了。他们设法将其路由。所以我可以放弃并
rp_filter
在所有这些接口上设置为 0(警告:应用 net.ipv4.conf.eth_livebox.rp_filter 和 net.ipv4.conf.all.rp_filter 之间的最大值)。编辑:用户
rpfilter
来自iptables
LinuxFR 上的某个人引起了我的注意:该控件
rp_filter
已弃用,或者至少处于废弃状态。确实有一个rpfilter
模块,iptables
这是它的未来。例如,取自这里:它很好地集成在防火墙中,它可以工作,并且返回的数据包甚至不需要标记,因为它们是由它们的状态识别的。
向内核开发人员报告此“错误”
这对我来说似乎很不一致,而且记录得很糟糕。一方面,
ip rule
让您制定适用于传入数据包但不适用于返回数据包的规则:不当行为。但我在这里:我没有足够的时间来熟练地阅读这段代码、理解它并尝试修复它。而且我什至不知道是否有充分的理由,例如调用
fib_validate_source
.但是,如果这里有人告诉我可以将它报告给关心或解释,并可能修复和改进的人,我会很乐意这样做。
编辑:也许
rp_filter
应该更新参数的文档......