터널은 일회용이지만 정책은 그럴 필요가 없습니다. Linux 게이트웨이에서 터널 인터페이스를 이름으로 일치시키는 nftables 규칙은 한 번 로드해 두면 그 인터페이스가 나타날 때마다 계속 적용됩니다. 인터페이스에는 여전히 수명 주기가 있습니다: 생성되고, 사라지고, 그 주변의 경로와 변환은 각자의 일정을 따릅니다. 이러한 소유자를 분리하는 것이 재연결 중에 접근을 안정적으로 유지합니다.

이름 일치는 인터페이스보다 오래 살아남습니다

nftables는 숫자 인터페이스 인덱스 일치와 동적 이름 일치 iifname 및 oifname을 제공합니다. 이러한 이름을 쓰는 규칙은 터널 장치가 아직 만들어지지 않았어도 깔끔하게 로드되며, 이는 부팅 시 규칙 집합이 정확히 필요로 하는 특성입니다. 인터페이스 이름이 바뀌면 일치가 멈추고, 새 인터페이스가 그 이름을 이어받으면 다시 시작됩니다. 숫자 인덱스에는 그런 특성이 없어서 터널에는 이름 형식이 보통 선택입니다.

이름은 일치 키일 뿐, 반대편에 누가 있는지에 대한 증거가 아닙니다. 피어 인증은 VPN의 몫으로 남습니다.

규칙을 추가하기 전에 체인을 읽으세요

순서가 결과를 결정하기 때문에 규칙 집합이 지금 무엇을 담고 있고 새 규칙이 어디에 놓일지 보세요.

nft list ruleset
nft -c -f /etc/nftables.conf

목록은 체인, 규칙, 핸들을 보여 주고, 검사 모드는 후보 파일을 로드하지 않고 검증합니다. 처음 일치하는 규칙이 이기기 때문에 같은 흐름에 대한 이전 허용 뒤에 놓인 터널 전용 허용은 아무것도 바꾸지 못합니다. 그래서 늦게 놓인 규칙은 올바르게 보이면서도 효과가 없을 수 있습니다. 체인을 순서대로 읽고 클라이언트에서 업링크로 가는 트래픽의 거부가 여전히 더 넓은 무엇보다 앞서 있는지 확인하세요.

경로, 변환, 흐름에는 다른 소유자가 있습니다

인터페이스의 존재는 경로를 만들지 않고 피어를 인증하지도 않습니다. 그것들은 VPN 관리자의 몫이고, 변환에는 세 번째 수명 주기가 있습니다.

conntrack -L -s 10.20.0.0/24 | head
ip route show dev vpn0

conntrack 목록은 기존 흐름을 원래 값과 변환된 값과 함께 보여 주고, 경로 목록은 관리자가 인터페이스를 위해 무엇을 설치했는지 보여 줍니다. NAT 규칙은 첫 패킷에서 연결 추적 상태를 만들기 때문에, 이미 성립된 흐름은 규칙이 바뀐 뒤에도 변환을 유지합니다. 그래서 규칙이 갱신되는 것과 새 경로를 쓰는 흐름이 있는 것은 서로 다른 이야기입니다. 어떤 세션이 다시 연결되어야 하는지 정하고 관련 없는 흐름은 그대로 두세요.

콜드 스타트, 손실, 복구를 받아들이세요

부팅 시 터널이 없는 상태, 그다음 있는 상태, 그다음 끊김과 복귀 후에 게이트웨이를 시험하세요. 터널이 없을 때 금지된 전달이 계속 거부되는지, 피어가 인증되면 새로 허용된 흐름이 동작하는지, 복구에 관련 없는 상태를 비울 필요가 없는지 확인하세요. 다른 서비스가 그것들을 공유하기 때문에 하나의 프로필 중지 동작으로 POSTROUTING 체인 전체나 모든 conntrack 항목을 지우지 마세요. 시작 훅이 성공적으로 끝났다는 것만이 아니라 어느 구성 요소가 인터페이스, 경로, 정책을 바꿨는지 기록하세요.

재연결을 견디는 정책은 소유자가 이름 붙여지고 규칙이 터널을 내린 상태와 올린 상태 모두에서 시험된 정책입니다. 성공을 보고하는 훅은 훅이 실행되었다는 것만 증명합니다.

관련 글