Отсутствие «недостижимого» ответа для исходящего TCP-соединения при использовании маршрутизации fwmark и политики

Я хотел бы маршрутизировать локально генерируемый трафик:

  • к порту TCP «A» хоста «H» через интерфейс «A»,
  • к порту TCP «B» хоста «H» через интерфейс «B».

Интерфейс «B» иногда недоступен. Затем я хотел бы, чтобы ядро ​​уведомило пользователя о ошибке «Network is unreachable», если вы пытаетесь подключиться к 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.

PS

Я также опубликовал список рассылки netdev.

Linux и Unix - лучшая ОС в мире.