TUN 장치(nat64)를 생성하고 필요한 모든 패킷이 eth 장치에서 TUN 장치로 전달되도록 경로를 생성했습니다. 그러나 TUN 장치가 많은 패킷을 수신하지 못하는 것을 발견했습니다.
간단히 설명하자면, 필요한 트래픽을 필터링하기 위해 TUN 장치를 사용하여 간단한 NAT64 애플리케이션을 구현하려고 합니다. 2001:abcd:1::1은 게이트웨이 IP입니다. 2001:abcd:1:ffff::/64로 향하는 게이트웨이가 수신한 모든 IPv6 패킷은 IPv4로 변환되어야 합니다. 저는 TUN 장치에서 데이터를 읽고 IPv6에서 IPv4로 필요한 모든 변환을 수행하는 프로그램을 작성했습니다.
2001:abcd:1:ffff::/64에 대한 "nat64" TUN 장치에 대한 경로를 만들었습니다. ping6 또는 낮은 속도의 트래픽을 시도하면 제대로 작동합니다. 더 높은 속도로 패킷을 보내려고 하면 많은 패킷이 아직 TUN 장치에 도달하지 못했습니다. 200K/초로 전송한 4M UDP 패킷 중 2.9M 패킷만 TUN 장치로 라우팅되었습니다.
ifconfig의 통계와 TUN 장치에서 읽을 때 카운터를 사용하여 이를 확인했습니다. 또한 tcpdump를 검사하여 모든 패킷이 eth0에 도착했는지 확인했습니다. ostinato 도구를 사용하여 UDP 패킷을 보냅니다.
아래는 구성입니다 -
> $ip -6 route
> 2001:abcd:1:ffff::/64 dev nat64 metric 1024 mtu 1500 advmss 1440 hoplimit 0
>
> eth0 Link encap:Ethernet HWaddr 08:AC:A5:10:01:52 inet6 addr:
> 2001:abcd:1::1/128 Scope:Global inet6 addr: fe80::aac:a5ff:fe10:152/64
> Scope:Link UP BROADCAST RUNNING MULTICAST MTU:9000 Metric:1 RX
> packets:182256365 errors:0 dropped:0 overruns:0 frame:0 TX
> packets:91927 errors:0 dropped:0 overruns:0 carrier:0 collisions:0
> txqueuelen:0 RX bytes:8762429793 (8.1 GiB) TX bytes:10618282 (10.1
> MiB)
>
> nat64 Link encap:UNSPEC HWaddr
> 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 UP POINTOPOINT RUNNING
> NOARP MULTICAST MTU:1500 Metric:1 RX packets:49370386 errors:0
> dropped:0 overruns:0 frame:0 TX packets:49379475 errors:0 dropped:31
> overruns:12933189 carrier:0 collisions:0 txqueuelen:500 RX
> bytes:1394031492 (1.2 GiB) TX bytes:2378651480 (2.2 GiB)
>
> $tcpdump -ni nat64 > /dev/null
> tcpdump: WARNING: arptype 65534 not
> supported by libpcap - falling back to cooked socket tcpdump: WARNING:
> nat64: no IPv4 address assigned tcpdump: verbose output suppressed,
> use -v or -vv for full protocol decode listening on nat64, link-type
> LINUX_SLL (Linux cooked), capture size 65535 bytes ^C2961568 packets
> captured 2961568 packets received by filter 0 packets dropped by
> kernel
>
> $tcpdump -ni eth0 > /dev/null
> tcpdump: WARNING: eth0: no IPv4 address
> assigned tcpdump: verbose output suppressed, use -v or -vv for full
> protocol decode listening on eth0, link-type EN10MB (Ethernet),
> capture size 65535 bytes ^C4000482 packets captured 4000482 packets
> received by filter 0 packets dropped by kernel
eth0과 TUN 장치 사이에서 너무 많은 패킷이 손실되는 이유는 무엇일까요?