Android SSH SOCKS 프록시: 앱 절반만 연결되는 이유
ssh -D는 SOCKS 리스너를 만들 뿐, 기기 전체 터널이 아닙니다. 앱에서 어댑터와 SSH까지 사슬을 따라가고, DNS와 수명 주기의 빈틈을 확인하세요.
SSH로 로그인하고 -D 1080를 추가하면 명령이 성공합니다. 이제 휴대폰에 SOCKS 리스너가 생겼는데도 앱 절반은 여전히 모바일 데이터로 나갑니다. 이것은 정상적인 결과이지 끊긴 터널이 아닙니다. ssh -D가 만드는 것은 프록시 끝점이고, Android 앱은 무언가가 강제하지 않는 한 프록시를 쓰지 않습니다. 사슬을 한 단계씩 따라가면 작업의 각 조각이 실제로 어디에 있는지 보입니다.
트래픽이 시작되는 곳에서 시작하세요
터널을 써야 할 앱 하나를 골라 자체 프록시 설정이 있는지 확인합니다. SOCKS 항목이 있는 브라우저는 쉬운 경우입니다. 127.0.0.1:1080를 지정하고, 설정이 있으면 원격 DNS를 켜면 요청이 지나갑니다. 채팅 클라이언트, 지도 앱, 그런 항목이 없는 게임은 리스너를 쓸 방법이 없고, SSH 명령에 무엇을 적어도 달라지지 않습니다.
다른 무엇을 엮기 전에, SOCKS를 직접 말하는 클라이언트로 휴대폰 자체 셸에서 리스너가 동작함을 증명하세요.
ssh -N -D 1080 [email protected]
curl --socks5-hostname 127.0.0.1:1080 https://ifconfig.me
돌아오는 주소는 휴대폰이 아니라 SSH 서버의 것이어야 합니다. 그렇다면 프록시 절반은 끝났고 나머지는 적용 범위의 문제입니다. 아니라면 먼저 SSH 쪽을 고치세요. 키 인증, 서버가 목적지에 닿는 능력, 그리고 SSH 서버 자체의 출구입니다.
Android가 필요로 하는 조각을 더하세요
프록시 설정이 없는 앱에는 패킷을 잡아 프록시 연결로 바꿔 주는 무언가가 필요합니다. root가 없는 기기에서는 VPN 서비스 어댑터입니다. 가상 인터페이스를 넘겨받아 선택한 트래픽을 로컬 SOCKS 리스너로 보내는 앱입니다. 사슬은 앱, 어댑터, SOCKS 리스너, SSH 연결, 목적지가 됩니다.
어댑터를 설치하고 VPN 권한을 주고 잡아야 할 앱이나 경로를 고릅니다. 상태 표시줄의 열쇠 아이콘은 그때 어댑터를 뜻하며 별도의 상용 VPN이 아닙니다. Android는 사용자 프로필마다 활성 VPN 서비스 연결을 하나만 허용하므로 두 번째 VPN 앱을 켜도 사슬 위에 층이 더해지지 않습니다. 같은 역할을 두고 경쟁할 뿐입니다.
이 단계에서는 성공한 시험이 여러분을 속일 수 있습니다. 어댑터가 이미 프록시로 향한 브라우저만 잡도록 설정되어 있다면 모두 동작하고 다른 것은 아무것도 덮이지 않습니다. 기기가 터널에 들어갔다고 결론 내리기 전에 잡기 목록을 읽으세요.
SSH 전송을 잡기 밖에 두세요
SSH 연결 자체가 그것이 유지하는 SOCKS 터널로 다시 들어가면 안 됩니다. 어댑터가 SSH 앱의 트래픽을 잡으면 터널은 터널을 기다리는 연결에 의존하고, 결과는 어댑터가 시작되는 순간 멈추거나 실패하는 고리입니다.
통합 구현은 자기 전송 소켓을 보호합니다. 앱이 분리되어 있으면 지원되는 예외가 필요합니다. SSH 앱을 잡기 밖에 두거나 주소로 SSH 끝점을 제외합니다. 둘 다 대가가 있습니다. 터미널 앱 전체를 제외하면 무관한 네트워크 활동도 터널에서 빠지고, 주소 예외는 서버 주소가 바뀌거나 다음 연결에서 이름이 다르게 풀리면 깨집니다.
예외는 바깥에서 확인하세요. 어댑터를 다시 연결한 뒤 SSH 세션이 살아남고 프록시를 거친 요청이 여전히 서버 주소를 보고하는지 확인합니다. 어댑터가 시작될 때까지 동작하다가 얼어붙는 세션이 바로 그 고리입니다.
DNS와 UDP를 사슬 끝까지 따라가세요
OpenSSH의 동적 전달은 TCP 연결을 나릅니다. UDP 어소시에이트나 ICMP 전송이 아니며, 어댑터는 UDP 패킷을 받아들여 UDP 전달을 만들어 낼 수 없습니다. QUIC과 WebRTC 미디어를 포함해 UDP를 고집하는 것은 앱에 따라 실패하거나 TCP로 되돌아갑니다.
DNS는 자기 결정이 필요합니다. 이름을 로컬에서 푸는 앱은 연결 전에 보통의 리졸버로 질의를 보내므로, 터널은 연결을 나르지만 조회는 나르지 않습니다. 원격 DNS 선택이 있는 프록시 인식 클라이언트는 그것을 피하지만, 그런 선택이 없는 잡힌 앱은 피하지 못합니다. 어댑터가 바꿨다고 가정하지 말고 어느 리졸버가 답했는지 확인하세요.
SOCKS 리스너는 loopback에 묶어 두고, 처음 쓸 때 SSH 서버의 호스트 키를 검증하고, 최종 사이트에는 평소의 HTTPS 검증을 그대로 두세요. SSH는 휴대폰에서 서버까지 구간을 보호할 뿐, 서버가 그다음에 하는 일을 암호화하지는 않습니다.
두 수명을 확인하고 결정하세요
어댑터와 SSH 세션은 수명이 따로입니다. 어댑터가 계속 잡는 동안 SSH가 끊기면 앱이 뚜렷한 오류 없이 멈출 수 있습니다. 패킷은 여전히 동작하는 출구가 없는 가상 인터페이스로 들어가기 때문입니다. 어댑터가 멈추면 앱은 기기의 VPN 정책에 따라 직접 나가거나 차단됩니다.
두 방향을 일부러 시험하세요. 어댑터를 켠 채 SSH 세션을 죽이고, 다음에는 SSH를 살린 채 어댑터를 멈춥니다. 각 경우에 휴대폰이 하는 일이, 설치 안내가 무엇을 말했든, 실제로 배포하는 정책입니다.
예측 가능한 실패 방식을 갖춘 기기 전체 범위가 필요하다면 진짜 IP VPN, 또는 이 사슬을 위해 설계되고 유지되는 어댑터가 정직한 답입니다. 무관한 잡기 앱 옆에 그냥 돌려 둔 셸 세션은 유지되는 기기 터널이 아닙니다. 둘 중 하나가 끝날 때 무슨 일이 일어나는지에 대한 합의가 없는 두 부품입니다.