두 개의 /1 프리픽스는 하나의 /0와 정확히 같은 IPv4 주소를 덮지만, 그 동등성은 피어의 허용 프리픽스 목록 안에서만 성립합니다. 설정 도구가 라우팅 방식을 결정하는 순간 성립하지 않게 됩니다. Linux의 wg-quick가 기본 프리픽스를 산술이 아니라 특별한 사례로 다루기 때문입니다. 특별 분기는 전용 테이블, 두 개의 정책 규칙, 소켓 마크, 역경로 설정을 설치하는데, 반쪽 경로 한 쌍은 이런 것들을 전혀 받지 않습니다. 따라서 편집 후 프록시나 브라우저가 동작을 멈추면, 프리픽스는 그 변경에서 가장 흥미로운 부분이 아닙니다.

프리픽스 목록이 전체 구성은 아니다

AllowedIPs는 동시에 두 가지 일을 하며, 그중 하나만 적용 범위에 관한 것입니다. WireGuard 자체에게 이 목록은 암호 키 라우팅입니다. 어떤 목적지가 피어 쪽으로 암호화되고 그 피어가 어떤 출발지 주소를 쓸 수 있는지 결정합니다. wg-quick에게 같은 목록은 경로 명세 역할도 하며, 생성되는 경로는 목록이 우연히 어느 분기와 일치하는지에 달려 있습니다. 그래서 서로 다른 두 목록 형태에서 적용 범위가 같다는 것은 호스트 상태가 같다는 것을 말해주지 않습니다.

기본 구성은 그 결정을 사용자의 손에서 가져갑니다. Table가 기본적으로 자동이고 경로가 어디에 놓일지 도구가 직접 고르기 때문입니다. 다른 네트워크 관리자, 배포판 래퍼, 사용자 지정 Table 값은 결과를 다시 바꾸므로, 한 호스트를 위해 쓴 조언이 다음 호스트에서는 틀려 보일 수 있습니다.

기본 분기가 경로 외에 추가하는 것

/0 항목은 wg-quick를 기본 경로 경로로 보냅니다. 별도 라우팅 테이블이 기본 경로를 받고, 정책 규칙 하나가 마크 없는 트래픽을 그리로 보내며, 두 번째 규칙이 메인 테이블의 더 구체적인 경로를 우선 유지하고, 인터페이스는 자기 소켓에 방화벽 마크를 받습니다. 그 마크가 루프 보호 장치입니다. 터널 트래픽을 나르는 암호화된 데이터그램은 마크가 설정된 채 나가므로, 나머지 전부를 터널로 보내는 규칙이 터널 자체의 전송 패킷을 삼키지 않습니다.

대신 /1 항목 한 쌍은 일반 경로를 탑니다. 설정된 테이블에 두 개의 경로가 놓이고 주변 기계 장치는 하나도 나타나지 않습니다. 불필요해서가 아니라 그 코드 경로로 들어간 적이 없기 때문입니다.

두 구성이 갈라지는 지점

차이는 먼저 재귀로 나타납니다. 반쪽 경로가 메인 테이블에 있으면 피어 자신의 전송 주소가 터널 프리픽스 안에 들어가므로, 터널을 나를 패킷이 터널 안쪽을 가리키는 경로와 일치합니다. 무언가가 이를 예외 처리해야 합니다. 현재 엔드포인트에 대한 호스트 경로, 손으로 적용한 마크, 또는 인터페이스 전용 규칙입니다. 호스트 경로는 엔드포인트 주소가 바뀔 때까지 동작합니다, 이는 DNS 기반 엔드포인트, 이동 클라이언트, 다중 피어 구성에서 발생합니다.

둘째, 마크에 대해 추론하는 모든 것이 동작을 바꿉니다. 연결을 로컬에서 리디렉션하는 투명 프록시는 마크와 출발지가 원래 클라이언트 흐름과 다른 새 소켓을 만들며, 기본 분기가 생성하는 정책 규칙은 그 흐름을 갈라놓은 요소의 일부였습니다. 프록시 자체의 아웃바운드 연결을 읽는 것은 원래 목적지에 도달할 수 있는지 시험하는 것과 다른 작업입니다.

편집 전에 규칙과 마크를 읽으세요

터널이 건강할 때 현재 상태를 기록하고, 변경 후에 다시 기록한 뒤 구성 파일에서 추론하는 대신 두 덤프를 비교하세요. 정책 규칙, 모든 테이블, 인터페이스 마크, 기록된 엔드포인트를 포함하세요.

ip rule show
ip -4 route show table all | grep -E 'default|wg1'
wg show wg1 fwmark
wg show wg1 endpoints

출력의 첫 줄이 마크 없는 트래픽 규칙을 잃었고 전용 테이블이 비어 있다면 기본 분기는 실행되지 않는 것이며, 어떤 프리픽스 산술도 그 효과를 되돌리지 못합니다. 이전에 마크를 가졌던 인터페이스에서 마크가 영인 것도 같은 신호이며 하나의 값에서 보입니다.

출시 전에 터널 손실을 연습하세요

반쪽 경로 배치가 의도한 선택이라면 빠진 부분을 명시적으로 제공해야 합니다. 주소 변경을 견디는 엔드포인트 경로, 터널이 끊길 때의 의도된 동작, IPv6에 대한 동등한 처리가 그것입니다. 장애 중에 발견하는 대신 요구 사항으로 적어 두세요. 그런 다음 실패를 연습하세요. 물리 업링크로 조용히 되돌아가는 전체 터널은 동작을 멈추는 터널보다 나쁩니다.

sudo ip -4 route add 198.51.100.20/32 via 192.0.2.1 dev eth0
ip -4 route get 198.51.100.20
sudo wg-quick down wg1

경로 조회는 터널을 지나지 않고 물리 인터페이스에서 엔드포인트를 풀어야 하며, 인터페이스를 내리면 호스트는 설계가 약속한 상태에 남아야 합니다. 교체 후 동작하는 프록시는 생성된 호스트 상태가 중요했음을 증명하지만, 루프 방지와 내려간 상태의 동작이 편집에서 살아남았음을 증명하지는 않습니다.

관련 글