VPN 패킷이 정확히 체크섬 두 개를 나른다는 주장은 깔끔하게 들리지만, 따져 볼 가치가 있을 만큼 자주 틀린다. 이 수는 어떤 IP 버전이 등장하는지, 어떤 전송 프로토콜이 실리는지, 터널이 어떤 보호 형식을 쓰는지에 따라 달라진다. 헤더 체크섬, 상위 계층 체크섬, 암호학적 무결성 태그는 범위가 각각 다른 세 가지 메커니즘이다. 이들을 세려면 먼저 각각이 무엇을 덮는지 표시해야 한다.

회선에 실제로 어떤 IP 버전이 있는지 확인한다

IPv4 헤더는 16비트 헤더 체크섬을 나르고, IPv6 헤더는 그런 것을 나르지 않는다. 이 한 가지 사실이 모든 터널의 수를 바꾸는 것은 IPv4를 IPv6 안에 감싸는 것과 IPv6를 IPv4 안에 감싸는 것이 서로 다른 문서를 만들기 때문이다. 터널은 두 계열을 동시에 나를 수 있고, 그때 한 방향에는 다른 방향에 없는 필드가 있을 수 있다. 무엇이든 세기 전에 버전을 확정한다.

배치는 그림이 아니라 헤더 목록으로 적는다. 캡처를 읽을 때 순서가 중요하고, 체크섬 필드의 존재 여부가 가장 먼저 표시할 대상이다.

outer IPv6 | ESP | inner IPv6 | UDP | application data
outer IPv4 | ESP | inner IPv4 | TCP | application data

첫 줄은 IP 헤더 어디에도 IP 헤더 체크섬이 없지만, 둘째 줄은 두 헤더가 모두 IPv4일 때 두 개를 가진다. 같은 터널 기술인데 수도 다르고, 두 줄 모두 완전한 회선 형식은 아니다.

각 체크섬이 무엇을 덮는지 확인한다

범위는 사람들이 건너뛰는 부분이며, 수를 의미 있게 만드는 것이 바로 그것이다. IPv4 헤더 체크섬은 헤더만 보호하고 그 뒤의 페이로드에 대해서는 아무 말도 하지 않는다. IPv6 위의 UDP 체크섬은 의사 헤더와 UDP 헤더 및 페이로드를 덮으므로, 데이터그램이 터널링되면 실려 가는 패킷 안까지 닿는다. TCP는 의사 헤더에 대한 비슷한 의존을 가진 자체 체크섬을 가진다. 셋 다 체크섬이라 불리지만 범위는 세 가지로 다르다.

RFC 791은 IPv4 헤더 검사와 홉마다의 재계산을 정의하고, RFC 8200은 의사 헤더를 포함한 IPv6 위의 상위 계층 처리를 정의한다. 어느 문서도 VPN 패킷에 고정된 수의 체크섬이 있다고 말하지 않는데, 둘 다 터널을 기술하지 않기 때문이다.

tshark -r capture.pcap -Y "ip.proto == 50" -V | grep -i checksum

무결성 보호는 따로 확인한다

ESP 무결성은 자체 범위와 알고리즘에 의존하는 표현을 가진 암호학적 보호다. 다른 이름의 IP나 UDP 체크섬이 아니며, 길이는 선택한 구성에 따라 달라진다. 무결성 검사는 패킷의 정해진 부분을 덮고, 사용하는 모드에 따라 ESP 헤더와 페이로드의 일부를 포함할 수 있다. 이를 알려진 폭의 체크섬 필드로 세는 지점에서 이런 설명 대부분이 무너진다.

바이트를 세기 전에 선택한 구성을 읽고, 결과를 다른 이름표를 붙인 체크섬이 아니라 무결성 보호로 서술한다. 물어보면 디코더가 필드 이름을 알려 줄 것이다.

tshark -r capture.pcap -Y esp -V | grep -iE "integrity|icv"

세기 전에 관측 지점을 확인한다

내부 인터페이스에서의 캡처와 회선에서의 캡처는 전혀 다른 계층을 보여 줄 수 있다. 내부 인터페이스에서는 터널이 이미 벗겨져 있어 실려 가는 패킷이 보이고 바깥 헤더는 하나도 보이지 않는다. 회선에서는 바깥 헤더와 읽을 수 없는 암호화된 페이로드가 보인다. 어느 관점도 틀리지 않으며, 두 관점은 같은 대상의 관점이 아니다. 어떤 수를 인용하기 전에 캡처를 어디서 했는지 밝힌다.

sudo tcpdump -ni eth0 -vv -c 5 esp
sudo tcpdump -ni tun0 -vv -c 5

첫 명령은 바깥 패킷을 무결성 트레일러와 함께 보여 주고, 둘째는 실려 가는 패킷을 자체 전송 체크섬과 함께 보여 준다. 두 캡처의 수를 더해도 무엇도 두 번 세지 않지만, 같은 패킷을 두 번 설명하게 된다.

수를 실제 캡처와 대조한다

패킷 하나를 완전히 디코드하고 디코더가 체크섬이나 무결성 값이라고 부르는 필드를 모두 표시한다. 다음으로 각 표시를 자신이 적은 배치와 비교하고, 실제로 세지 않는 계층에 속한 것은 지운다. 그 연습을 견뎌 낸 수는 방어할 수 있고, 기억에서 인용한 수는 그렇지 않다.

두 계열을 나르는 터널은 방향과 흐름에 따라 다를 수 있으므로 응답 방향에 대해서도 반복한다. 그다음 수를 범위와 함께 말하는데, 예를 들어 이 관측 지점에서 이 내부 패킷의 체크섬은 세 개라고 말하고, VPN 패킷 일반의 속성으로 말하지 않는다.

tshark -r capture.pcap -T fields -e ip.checksum -e udp.checksum -e tcp.checksum

관련 글