使用 fwmark 和策略路由时,传出 TCP 连接不会出现“无法访问”响应

使用 fwmark 和策略路由时,传出 TCP 连接不会出现“无法访问”响应

我想路由本地生成的流量:

  • 通过接口“A”到主机“H”的 TCP 端口“A”,
  • 经由接口“B”到主机“H”的TCP端口“B”。

接口“B”有时不可用。然后,如果用户尝试连接到 TCP 端口“B”,我希望内核通知用户“网络无法访问”错误。

我尝试了以下设置(当接口“B”关闭时):

# iptables -t mangle -nvL OUTPUT
Chain OUTPUT (policy ACCEPT 2 packets, 120 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    2   120 MARK       all  --  *      *       0.0.0.0/0            host-H-ip         MARK set 0x64

(为简单起见,该规则尚不包括端口)

# ip rule
0:      from all lookup local 
32765:  from all fwmark 0x64 lookup 200 
32766:  from all lookup main 
32767:  from all lookup default
# ip route show table 200
prohibit default

当接口“B”可用并且 200 表包含常规路由规则时,这并不奇怪。

但是,当接口“B”不可用时,我仅对 ICMP 和 UDP 获得满意的结果:

$ ping host-H-ip
PING host-H-ip (host-H-ip) 56(84) bytes of data.
ping: sendmsg: Network is unreachable

$ nc -nuv host-H-ip 5000
(UNKNOWN) [host-H-ip] 5000 (?) open
foo
too many output retries : Network is unreachable

对于 TCP 它只是挂起:

$ nc -nv host-H-ip 5000

我发现了一些似乎与该主题相关的线程:

不幸的是,我仍然不明白为什么我也没有得到 TCP 的“网络无法访问”。有人可以向我解释一下吗?

我使用的是 3.16.7-ckt25-1 amd64 内核。

聚苯乙烯

我也有发布到 netdev 邮件列表。

相关内容