我看到了非常奇怪的 iptables 日志记录规则(在我看来),我在网上找不到答案/解释。
我的Linux服务器上有以下接口:
- ens3 with public IP XX.XX.XX.XXX
- ppp0 with public IP YY.YY.YY.YYY which is my VPN IP
现在我在 iptables-logging 中看到了这条规则,它删除了使用该接口的传出连接ppp0
,但该ens3
IP 是该数据包的源 IP。
Oct 11 16:42:10 ubuntu kernel: [70339.663030] Firewall dropped IPv4: IN= OUT=ppp0 SRC=XX.XX.XX.XXX DST={REMOVED} LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=0 DF PROTO=TCP SPT= 41800 DPT=41891 WINDOW=64296 RES=0x00 ACK SYN URGP=0
这怎么可能?我预计服务器会使用接口ens3
或ppp0
相应接口的 IP?
因此,在这种特殊情况下,我希望源 IP 与接口ppp0
公共 IP 匹配,即YY.YY.YY.YYY
答案1
常规 IP 路由(在 Linux 和大多数其他系统上)完全基于目标地址,而不是源地址。尽管 Linux 上的路由表具有影响源地址的属性选择(当软件没有请求任何特定地址时),路由不会匹配无论选择了什么源地址,都只能针对目标地址。1
因此,如果您有一个专门绑定到 XX.XX.XX.XXX 的程序,它的出站数据包仍然会顺利地遵循 VPN 路由“ default dev ppp0
”,因为您的 VPN 客户端已将其设置为比通过 eth0 的旧默认路由具有更高的优先级。
更常见的是,如果你收到公共 XX.XX.XX.XXX 地址的数据包,您的机器发送的任何回复当然都会以 XX.XX.XX.XXX 作为来源 - 但这不会影响它们遵循的路由;仍将选择优先级较高的 VPN 路由。
一些其他操作系统会更智能,根据源地址选择多个同等优先级的路由,例如,当从以太网地址回复时,它们会优先选择通过 eth0 的路由,但 Linux 不会自动执行此操作 - 它是可能的进行设置,但您必须摆弄 iptables fwmarks 和ip rule
基于策略的路由规则(已在旧线程中介绍过)。
1 Linux 确实支持(源、目标)上的匹配路由,但仅限于 IPv6。