특정 라우팅 테이블을 사용할 때 UDP sendto가 실패합니다


0

여러 개의 인터페이스가있는 시스템이 있습니다. 몇 가지 sysctl옵션과 라우팅 테이블 및 규칙을 사용하여 모든 인터페이스를 서로 분리했습니다 .

각 인터페이스에는 기본 경로를 정의하는 자체 라우팅 테이블이 있습니다.

각 라우팅 테이블에는 어떤 패킷이 어떤 테이블로 이동해야하는지 정의하는 4 가지 규칙이 있습니다.

단순화를 들어, 내가 가지고 있다고하자 eth0 (192.168.1.1)eth1 (192.168.1.2).

에서 192.168.1.1테이블eth0

192.168.1.1테이블eth0

iif eth0 table eth0

oif eth0 table eth0

들어 eth2이 동일합니다.

sysctl옵션은 다음과 같습니다

net.ipv4.conf.all.arp_filter = 1
net.ipv4.conf.all.arp_ignore = 2
net.ipv4.conf.all.arp_announce = 1
net.ipv4.conf.all.rp_filter = 1

이것은 의도 된 사용 사례의 99 %에서 훌륭하게 작동하지만 실패합니다. "sendto"를 사용하여 UDP 클라이언트에 응답하는 것과 같이 바인딩되지 않은 소켓에서 패킷이 생성되면 "Network Unreachable"로 호출에 실패합니다. sendto를 호출하기 전에 특정 IP 주소가 바인드되면 호출이 예상대로 성공합니다.

이와 같은 상황에 대한 포괄 기본 경로 설정이 부족한 경우이 문제를 해결하기 위해 정책 라우팅 (예 : iptables, ip rule)을 사용하여 수행 할 수있는 작업이 있습니까?

감사


iptables와 함께 마크를 사용하는 솔루션은 도움이되지 않습니다. iptables의 출력 맹글 후크 는 첫 번째 경로 조회 ( "라우팅 결정") 후에 발생 하고 두 번째 조회 ( "리 라우트 확인")를 트리거합니다 . 따라서 iptables의 마크를 사용하는 것은 여기서 도움이되지 않습니다. "네트워크에 접근 할 수 없음"은 첫 번째 조회에서 발생하고 맹글 테이블은 사용되지 않기 때문입니다. 사진보기 : en.wikipedia.org/wiki/Netfilter#/media/…
AB

그러나이 포괄 기본 경로를 추가하면 사용하지 않더라도 iptables의 mark + ip rule fwmark (트리거 된 리 라우트 확인)를 사용할 수 있습니다. 이 문제에 대해 iptables를 사용하여 해결책이 있는지 모르겠지만 iptables가 관련된 경우 "기본"기본 경로가 여전히 필요합니다
AB

감사. 그렇다면 ip 테이블을 포함하지 않는 솔루션이 있습니까? 소스 주소가 지정되면 라우팅 조회가 실패하는 이유가 궁금하고 소스 주소 X의 모든 패킷을 나타내는 규칙이 있습니다. 테이블 Y
IMerin

이건 어때? ip link add dummy0 type dummy; ip link set dummy0 up; ip route add default dev dummy0. 분명히 어떤 패킷도 잘못된 곳으로 가지 않을 것입니다. socat을 사용한 테스트에서 eth0을 통해 lan을 통해 동일한 LAN에서 192.168.1.1로 연락했을 때 "Network is areachable"에서 192.168.1.1 소스로 응답하기 위해 갔다. 이제는 간단한 경우 인 것 같습니다. 실제 사례가 있습니까? 그건 그렇고, 당신은 질문에 경로를 작성하지 않았으므로 여기에서 더 이상 할 수 없습니다
AB

oks는 회신에 잘 작동합니다 (UDP 케이스 포함). 그러나 IP를 지정하지 않고 나가는 연결을 시작하면 첫 번째 인터페이스의 IP (192.168.1.1)와 기본 경로 인터페이스 dummy0을 선택합니다. 그러나 그런 다음 패킷을 표시하면 경로 재 지정 검사가 시작되고 결국 fwmark 규칙을 추가하지 않아도 예상 규칙 (eth0으로 전환됨)을 따릅니다.
AB
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.