AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 932205
Accepted
Adrien Clerc
Adrien Clerc
Asked: 2018-09-23 13:16:06 +0800 CST2018-09-23 13:16:06 +0800 CST 2018-09-23 13:16:06 +0800 CST

带有防火墙标记和 `rp_filter` 的高级路由

  • 772

今天是路由日。您现在应该如何添加 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
linux
  • 1 1 个回答
  • 4317 Views

1 个回答

  • Voted
  1. Best Answer
    Adrien Clerc
    2018-09-23T13:16:06+08:002018-09-23T13:16:06+08:00

    为什么?

    在这两个片段之间,我改变了两件事:

    1. 我使用TOS IP 标头而不是防火墙标记,由内核及其模块在内部管理。
    2. 我标记了返回的数据包。

    我撒了谎(遗漏):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返回数据包。这是行不通的。经过几个小时挖掘旧邮件列表消息后,我找到了这个:

    好的,看看 fib_validate_source(),看起来 rp_filter 的工作原理只是内核接收数据包,反转 src & dst 地址和接口,并尝试进行路由查找。它在构建路由密钥时完全忽略了标记,但奇怪的是,它确实检查了 TOS。

    哦哦哦。所以我阅读了一些关于 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这是它的未来。例如,取自这里:

    iptables -A PREROUTING -t raw -m rpfilter --invert -j DROP
    ip6tables -A PREROUTING -t raw -m rpfilter --invert -j DROP
    

    它很好地集成在防火墙中,它可以工作,并且返回的数据包甚至不需要标记,因为它们是由它们的状态识别的。

    向内核开发人员报告此“错误”

    这对我来说似乎很不一致,而且记录得很糟糕。一方面,ip rule让您制定适用于传入数据包但不适用于返回数据包的规则:不当行为。

    但我在这里:我没有足够的时间来熟练地阅读这段代码、理解它并尝试修复它。而且我什至不知道是否有充分的理由,例如调用fib_validate_source.

    但是,如果这里有人告诉我可以将它报告给关心或解释,并可能修复和改进的人,我会很乐意这样做。

    编辑:也许rp_filter应该更新参数的文档......

    • 7

相关问题

  • Linux 主机到主机迁移

  • 如何在 Linux 机器上找到有关硬件的详细信息?

  • 如何在 Linux 下监控每个进程的网络 I/O 使用情况?

  • 在 RHEL4 上修改 CUPS 中的现有打印机设置

  • 为本地网络中的名称解析添加自定义 dns 条目

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve