정책 기반 라우팅을 사용하여 루프백 인터페이스에서 패킷 전달

정책 기반 라우팅을 사용하여 루프백 인터페이스에서 패킷 전달

다음과 같은 iptables 규칙이 있습니다.

iptables -t mangle -A PREROUTING -p udp -m udp --dport 10000 -j MARK --set-xmark 0x4/0xffffffff

대상 포트가 10000인 모든 UDP 패킷에 fwmark 4를 설정합니다. NAT 없이 정책 기반 라우팅을 사용하여 이를 터널로 전달합니다.

[root@localhost ~]# ip rule
0:  from all fwmark 0x4/0x4 lookup 87 
32765:  from all lookup local 
32766:  from all lookup main 
32767:  from all lookup default 
[root@localhost ~]# ip route show table 87
default dev tunnel  scope link 

패킷이 일반 NIC( eth0등)에서 오는 경우 모든 것이 잘 작동하지만 루프백 인터페이스에서 전송된 패킷( lo예: 생성된 패킷 사용 socat -u - UDP:localhost:10000)은 건너뛰는 것 같습니다.PREROUTING체인 후 라우팅 결정, 로컬 호스트에 의해 수신됩니다(실제로는 lo인터페이스를 통해 ICMP 포트에 연결할 수 없는 패킷으로 응답합니다).

이것이 예상되는 동작입니까? 그렇다면 이 문제를 어떻게 해결할 수 있습니까? 더 복잡한 iptables 규칙 세트를 테스트하는 데 패킷을 사용하고 싶기 때문에 다른 입력 장치에 대해 다른 경로를 가지지 않도록 하는 패킷이 필요합니다 lo(즉, nat를 사용한 추가 규칙은 나에게 해결책이 아닙니다).

답변1

여기에는 몇 가지 사항이 관련되어 있습니다.

로컬 상자의 출력은 상자를 통과하는 트래픽에 대해 OUTPUT테이블을 대신 사용합니다 PREROUTING.PREROUTING

iptables 규칙은 패킷이 전송될 때만 일치합니다. 클라이언트가 연결을 열 때 단일 패킷을 생성하기 전에 주소에 바인딩해야 합니다. 바인딩할 때 iptables를 참조하지 않고 라우팅 규칙에 따라 소스 주소를 선택합니다.

대상으로 사용하여 테스트하고 127.0.0.1패킷을 보내면 127.0.0.1소스 주소로 사용하여 전송을 시도하고 커널은 기본적으로 라우팅을 허용하지 않습니다.

이 문제를 해결하면 패킷이 인터페이스를 떠나고 원격 시스템이 반환 방법을 모르는 소스 주소를 갖게 되면 또 다른 문제가 발생하게 됩니다.

따라서 해결책은 세 가지입니다.

1) OUTPUT 테이블에 규칙을 추가합니다.

iptables -t mangle -A OUTPUT -p udp -m udp --dport 10000 -j MARK --set-xmark 0x4/0xffffffff

2) 로컬 네트워크 라우팅 활성화:

sysctl -w net.ipv4.conf.$iface.route_localnet=1

$iface터널 인터페이스는 어디에 있습니까?

3) MASQUERADE인터페이스에서 나가는 트래픽의 소스 주소를 다시 쓰는 규칙을 추가합니다.

iptables -t nat -A POSTROUTING -o $iface -m addrtype --src-type LOCAL -j MASQUERADE

 

그러나 127.0.0.1트래픽 전송을 테스트할 때 여전히 문제가 발생할 수 있습니다. 아무것도 대상 주소를 다시 쓰지 않으므로 $iface대상 주소로 라우팅됩니다 127.0.0.1. 원격 시스템에서 이 트래픽을 거부할 수 있습니다.

관련 정보