VPN 없이 Git이 멈추나요? OpenSSH가 IPQoS로 패킷에 표시를 남깁니다
OpenSSH는 기본적으로 패킷에 QoS 값을 표시합니다. 경로가 그 표시를 버리면 터널이 패킷의 경로를 바꿀 때까지 push가 멈춥니다.
사무실에서 받은 클론은 되고, 같은 클론을 휴대폰 핫스팟으로 받아도 되고, 같은 클론을 호텔 네트워크에서 받으면 VPN을 켤 때까지 멈춘다. SSH 핸드셰이크는 끝나고 세션은 첫 실제 전송에서 조용해진다. 클라이언트 설정에 한 줄을 더하면 git과 ssh가 함께 낫는다. 클라이언트 설정 하나가 여러 도구를 한 번에 고칠 때, 결함은 클라이언트가 보내는 내용에 있고 그 내용이 지나가는 회선에 있지 않다.
증상을 경로 차이로 읽는다
문제를 낫게 하는 터널은 드물게 수리가 된다. 경로와 통신사와 중간 장비를 바꿔 버리는 동안 노트북은 똑같은 패킷을 계속 만들어 낸다. 어떤 경로가 헤더를 잘못 다루고 다른 경로가 그것을 그대로 통과시키면, 차이는 중간 장비의 정책에 있고 클라이언트에 있지 않다. 여기서 터널은 증인이지 해법이 아니다.
세션이 죽는 지점에서 범위가 더 좁아진다. 이름 조회나 키 교환에서 실패하는 것은 이렇게 보이지 않는다. 인증하고 배너를 출력한 뒤 첫 대량 쓰기에서 얼어붙는 세션은 경로와 이름과 자격 증명이 모두 동작한다는 것을 이미 증명했다.
클라이언트는 모든 SSH 소켓에 QoS 바이트를 찍는다
7.8부터 모든 OpenSSH 연결은 라우터가 트래픽의 우선순위를 정하는 데 쓸 수 있는 값을 IP 헤더에 담으며, 터미널 세션에는 한 값이, 대량 복사에는 다른 값이 붙는다. 사람이 타이핑하는 일이 파일 전송보다 나은 대접을 받아 마땅하다는 이론이다. 대부분의 네트워크는 이 힌트를 완전히 무시하기 때문에 몇 년 동안 눈에 띄지 않는다. 일부 Wi-Fi 드라이버와 이동통신사와 VPN 집선 장치만 이에 반응하고, 그중 일부는 나쁘게 반응한다.
그 값이 흐름 중간에 다시 쓰이거나 버려지면 연결은 실패하지 않고 앞으로 나아가지 못한다. 재전송이 늘고 창이 무너지며, 오류를 낸 것이 없으므로 애플리케이션은 아무것도 보고하지 않는다. 사람들이 이 증상을 장애가 아니라 멈춤이라고 부르는 이유가 바로 그 침묵이다.
먼저 ssh -V 로 클라이언트 빌드를 확인한다. 7.8 이상이면 이 동작이 기본으로 들어 있다.
이것을 MTU와 DNS에서 갈라내는 세 명령
설정 파일을 고치기 전에 비슷한 원인 두 가지를 먼저 배제해야 한다. MTU 결함은 작은 교환을 통과시키고 첫 큰 패킷에서 얼어붙으며, 이름 결함은 세션 자체를 만들지 못한다.
ssh -o IPQoS=none -v [email protected]
ssh -G [email protected] | grep -i ipqos
sudo tcpdump -ni any -vv "tcp port 22"
첫 명령은 표시를 끈 상태로 실패하는 작업을 반복하며, 이것이 성공하면 구할 수 있는 가장 강력한 단일 증거가 된다. 둘째는 클라이언트가 그 목적지에 실제로 적용할 설정을 출력하므로 잊고 있던 파일의 낡은 항목을 잡아낸다. 셋째는 전송이 멈춰 있는 동안 양방향의 TOS 바이트를 보여 주며, 흥미로운 패턴은 깨진 경로에는 값이 있고 동작하는 경로에는 없다는 것이다.
캔처는 서버가 아니라 노트북에서 하는데, 값을 정하는 것은 보내는 쪽이고 어느 방향에서든 바뀜 수 있기 때문이다. 동작하는 경로와 실패하는 경로를 같은 캔처로 비교하면 짐작 없이 차이가 드러난다.
예외는 파일 하나에, 호스트 하나씩 적는다
예외는 적용 대상 호스트 옆에 두고, 왜 존재하는지 주석으로 밝힌다.
Host gitlab.example.internal
IPQoS none
# direct route rewrites the marking; the tunnel route passes it
값 자체보다 범위가 중요하다. 와일드카드 항목은 동작을 어디서나 끄고, 얌전한 네트워크에서 도움이 되는 힌트를 버리며, 언제 생겼는지 아무도 말할 수 없게 만든다. 호스트별 항목은 읽기 쉽고 되돌릴 수 있으며 네트워크가 고쳐진 뒤 지우기도 아주 쉽다. 개인적 우회에는 사용자 파일을, 조직 전체에 같은 예외가 필요하면 관리 파일을 쓴다.
예외가 무엇을 덮지 않는지 분명히 밝힌다. 대상은 SSH이므로 HTTPS 원격 저장소와 패키지 미러와 브라우저는 모두 그 밖에 있고, 그중 무엇이 실패하든 각자의 증거가 필요하다. 배스천을 거치는 사슬에서는 모든 홉이 클라이언트 설정을 쓰고, 멈추는 홉이야말로 범위를 좁힐 가치가 있다.
네트워크 담당자와 고리를 닫는다
발견을 네 가지 사실로 넘긴다: 클라이언트 버전, 시험한 경로, 쓰는 VPN 클라이언트, 표시를 실은 방향. 이 넷이면 네트워크 담당자가 그 대접을 재현하고 의도적인지 판단할 수 있다.
예외가 멈춤을 낫게 하지 못하면 없앤다. 실패한 실험을 살아남은 우회는 전설이 되고, 다음 사람은 그것이 아무 일도 하지 않음을 증명하느라 한 시간을 쓴다. 낫게 한다면 그 경로는 그것을 지나는 다른 모든 도구에 여전히 잘못된 길이고, 수리는 중간 장비를 운영하는 사람의 몫이다.
클라이언트 쪽 변경은 만료일이 붙은 임시방편이다. 그 날짜를 주석에 적는다.