로컬에서 생성된 트래픽을 라우팅하고 싶습니다.
- 인터페이스 "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에 대해서도 "Network Unreachable"이 표시되지 않는 이유를 아직도 이해하지 못합니다. 누군가 나에게 이것을 설명해 줄 수 있습니까?
저는 3.16.7-ckt25-1 amd64 커널을 사용하고 있습니다.
폴리스티렌
나도 가지고 있어풀어 주다netdev 메일링 리스트로 이동하세요.