VPN을 통해 호스트로 ping을 보내면 요청은 한 ICMP 유형으로 나가 다른 유형으로 돌아오며, 이것만으로도 포트를 기준으로 쓴 모든 규칙이 혼란스러워진다. 에코 교환에는 반환 규칙으로 복사할 목적지 서비스 포트가 없고, 대칭을 기대하는 필터는 요청이 아무 저항 없이 지나가는 동안 응답을 버린다. 해결은 패킷을 실제 모습 그대로 읽는 데서 시작하고, 이어서 경로의 어느 경계가 판단을 내리는지 결정하는 것이다. 보통 두 계층이 동작하고 세 번째가 조용히 응답을 버린다. 아래 절들은 패킷이 마주치는 순서대로 그것들을 분리한다.

바뀌는 것은 포트가 아니라 유형

에코 요청은 ICMP 유형 8, 코드 0이며 식별자와 시퀀스 번호를 운반한다. 응답은 유형 0, 코드 0이고 식별자와 시퀀스는 같으며 IP 끝점이 바뀐다. 이 필드들을 정의하는 것은 RFC 792이고, 송신자가 응답을 자기 요청과 짝지을 수 있게 하는 것이 바로 식별자다.

없는 것도 똑같이 중요하며, TCP나 UDP 헤더가 없으므로 허용할 포트가 없다. 에코 응답에 포트를 지정하는 규칙은 결코 존재하지 않을 패킷을 설명한다. 이것이 VPN ping 티켓에서 가장 흔한 실수다. 규칙은 구체적으로 보이지만 아무것에도 적용되지 않고, 장애를 원래 있던 자리에 그대로 둔다.

세 가지 문맥이 패킷을 결정한다

ping이 원격 LAN의 호스트를 겨냥하면 요청은 게이트웨이가 전달해야 한다. 게이트웨이 자체에 속한 주소를 겨냥하면 대신 로컬 입력 경로에서 끝난다. 게이트웨이가 직접 ping을 시작하면 패킷은 자기 출력 경로에서 시작해 전달 판단을 전혀 거치지 않는다.

이 세 문맥은 규칙 체인과 카운터가 다르고, 그것들을 하나로 취급하는 것이 «방화벽이 ICMP를 허용한다»는 말에도 ping이 실패할 수 있는 이유다. 바깥 터널은 네 번째 문맥이며, VPN 리스너를 허용한다고 해서 캡슐이 풀린 내부 요청이 자동으로 허용되지는 않으며, 내부 허용은 바깥 터널이 살아 있는지에 대해 아무것도 말하지 않는다.

상태 저장 필터와 무상태 필터는 응답을 다르게 다룬다

요청이 나가는 것을 본 상태 저장 방화벽은 응답을 그 흐름에 연결하고 두 번째 규칙 없이 통과시킬 수 있다. 무상태 필터에는 그런 기억이 없다, 그래서 반환 방향에는 출발지와 목적지를 뒤집은 자체 명시적 허용이 필요하다.

무엇이든 쓰기 전에 제품이 실제로 어느 모델을 구현하는지 확인하라. 에코 요청 규칙이 반드시 에코 응답을 덮지는 않으며, ICMP 질의를 추적하는 제품도 다른 인터페이스로 도착한 응답에는 다른 정책을 적용할 수 있다.

허용하는 범위를 한정하라. 어디서나 모든 에코 응답을 허용하는 것은 상태 저장 연결을 완료하는 것과 같지 않고, 유형 번호는 송신자를 인증하지 않는다.

변환은 식별자도 바꾼다

출발지 변환이 의도된 것이라면 원격 끝의 튜플은 클라이언트가 보낸 것과 일치하지 않는다. NAT는 주소와 함께 ICMP 질의 식별자도 변환할 수 있으므로 양쪽에 같은 번호가 보여야 한다고 고집하면 거짓 불일치가 생긴다.

대신 변환기가 보고하는 매핑에 상관관계를 두라. 식별자를 다시 쓰는 변환기는 클라이언트가 기록한 번호를 보존하지 않으므로 번호가 아니라 매핑을 정체성으로 취급하고, 그런 다음 식별 가능한 요청 하나를 경로를 따라 추적하라: 예상한 출발지로 목적지에 도달하는지 확인하고, 목적지가 응답을 내보냈는지 확인하고, 그 응답의 반환 경로를 따라가고, 클라이언트가 실제로 받았는지 확인하라. 게이트웨이 카운터가 오르는 것만 보는 것이 아니라.

ICMP 오류를 에코 정책에 접어 넣지 마라

경로 MTU 탐색이 쓰는 «단편화 필요» 메시지는 에코 응답이 아니며, 그 페이로드는 메시지를 유발한 패킷을 인용한다. 에코만 허용하는 규칙이 그런 오류를 조용히 버리면 크기 문제가 매달린 연결로 바뀌는데, 이는 도움이 되는 것과 정반대다.

같은 주의가 주소 체계에도 적용된다. ICMPv6는 다른 메시지 유형을 쓰고 IPv4에 없는 필수 기능을 나르므로, 이 번호들을 IPv6 규칙에 복사하는 것은 그냥 틀린 것이다.

에코 교환이 동작하면 실제 애플리케이션을 따로 시험하라. 성공한 ping은 한 프로토콜이 한 크기로 한 목적지까지 왕복함을 증명할 뿐이며, HTTPS나 SMB 또는 다른 흐름이 허용된다고 가정할 면허는 아니다.

관련 글