Tap1에서 나가는 모든 UDP 트래픽을 가로채고 싶습니다. 예를 들어 DNS 요청에 응답할 수 있습니다. 이를 달성하기 위해 localhost를 수신하고 사용하는 Python 코드를 작성했습니다.iptables규칙 세트는 다음과 같습니다.
체인 PREROUTING(정책은 2개의 패킷, 333바이트를 허용함) pkts byte target prot는 출력 소스 대상을 선택합니다. 0 0 DIVERT udp - 소켓 어디서나 tap1 0 0 TPROXY udp -- 어디서나 tap1 TPROXY 리디렉션 127.0.0.1:5001 태그 0x1/0x1 체인 DIVERT(참조 1개) pkts byte target prot는 출력 소스 대상을 선택합니다. 0 0 MARK udp - MARK가 0x1로 설정된 모든 위치 0 0 UDP 허용 - 어디서나 어디서나
정책 라우팅은 다음과 같은 방법으로 수행됩니다.
100을 찾으려면 IP 규칙에 fwmark 1을 추가하세요. IP 라우팅은 로컬 0.0.0.0/0 dev lo 테이블 100을 추가합니다.
이 설정은 커널의 Documentation/networking/tproxy.txt에서 적용됩니다. 이는 IP_TRANSPARENT 옵션으로 열린 TCP 소켓에 완벽하게 작동합니다.
안타깝게도 UDP 소켓이 연결을 처리할 수 없는 것 같습니다. 예를 들어 이렇게 하면 ncat -u localhost 1234
소켓이 데이터를 수신하지만 아무것도 다시 보낼 수 없습니다. Wireshark는 정확히 세 개의 패킷을 표시합니다.
- 들어오는 ncat 패킷(localhost:1234로)
- 내 소프트웨어에서 나가는 패킷(대상: 5001)
- ICMP 포트에 액세스할 수 없습니다(물론).
임의의 포트가 작동하려면 적절한 (S)NATting 규칙을 설정하는 것이 불가능할 것 같습니다.
그렇다면 이를 작동시키기 위해 필요한 설정은 무엇입니까?평상복들어오는 포트?