전체 터널 경로가 트래픽을 나르는 서버를 끊는 이유
터널을 지나는 기본 경로는 터널을 나르는 바깥 패킷까지 붙잡습니다. 엔드포인트를 호스트 경로로 고정하고 서버 응답이 그 밖으로 나가게 하십시오.
전체 터널을 켜면 이제 모든 목적지가 VPN 인터페이스에 속하며, 터널을 종료하는 기계도 마찬가지입니다. 터널을 나르는 바깥 패킷은 그 기계로 향하므로, 경로는 결국 자신이 의존하는 전송을 스스로 소비하게 됩니다. 구체적인 경로 하나를 더 넣으면 해결되며, 그 이유를 이해할 가치가 있습니다. 그 이유를 놓치면 다음 재구성에서 같은 결함이 다시 들어옵니다.
자기 전송을 잡아먹는 경로
캡슐화는 각 패킷을 두 번째 헤더로 감쌉니다. 바깥 헤더는 로컬 물리 주소에서 서버의 공인 주소로 향하며, 어떤 터널이 존재하기 전에 물리 링크를 건너야 합니다.
이제 그 공인 주소에 대한 조회가 터널을 고르게 두십시오. 패킷을 보내려면 기계가 이를 캡슐화해야 하고, 그러려면 같은 주소로 가는 경로가 필요하며, 그 경로가 터널을 돌려줍니다. 클라이언트는 이를 두 가지 방식 중 하나로 처리합니다. 신중한 쪽은 기본 경로 설치를 거부하고 오류를 보고하며, 덜 신중한 쪽은 성공을 보고한 뒤 아무것도 옮기지 않습니다. 조용한 실패가 바로 반나절을 잡아먹는 쪽입니다.
최장 프리픽스 일치가 어떤 메트릭보다 먼저 조회를 결정하므로, 단일 주소 경로는 기계의 모든 기본 경로를 앞섭니다. 수리의 배후에 있는 기제는 이것뿐입니다.
기본 경로보다 먼저 예외를 설치하십시오
기본 경로가 움직이기 전에 물리 게이트웨이를 다음 홉으로 하는 단일 주소 경로를 서버용으로 만드십시오. 순서가 중요하며, 나중에 설치하면 입력하는 동안 깨진 터널과 함께 살아야 합니다.
대부분의 클라이언트는 요청 없이 이렇게 합니다. OpenVPN 원격 주소를 조회하고 기본 게이트웨이를 다시 쓰기 전에 고정하며, route-delay 옵션은 그 순서가 경쟁하는 플랫폼을 위해 존재하며, wg-quick은 완전히 다른 길을 택합니다. 패킷에 표시를 하고 정책 규칙을 참조하는 방식으로 예외를 추가하는 대신입니다. 기제는 다르지만 요구는 같으며, 바깥 패킷은 자기가 만드는 터널에서 빠져나와야 합니다.
ip route add 203.0.113.10/32 via 192.168.1.1 dev eth0
ip route get 203.0.113.10
조회 출력이 곧 수용 테스트입니다. 물리 장치와 물리적인 다음 홉을 지목해야 합니다. 그 답에 터널 장치가 나온다면 예외가 빠졌거나, 이를 덮어쓰는 무언가 뒤에 놓인 것입니다.
서버 쪽의 거울상
같은 함정이 반대편에서 뒤집힌 채 기다립니다. 서버에 다른 터널을 통한 기본 경로를 주거나 클라이언트의 공인 주소를 덮는 경로를 밀어 넣으면, 그 응답은 잘못된 방향으로 가는 습관을 얻습니다.
연결해서 요청을 보내는 클라이언트를 상상해 보십시오. 응답은 그 클라이언트의 공인 주소로 향하는데, 이제 터널 경로와 일치하므로 클라이언트가 한 번도 건 적 없는 출발지를 실은 채 다른 인터페이스에서 나갑니다. 클라이언트는 보낸 요청과 연결해 주는 것이 없으므로 그 패킷을 받고도 버릴 수 있습니다. 실제 선택을 보여 주는 쪽은 둘 중 하나뿐이므로 클라이언트의 타임아웃이 아니라 서버의 라우팅 결정에서 출발하십시오.
ip route get 198.51.100.44 from 10.90.0.1
ip rule show
sudo tcpdump -ni any host 198.51.100.44
수리는 세 가지이며 서로 같지 않습니다. 서비스를 물리 주소에 고정하는 것과 출발지를 변환하는 것은 둘 다 라우팅 결정을 고치는 대신 감춥니다. 터널 풀의 응답 트래픽을 전용 테이블로 보내는 것이 원인을 고치며, 나머지 둘은 라우팅 설계가 동결된 동안에만 받아들일 수 있습니다.
터널이 계속 훔치는 예외들
터널이 기본 경로를 쥐고 있어도 열린 인터넷이 필요한 작업이 몇 가지 있으며, 각각 자기 예외가 필요합니다. 동적 DNS 업데이터가 보통 가장 먼저 깨집니다.
제공자를 확인하고 연결을 열고 나면 자기 패킷이 몇 초 전에 주소가 바뀐 터널을 지나고 있음을 발견하므로, 갱신이 실패하거나 잘못된 주소를 게시합니다. 탈출구는 세 가지이며, 물리 게이트웨이를 지나는 호스트 경로로 제공자를 고정하거나, 터널이 올라오기 전에 갱신을 실행하거나, 업데이터에 터널이 건드리지 않는 정책 테이블을 주는 것입니다. 시간 동기화도 리졸버 없이 부팅하는 장치에서 같은 노출을 가지며, 인증서 검증 엔드포인트도 같은 이유로 목록에 들어갑니다.
아무도 적어 두지 않은 예외는 다음 재구성이 조용히 떨어뜨릴 예외입니다.
재연결 후에 증명하되 그 전이 아닙니다
목적지 하나가 아니라 엔드포인트, 터널 뒤의 사설 주소, 그 너머의 공인 주소입니다. 성공한 조회 하나는 나머지 둘에 대해 거의 아무것도 말해 주지 않습니다.
ip route get 203.0.113.10
traceroute -n 203.0.113.10
ip route get 10.90.0.5
ip route get 1.1.1.1
재연결 때 자기 테이블을 다시 만드는 클라이언트는 손으로 입력한 경로를 버리므로, 그다음 연결을 다시 시작하십시오. kill switch가 켜져 있다면 네트워크 변경 후 터널이 돌아오지 못하고 증상은 장애처럼 보이므로 엔드포인트가 허용되는지 확인하십시오. 예외는 셸 기록이 아니라 프로필이나 unit 파일에 저장해, 재연결이 그것을 지우는 대신 다시 만들게 하십시오.