![정책 기반 라우팅을 사용하여 루프백 인터페이스에서 패킷 전달](https://linux55.com/image/56638/%EC%A0%95%EC%B1%85%20%EA%B8%B0%EB%B0%98%20%EB%9D%BC%EC%9A%B0%ED%8C%85%EC%9D%84%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%EB%A3%A8%ED%94%84%EB%B0%B1%20%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4%EC%97%90%EC%84%9C%20%ED%8C%A8%ED%82%B7%20%EC%A0%84%EB%8B%AC.png)
다음과 같은 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
. 원격 시스템에서 이 트래픽을 거부할 수 있습니다.