SSH는 연결되고 프롬프트도 뜨지만, 명령이 뭔가 큰 것을 돌려주는 순간 세션이 죽습니다. 에코는 잠깐 더 되다가 연결이 시간 초과되는데, 클라이언트는 여전히 터널이 올라와 있다고 표시합니다. 데이터가 도착할 때까지 멀쩡하던 세션은 보통 SSH 결함이 아니라 크기 한계에 부딪힙니다. 아래 점검은 가장 값싼 설명부터 걸러내도록 짜여 있습니다.

프로필을 만지기 전에 실패의 모양을 읽으세요

작은 패킷은 통과하고 가득 찬 패킷은 통과하지 않습니다. 프롬프트나 배너, 키 한 번은 쉽게 들어가지만 디렉터리 목록, 내려받기, 붙여 넣은 블록은 들어가지 않습니다. 동작이 바뀌는 그 크기가 단서이고, SSH가 관련 프로그램이라는 사실이 단서가 아닙니다.

메커니즘은 경로 MTU 탐색이며, 이는 피드백에 의존합니다. TCP는 세그먼트 크기를 고르고, 경로상의 라우터가 그 결과 패킷을 전달할 수 없으면 ICMP 메시지로 알려야 합니다. 캡슐화 때문에 바깥 패킷이 안쪽보다 커지므로, 터널 안에서 쓸 수 있는 크기는 항상 물리 링크보다 작습니다. 그 ICMP 메시지를 어디선가 걸러 버리면 보낸 쪽은 보정을 영영 받지 못하고 가득 찬 세그먼트를 계속 보내며, 바깥 패킷은 아무 통보 없이 버려집니다.

양쪽에서 상한을 재세요

둘 중 하나를 바꾸기 전에 터널의 MTU와 물리 링크를 비교하세요. 물리 값을 그대로 복사한 터널이라면 어긋남이 어디에 있는지 이미 말해 준 셈입니다.

터널 안쪽에서 단편화를 금지한 요청으로 시험하고, 응답이 돌아올 때까지 페이로드를 낮춥니다. 크기 인수는 페이로드만 세므로, 통하는 값은 항상 인터페이스 MTU보다 작습니다. 인터페이스 수치가 필요하면 헤더 크기를 다시 더하세요.

ip link show tun0
ping -M do -s 1380 10.9.0.1

터널 밖에서 서버의 공인 주소를 상대로 같은 시험을 반복하세요. 거기서도 큰 시험이 실패하면 한계는 서버로 가는 경로에 있고, 어떤 터널 설정도 그것을 옮기지 못합니다. 그 비교를 해 두면 애초에 원인이 아니던 클라이언트를 조정하지 않아도 됩니다. 설정 파일을 열기 전에 두 결과를 적어 두세요.

mssfix와 fragment는 하는 일이 다릅니다

mssfix은 터널 안의 TCP 연결이 핸드셰이크 때 알리는 세그먼트 크기를 제한합니다. SSH와 HTTPS, 파일 복사에 맞는 지렛대라서, 설정하는 순간 멈춤이 사라지는 일이 많습니다. UDP 페이로드에는 전혀 손대지 않습니다.

UDP 서비스까지 나르는 터널은 SSH를 고친 뒤에도 계속 실패할 수 있고, 그 결과는 설정 하나로 모든 것이 해결된다고 여기는 사람을 반드시 혼란스럽게 합니다.

fragment은 다른 메커니즘이고 다른 도구입니다. 캡슐화 전에 지나치게 큰 패킷을 쪼개고, UDP 전송에만 적용되며, 데이터그램마다 부담을 더하고, 깨진 탐색을 위한 마지막 수단으로 문서화되어 있습니다. 두 설정은 터널을 끝내는 상대편에서 일치해야 합니다. 한쪽이 제한하고 다른 쪽이 쪼개면 로그 경고와, 파일만 보고는 아무도 예측할 수 없는 동작이 생깁니다.

인터페이스 MTU를 낮추는 것은 거친 선택입니다

양끝에서 인터페이스 MTU를 줄이는 것은 거친 도구입니다. 안쪽의 모든 송신자에게 더 작은 숫자를 알려 주므로 효과는 있지만, 그 비용을 필요한 TCP 흐름이 아니라 모든 트래픽에 지웁니다.

터널이 제한할 수 없는 트래픽을 나르거나, 클라이언트가 프로필을 통제할 수 없는 기기일 때 고르세요. 대칭으로 적용하고 값을 프로필 옆에 기록하세요. 절반만 적용한 변경은 고쳐진 것처럼 보이므로 아무것도 하지 않은 것보다 나쁩니다.

멈췄던 전송으로 다시 시험하세요

설정이 로드되도록 다시 연결하고, 새 연결을 열어 얼어붙었던 명령을 반복하세요. 세그먼트 크기는 핸드셰이크 때 협상되므로, 재연결을 견딘 세션은 아직 옛 값을 지니고 있습니다. 여기서 ping이 약한 시험인 것은 실패의 본질이 작은 패킷은 통과한다는 데 있기 때문입니다. 깨졌던 목록, 내려받기, 붙여 넣기를 쓰세요.

더 작은 크기에서도 멈춤이 이어지면 흐름을 만료시키는 상태 저장 방화벽, 중복 주소, 재연결 때 움직이는 경로 같은 다른 곳을 보세요. 실패한 시험 크기와 바꾼 설정을 기록하면 그 짝이 다음 보고를 쓸모 있게 만듭니다.

관련 글