TUN 장치를 생성한 다음 해당 인터페이스로 들어오는 모든 패킷을 검사하고 검사에 성공하면 변경되지 않은 채 TUN에 다시 쓰는 응용 프로그램이 있습니다. (방화벽을 생각해보세요) 패킷의 소스는 방화벽 응용 프로그램을 실행하는 것과 동일한 장치입니다. 이 시스템(VM, )은 기본 라우팅 테이블을 사용하여 10.0.2.15
다른 시스템(호스트, )에 연결할 수 있습니다 (설정이 필요하지 않음). 192.168.1.151
이제 내 문제는 방화벽 응용 프로그램을 통해 패킷을 보낼 때마다 커널이 패킷을 삭제하는 것 같다는 것입니다. 특히 TUN 인터페이스에서 tcpdump를 실행하면 다음이 표시됩니다.
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on tun0, link-type RAW (Raw IP), capture size 262144 bytes
12:24:21.548119 IP 10.0.2.15 > 192.168.1.151: ICMP echo request, id 9967, seq 1, length 64
12:24:21.548248 IP 10.0.2.15 > 192.168.1.151: ICMP echo request, id 9967, seq 1, length 64
12:24:22.555972 IP 10.0.2.15 > 192.168.1.151: ICMP echo request, id 9967, seq 2, length 64
12:24:22.556087 IP 10.0.2.15 > 192.168.1.151: ICMP echo request, id 9967, seq 2, length 64
각 패킷이 두 번 기록되는 것을 볼 수 있습니다. 내 앱에 들어갈 때 한 번, 앱에서 나올 때 한 번. 그러나 거기에서 그것은 사라지는 것처럼 보였다. 내 호스트로 나가기로 되어 있는 인터페이스에서 tcpdump를 실행하면 아무 것도 표시되지 않습니다.
내 가상 머신에서 다음을 구성했습니다.
# enable forwarding and disable reverse path filtering
sudo sysctl net.ipv4.conf.default.rp_filter=0
sudo sysctl net.ipv4.conf.all.rp_filter=0
sudo sysctl net.ipv4.ip_forward=1
# routes for the packets to take
sudo ip rule add to 192.168.1.151/32 lookup 11 prio 11
sudo ip rule add iif tun0 lookup main priority 10
표 11은 TUN 장치로 들어오는 패킷을 보여줍니다. 작동 원리는 tcpdump에 나와 있습니다.
또한 iptables FORWARD 및 OUTPUT 체인을 기본적으로 ACCEPT로 설정했습니다. 또한 패킷이 반환 경로를 찾지 못하는 문제를 배제하기 위해 UDP와 netcat을 사용하여 트래픽을 테스트했습니다.
내가 무엇을 놓치고 있나요? 커널이 내 패킷을 삭제하는 이유는 무엇일까요?
답변1
TUN 장치를 생성한 다음 해당 인터페이스로 들어오는 모든 패킷을 검사하고 검사에 성공하면 변경되지 않은 채 TUN에 다시 쓰는 응용 프로그램이 있습니다.
이제 내 문제는 방화벽 응용 프로그램을 통해 패킷을 보낼 때마다 커널이 패킷을 삭제하는 것 같다는 것입니다.
커널은 자신이 보내는 패킷이 들어오는 것을 보고 네트워크 어딘가에 라우팅 루프가 있어야 한다고 결론을 내리고 네트워크가 플러딩되는 것을 방지하기 위해 패킷을 삭제합니다.
이 동작을 비활성화해 보았 으나 TUN 인터페이스에 로컬 주소가 있으므로 rp_filter
이를 설정해야 할 수도 있습니다 .accept_local
더 나은 접근 방식은 실제로 애플리케이션을 방화벽으로 사용하고 두 개의 TUN 인터페이스(수신 및 발신)를 생성하고 둘 중 하나 또는 둘 다를 필요한 네트워크 네임스페이스/VM으로 이동하는 것입니다.
이렇게 하면 라우팅 루프로 보이는 것을 피할 수 있습니다.