OpenVPN이 연결되었다고 말하는데 아무 트래픽도 움직이지 않는다. 이 문장은 적어도 다섯 가지 무관한 고장을 덮고 있다. 어느 계층이 실패하는지 알기 전에 방화벽 규칙을 편집하면 미지수가 늘어나고 다음 엔지니어에게 혼란을 남긴다. 대신 프로세스에서 바깥으로 작업하라. 아래의 각 단계는 한 단계를 정리하거나 패킷이 죽는 지점을 좁히기 때문이다. 여기서는 순서가 중요하다: 어느 주소가 바인딩되었는지 알기 전에 뜬 캡처는 무언가를 증명하겠지만, 필요한 것은 증명하지 못한다.

소켓은 바인딩되었거나 아니거나

활성이라고 보고하는 서비스도 의도하지 않은 주소나 전송에 바인딩되어 있을 수 있다. 소켓 자체에 물어보라. ss -lunp은 UDP 리스너를 나열하고 ss -ltnp은 TCP를 나열하며, 읽을 가치가 있는 열은 로컬 주소이지 상태가 아니다.

빈 응답은 보통 프로세스가 시작 후 종료되었거나, 다른 구성 파일을 로드했거나, 전화를 거는 주소와 다른 주소에서 듣고 있다는 세 가지 중 하나를 뜻한다.

ss -lunp | grep 1194
ss -ltnp | grep 1194

local 지시문은 리스너를 단일 주소에 고정하므로, 같은 호스트의 다른 곳을 향한 클라이언트는 거부되지만 서비스는 밖에서 여전히 건강해 보인다. 인스턴스 이름도 한 번도 편집하지 않은 파일을 가리킬 수 있으며, 이는 두 프로필을 나란히 실행하는 호스트에서 일어난다.

바깥 패킷을 캡처하라, 터널이 아니라

물리 인터페이스와 실제 포트에서 필터링하되 자신의 인터페이스를 넣어라: tcpdump -ni eth0 udp port 1194. 돌아오는 것이 없는 발신 패킷은 위쪽에 있는 것을 가리킨다. 제공자 필터링, NAT 장치, 또는 생각하는 것과 다른 원격 주소다. 양방향 모두 침묵하면 클라이언트 라우팅이나 로컬 방화벽을 가리킨다. 터널 진행 없이 도착하는 응답은 제어 채널, 즉 키나 암호 불일치를 가리키지 필터링을 가리키지 않는다.

양방향을 캡처하고 파일은 짧게 유지하라. 긴 캡처는 흥미로운 세 초를 묻어버리고, 답은 거의 항상 첫 교환에 있다.

먼저 카운터, 추적은 그들이 거짓말할 때만

카운터부터 시작하라, 비용이 들지 않기 때문이다. nft list ruleset 또는 iptables -L -n -v이 여기서 중요한 유일한 질문에 답한다: 규칙이 일치했는가? 순서가 결과를 결정한다. 첫 일치가 이기므로 나중 ACCEPT보다 앞선 넓은 DROP은 그 ACCEPT를 죽은 채로 두고, 그래서 규칙을 추가하는 일이 그렇게 드물게 무언가를 고친다.

소유권도 사람들을 넘어뜨린다. 커널은 로컬에서 생성된 패킷을 소켓을 연 프로세스에 귀속시키고, OpenVPN은 보통 root로 실행되므로 일반 사용자 ID에 묶인 규칙은 터널 자체의 트래픽을 결코 보지 못한다. 규칙이 틀렸다고 판단하기 전에 소유 UID를 확인하라.

카운터가 모호하게 남을 때만 로그가 소음할 가치가 있고, 그때도 좁은 구간에만 해당한다. 속도를 제한하고 로그 줄에 접두사를 붙이는 iptables 규칙, 또는 nft monitor trace이 실행 중인 상태에서 meta nftrace set 1을 지닌 nftables 규칙이다. 추적은 패킷을 받아들였거나 버린 체인과 규칙을 지목한다. 나중에 둘 다 제거하고 페이로드 로깅은 배제하라.

전송도 확인하라. TCP로 한정된 방화벽 서비스는 그 번호의 UDP 리스너에 대해 아무 말도 하지 않으므로, 올바르게 읽히는 규칙도 모든 패킷을 버릴 수 있다.

라우팅과 돌아오는 길

받아들여졌는데도 사라지는 패킷은 목적지 경로를 조사해야 한다. ip route get은 한 주소에 선택된 경로를 보고하고, 역경로 필터링은 메인 테이블이 결코 선택하지 않을 인터페이스로 도착한 응답을 버릴 수 있다. 증상은 방화벽 드롭과 정확히 같아 보이므로, 이 확인은 또 다른 NAT 규칙보다 먼저 온다.

게이트웨이에서는 input 체인 대신 포워딩과 forward 체인을 검사하라. 그다음 원격 측이 소스 주소에 도달하는 방법을 아는지 확인하라. 돌아오는 것이 없는 발신 경로는 두 경우 모두 침묵이기 때문이다.

기록이 말해야 할 것

각 변경마다 시험한 단계, 읽은 증거, 그 양쪽의 카운터 값을 적어라. 그 기록이 "지금은 작동한다"를 다음 검토에서도 살아남게 한다.

두 가지 지름길이 기록을 정직하게 유지한다. 호스트를 한 번도 떠나지 않은 패킷은 다른 곳의 규칙에 의해 버려졌을 수 없다. 원격 측 구성이 아무리 그럴듯해 보여도 마찬가지다. 떠났다 돌아온 패킷은 질문을 네트워크 계층 위로 옮기며, 거기서는 방화벽 카운터가 더 이상 할 말이 없다.

관련 글