목표는 합당하다. 이 머신의 서비스에는 터널 사용자만 도달해야 한다. 사람들이 흔히 택하는 구현은 WireGuard를 뺀 모든 것을 버리는 IPv6 입력 체인인데, 이는 호스트를 자기 링크에 붙여 두는 트래픽까지 버린다. 이웃 탐색과 경로 유지 메시지는 서비스 접근이 아니며, 이것을 없애면 정책과 무관한 이유로 도달할 수 없는 머신이 된다. 터널은 올라오고 서비스는 올바르게 제한되며, 링크의 다른 무엇도 동작하지 않는다.

세 가지 책임, 하나의 규칙 집합

첫 번째 책임은 외부 네트워크 운용이다. 호스트는 자기 링크에 붙어 있어야 하고, 이웃을 해석하며, 그 링크의 경로 한계를 알아야 한다. 두 번째는 암호화된 수신기로, 선택한 주소와 포트에서 UDP를 받는다. 세 번째는 터널 사용자가 도달해야 할 복호화된 서비스 집합이다.

이들은 서로 다른 세 정책이며, VPN과 관계된 것은 두 번째와 세 번째뿐이다. 이들을 하나로 취급하는 규칙 집합은 애플리케이션 경계를 조이는 일이 호스트 연결을 조용히 깨뜨리는 고장 모드를 물려받는다.

별도 체인에, 적어도 별도 주석으로 나눠 두면 다음 사람이 어느 줄이 무슨 이유로 있는지 알 수 있다.

ICMPv6가 호스트를 위해 하는 일

IPv6는 에코보다 훨씬 많은 것을 ICMPv6에 의존한다. 이웃 요청과 광고는 ARP를 대신하며 로컬 전달에 필요하다. Packet Too Big은 경로 MTU 정보를 나르고, 이를 무시하면 큰 패킷에서 멈추는 전송이 생긴다. 링크가 자동 구성을 쓸 때 라우터 광고는 기본 경로와 프리픽스 정보를 나른다.

RFC 4890은 호스트 필터가 반드시 허용해야 하는 메시지와 관리상 선택인 메시지를 구분하며, 그것도 네트워크 사이를 전달하는 라우터 규칙과 다른 호스트 항목에서 다룬다. 전달 항목만 읽으면 보호하는 호스트에 너무 엄격한 입력 정책이 만들어진다.

실무 규칙은 필요한 인터페이스에서 핵심 오류와 구성 메시지를 허용하고, 플랫폼이 허용하는 곳에서는 종류와 출처로 범위를 좁히며, 나머지에 대해서는 명시적으로 결정하는 것이다.

이 모두를 포괄적인 ICMPv6 허용으로 바꾸면 가용성 문제는 풀리지만 필터링을 포기한다. 포괄적 차단으로 바꾸면 필터링 문제는 풀리지만 호스트를 포기한다.

먼저 터널을 통과시키고, 다음에 서비스를 통과시킨다

의도한 외부 주소와 UDP 포트에서 WireGuard 전송을 받아들이고, 돌아오는 트래픽은 연결 추적으로 받아들인다. 그다음 터널 인터페이스를 통해 애플리케이션 서비스를, 실제로 승인한 출처에서 통과시킨다.

외부 UDP 포트 허용은 그 안의 복호화된 요청을 승인하지 않는다. 이 구분이 서비스 규칙에 터널 인터페이스가 등장하는 이유 전부다.

파일이 설명하는 대로가 아니라 규칙 집합이 실제로 존재하는 그대로 읽어라:

sudo nft list ruleset
ip -6 addr show
ip -6 route show default

물리 주소에서의 수신은 터널 주소의 같은 서비스와는 별개의 노출이다. 머신이 다른 머신으로도 트래픽을 전달한다면 그것은 이 입력 정책이 아니라 전달 체인의 결정이며, 그 자체의 근거가 필요하다.

터널만이 아니라 링크를 시험하라

변경 후 동작하는 터널은 보이는 것보다 적게 증명한다. 기존 이웃 항목과 이미 맺어진 연결이 정책이 지금 버리는 제어 메시지를 가릴 수 있기 때문이다.

연결을 직접 확인하고, 그다음 제외한 경로가 여전히 실패하는지 확인하라.

ip -6 neigh show
ping -6 -c 3 2001:db8:1::1
sudo nft -c -f /etc/nftables.conf

재부팅 후에도 이웃 테이블이 완전히 남아 있으면 탐색이 아직 동작한다는 신호다. 비어 버리고 다시 채워지지 않으면 걸러 냈다는 신호다. 세 번째 명령은 규칙 집합을 적용하지 않고 문법을 검증하는데, 세션이 남아 있을 때 해 둘 가치가 있다.

스스로 잠가 버린 호스트를 복구하라

자신의 관리 세션을 나르는 방화벽 규칙을 바꾸기 전에 두 번째 경로를 마련하라. 콘솔, 시리얼 연결, 또는 취소하지 않으면 새 규칙을 제거하는 예약된 롤백이다.

정말로 잠겨 버렸다면 복구는 그 경로를 통하며, 방금 제거한 네트워크를 통하지 않는다. 저장한 사본에서 이전 규칙 집합을 되돌리고, 호스트에 다시 도달할 수 있음을 확인한 뒤에야 의도한 정책을 더 작은 조각으로 적용하라.

최종 정책은 보편적이지 않다. 주소 체계, 라우팅, 방화벽 구현은 배포마다의 입력이지만, 경계는 어디서나 같다. 승인된 터널을 나르는 제어 트래픽을 유지하면서 의도하지 않은 애플리케이션 접근을 거부하라.

관련 글