클라이언트는 계속 재시도하고, 로그는 핸드셰이크가 끝나기 전에 멈추며, 서버는 아무것도 기록하지 않습니다. 이 패턴은 자격 증명에서 멀어져, 두 끝 사이의 무언가가 터널에 필요한 프로토콜 전달을 거부한다는 점을 가리킵니다. 두 구성 중 어느 것도 건드리기 전에 패킷이 멈추는 곳을 정하십시오, 필터링된 프로토콜과 잘못된 비밀번호는 대부분의 클라이언트에서 같은 친절한 오류를 내기 때문입니다. 테스트는 비용 순으로 정렬되어 있으며 가장 저렴한 것이 먼저입니다.

트래픽이 멈추는 곳을 증명하십시오

클라이언트의 아웃바운드 인터페이스와 서버에서 동시에 캡처하십시오. 나간 것과 도착한 것을 비교하고 차이가 어느 방향으로 나타나는지 적으십시오.

서버에 아무것도 없다면 경로나 첫 NAT가 트래픽을 버리는 것이고, 응답 없는 도착은 서버의 방화벽이나 존재하지 않는 반환 경로를 가리킵니다. 터널을 자주 종료하는 라우터는 쓸 만한 로그를 거의 남기지 않으므로 캡처가 기록이 됩니다. 두 실패 모두 클라이언트 대화상자에서 똑같이 보이므로, 대상 포트와 프로토콜 번호를 적으십시오.

PPTP는 프로토콜 47 없이는 죽습니다

PPTP는 제어를 TCP 1723으로, 데이터를 GRE 안으로 전달하는데 GRE는 포트 번호가 아니라 IP 프로토콜 47입니다. 1723만 전달하면 페이로드를 나르는 프로토콜에 대한 규칙이 없어서, 연결이 인증된 뒤 조용해지는 전형적인 결과가 나옵니다. 클라이언트는 이를 거부된 비밀번호와 구별할 수 없으므로, 캡처는 구성 변경보다 먼저 이루어져야 합니다.

패스스루는 인바운드 포워딩과 반대 방향으로 동작하며, 펌웨어는 둘 다에 같은 레이블을 쓰는 일이 많아 모두를 혼란스럽게 합니다. Linux 클라이언트에서는 로컬 방화벽이 라우터가 관여하기 훨씬 전에 GRE를 버릴 수 있으므로, 프로토콜 47에는 자체 규칙이 필요하고 conntrack 도우미가 로드되어야 합니다. Ubuntu의 ufw는 일반 allow 규칙으로는 프로토콜 번호를 표현할 수 없어 이 규칙들을 before 파일에 둡니다. 그 뒤에는 머신을 재부팅하는 대신 방화벽을 다시 로드하십시오.

# /etc/ufw/before.rules, inside *filter
-A ufw-before-input -p gre -j ACCEPT
sudo ufw allow 1723/tcp
sudo modprobe nf_conntrack_pptp
sudo conntrack -L | grep gre

두 NAT 뒤의 L2TP와 IPsec

L2TP를 IPsec 안에서 쓰려면 키 교환에 UDP 500, NAT가 감지되면 UDP 4500, 그리고 프로토콜 50으로서 ESP가 필요합니다. 각각은 독립적으로 필터링되므로 하나를 허용하는 규칙은 나머지 둘에 대해 아무것도 증명하지 못합니다. 직렬로 연결된 두 라우터는 모든 패킷을 두 번 변환하고, 양 끝은 무엇이 협상되었는지 더 이상 합의하지 못합니다.

바깥 모뎀을 브리지하거나 안쪽 라우터에서 NAT를 꺼서 공인 주소가 터널을 종료하는 장치에 도달하게 하십시오. 둘 다 불가능하다면 터널은 이중 NAT 경계 안쪽에서 시작해야 하며, 거기서 종료해서는 안 됩니다.

통신사 네트워크와 주소 공유

WAN 주소가 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, 100.64.0.0/10 안에 있다면 라우터에 공인 주소가 없고 인터넷에서 오는 어떤 인바운드 포워딩도 도달할 수 없습니다. 통신사급 NAT는 예상하지 못한 프로토콜까지 추가로 필터링하며, 모바일 링크에서는 GRE가 자주 희생됩니다. 비교해야 할 것은 라우터 자체의 WAN 주소이지, 그 뒤에 있는 클라이언트에 대해 조회 사이트가 알려주는 주소가 아닙니다.

같은 라우터를 유선 회선에서 돌리면 통신사 측 발견과 구성 오류를 한 번의 테스트로 분리할 수 있습니다. 통신사가 프로토콜을 거부한다면 남은 선택지는 443에서의 다른 전송 방식이나 안쪽에서 시작하는 터널입니다.

포트를 닫기 전에 리스너 목록을 읽으십시오

불안을 부추기는 포트 스캔은 대개 활성 상태로 출하되는 기능 집합일 뿐입니다. 리스너를 목록화하고 각 소켓을 기능에 맞춘 뒤, 두 관점이 어긋나지 않도록 포트를 막는 대신 기능을 끄십시오.

ss -lntup
systemctl list-units --type=service --state=running | grep -i vpn
nc -vz 203.0.113.10 1723
nc -vzu 203.0.113.10 4500

SoftEther의 기본값이 좋은 예인데, TCP 443, 992, 5555에 L2TP/IPsec와 DNS 터널 기능이 자체 소켓을 더합니다. 그 기능들을 끄면 리스너가 숨는 것이 아니라 사라지고, 외부 호스트에서의 점검은 통신사가 포트를 통과시키는지 알려줍니다. 로컬에서 응답하는 리스너도 상류에서 닫혀 있을 수 있으므로, 라우터 자체의 WAN 주소와 외부 서비스가 보고하는 내용을 비교하십시오.

관련 글