2026년 TCP keepalive, TCP_USER_TIMEOUT, 그리고 렌탈 ProxyMac Mac mini 로의 유휴 SSH 생존
유럽이나 미국 동부에서 SSH로 ProxyMac Mac mini(홍콩·도쿄·서울·싱가포르·미국)까지 늘리는 운영자는 입력이 이어질 때는 살아 있다가, Cursor 를 7~25분 정도 유휴로 두거나 tail -f 가 한동안 조용한 뒤 세션이 사라지는 경우를 자주 봅니다. 원인이 «Apple Silicon 에서 SSH 가 고장»인 경우는 드물고, 거의 항상 소리 없이 끊는 미들박스 타이머와 생존을 증명하지 않는 기본 소켓의 조합입니다. 이 글은 이중 계층 멘탈 모델(OpenSSH keepalive 와 커널 TCP 동작), 관측 증상으로 고를 수 있는 의사결정 표, 숫자 기본값이 들어간 복붙용 ~/.ssh/config(애플리케이션 프로브 30초, 연속 4회 미응답 시 클라이언트 종료), 구체 카운터를 인용하는 7단계 증거 런북(많은 게스트 Wi‑Fi 스택에서 120초 전후로 보이는 캐리어 유휴 타이머 등), 그리고 autossh·Mosh·keepalive, 고 RTT 클라이언트 튜닝, MTU 블랙홀로 연결해 TCP 를 만지기 전에 IPQoS 가 범인이 아닌지 가릴 수 있게 합니다.
소켓 경로가 안정된 뒤에는 도움말 센터 부트스트랩을 북마크하고, 요금으로 리전을 비교하세요. 경로가 검증되지 않으면 신입이 매번 같은 패킷 손실 민담을 반복합니다.
장거리 경로에서 유휴 SSH 가 조용히 끊길 때
증상은 세 덩어리로 묶입니다. (A) 터미널이 배너도 Broken pipe 도 없이 멈추고 키를 누르기 전까지 아무 일도 없음. (B) 마지막 패킷 이후 정확히 120~900초 뒤에 client_loop: send disconnect: Broken pipe 가 출력됨. (C) 대화형 셸은 남는데 scp 나 rsync 가 0%에서 무한 정지. A 는 상류 NAT 바인딩이 만료됐는데 RST 를 보내지 않는 경우가 많고, 호텔 Wi‑Fi 처럼 UDP 음성 우선이 유휴 TCP 를 배고프게 만드는 구성에서 흔합니다. B 는 스테이트풀 방화벽이 무음 플로 최대 지속 시간을 강제하는 패턴에 자주 맞습니다. C 는 PMTUD 블랙홀과 겹치므로, keepalive 수식에 주말을 쏟기 전에 MTU 글과 대조하세요.
- SSH 터널 위 화면 공유는 키 입력이 있어도 영상 프레임이 멈추므로 유휴 간격이 길어집니다.
- 점프 호스트는 타이머를 곱합니다. 각 홉이 자체 300초 유휴 정책을 가질 수 있습니다.
- LaunchAgent 기반 git pull은 서버에서 일이 돌아가도 캐리어에는 유휴로 보일 수 있습니다.
커널 TCP keepalive 와 OpenSSH ServerAliveInterval
커널 TCP 스택은 macOS 에서 net.inet.tcp.keepidle 계열 지연 뒤 keepalive 세그먼트를 낼 수 있지만, sysctl 만으로 원격 미들박스를 통제할 수는 없습니다. 반면 OpenSSH 의 ServerAliveInterval 은 OS 기본이 2시간 이상일 수 있는 대기 없이 SSH 프로토콜 메시지를 주입해 상위 계층 타이머를 리셋합니다. 둘은 보완 관계입니다. SSH keepalive 는 SSH 연결이 살아 있음을, TCP keepalive 는 엔드투엔드로 4튜플이 여전히 존중되는지를 증명합니다.
실패 클래스별 튜닝 매트릭스
| 증상 시그니처 | 첫 손잡이 | 둘째 손잡이 | 에스컬레이션 |
|---|---|---|---|
| 유휴 > 15분, 키 입력 시 즉시 복귀 | ServerAliveInterval 30 | 점프 홉 수 줄이기 | Wi‑Fi BSSID 를 잡아 게스트 Wi‑Fi 가이드와 비교 |
| 300초 배수에서 Broken pipe | 클라이언트 TCPKeepAlive yes | ControlMaster 가이드대로 소켓 멀티플렉스 | ISP 문서화된 유휴 타이머 요청 |
| 유휴 없이도 SCP 가 중간에 멈춤 | MSS 클램프 확인 | PMTUD 테스트 실행 | 지연 매트릭스에 따라 리전 전환 |
| 야간 빌드만 실패 | 미니에서 야간 curl cron | WAN DHCP 갱신 로깅 | 작업을 미니 발 pull 로 이동 |
ProxyMac 용 클라이언트 ~/.ssh/config 레시피
리전마다 호스트 별칭을 명시적으로 이름 붙여 새 팀원이 같은 숫자를 물려받게 하세요. 아래 스탠자는 HK용이지만 JP/KR/SG/US 별칭에 그대로 복제할 수 있습니다. IPQoS 는 긴 RTT 가이드를 읽은 뒤에만 조정하세요. 처리량용과 저지연 클래스를 잘못 섞으면 대량 복사 중 keepalive 패킷이 굶을 수 있습니다.
Host proxymac-hk-dev
HostName your-node.proxymac.com
User youruser
ServerAliveInterval 30
ServerAliveCountMax 4
TCPKeepAlive yes
IPQoS throughput
ControlMaster auto
ControlPath ~/.ssh/cm-%r@%h:%p
ControlPersist 10m
SRE 가 Confluence 에 붙일 7단계 프로브 런북
ping -c 20로 베이스라인 RTT를 기록하고 중앙값과 p95를 저장한다.- 일반 SSH 를 열고 12분 유휴 후 셸이 돌아오는지 적는다.
- 일회성 세션에서
ssh -vvv를 켜고expecting SSH2_MSG_KEXINIT정지를 grep 한다. - 512MB 파일 병렬 SCP 를 돌리고 90초 후 처리량이 붕괴되면 MTU 를 의심하고 keepalive 를 의심하지 않는다.
- 기업 VPN 스플릿 터널이면 VPN 상태를 로그한다. 많은 제품이 미니 향 TCP 와 유휴 UDP를 다르게 취급한다.
- sshd 를 통제할 수 있으면 ClientAliveInterval 은 클라이언트 정책과 맞춘다. 서버가 10초 프로브, 클라이언트가 30초면 에너지 낭비다.
- 최종 설정을 아카이브해 OpenClaw 게이트웨이 systemd/launchd 메모 옆에 두어 자동화와 사람이 같은 진실을 본다.
autossh·Mosh·고 RTT 튜닝과 병행—수정 이중 적용 주의
autossh 와 Mosh 가이드는 프로세스 감독과 UDP 회복력을 다룹니다. 이 TCP 글은 평문 OpenSSH over TCP가 루프에 남아야 할 때 추가하세요. 예: git+ssh 리모트, 로컬 OpenClaw 게이트웨이로의 ssh -L 포트 포워드, Mosh 로 대체할 수 없는 rsync --partial over SSH. Cipher 나 압축 변경은 keepalive 로 생존을 증명한 뒤에 순서를 잡으세요. 대용량 복사 시 AEAD 와 CPU 부하는 IPQoS·암호 글에 설명되어 있습니다.
ServerAliveInterval 5 는 일부 DDoS 방어 장비를 자극해 프로브 폭주 뒤 TCP RST 를 보낼 수 있습니다. 엔터프라이즈 엣지에서는 완만하게 올리세요.
FAQ
미니 쪽 sysctl tcp keepidle 을 내릴까? 고객 관리 노트북에서는 보통 아니요. 먼저 클라이언트를 고칩니다. 데이터센터 인접 미니가 불안정한 다리를 거의 만들지 않습니다.
ControlMaster 가 유휴 타이머를 악화시키나? 여러 세션을 한 TCP 에 실을 수 있어 핸드셰이크 비용은 내려가지만, 그 한 줄기가 60초 UDP 굶주 Wi‑Fi 타이머에 걸리면 전부 연쇄됩니다. 경로별 개수를 봅니다.
IPv6 전용 uplink 는? Happy Eyeballs 가 IPv4 블랙홀을 가릴 수 있습니다. SSH 타깃의 주소 패밀리를 문서화한 뒤 스택마다 타이머를 다르게 두세요.
전용 ProxyMac Mac mini 가 TCP 위생을 측정하기 좋은 이유
Apple Silicon M4 렌탈 미니는 HK / JP / KR / SG / US 에 고정된 엔드포인트로 예측 가능한 피어링을 줍니다—카페 NAT 를 옮겨 다니는 개발 노트북과 대비됩니다. 연속 sysctl·nettop 베이스라인, CI 시크릿을 가진 동일 호스트에 OpenClaw 자동화, GUI 신뢰 프롬프트가 필요할 때 화면 공유를 같은 머신에서 열 수 있습니다. 이 네트워크 규율을 리전별 투명 요금과 짝지으면 금요일 밤마다 무너지는 단일 터널에 억지로 태우는 것보다 APAC 전용 타이머용 두 번째 미니가 낫다는 것을 재무에 설명하기 쉬워집니다.