我想路由本地生成的流量:
- 通过接口“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
我发现了一些似乎与该主题相关的线程:
- http://marc.info/?l=linux-netdev&m=136633466813095&w=2
- http://www.spinics.net/lists/netdev/msg281954.html
- http://netfilter-devel.vger.kernel.narkive.com/8ggjpr4G/netfilter-core-mangle-table-rules-are-not-taken-into-account-in-preliminary-routing-decision
不幸的是,我仍然不明白为什么我也没有得到 TCP 的“网络无法访问”。有人可以向我解释一下吗?
我使用的是 3.16.7-ckt25-1 amd64 内核。
聚苯乙烯
我也有发布到 netdev 邮件列表。