sshuttle - 더 나은 ssh 터널

3579 단어 networkingdevops

동기



언젠가는 사설 VPC 네트워크로 방화벽이 설정된 Kubernetes API 서버에 액세스해야 했습니다. 이 클러스터에 액세스하기 위해 별도의 배스천 인스턴스를 설정하고 싶지 않았습니다. 모든 작업이 kubectl 를 사용하여 클라이언트-서버 API를 통해 수행될 수 있기 때문에 K8에서 TBH 배스천이 다소 중복되기 때문입니다. 따라서 신뢰할 수 있는 네트워크에서 안전한 방식으로 이 API 서버에 액세스하기만 하면 됩니다. 친구 덕분에 sshuttle 에 대해 알게 되었습니다. sshuttle는 실제로 VPN이 아니지만 VPN처럼 작동한다는 점에서 매우 독특합니다(가장 실용적인 목적을 위해). sshuttle를 사용하면 복잡한 포트 전달이나 VPN을 처리할 필요 없이 VPC 내부의 신뢰할 수 있는 노드를 통해 내부 네트워크에 액세스할 수 있습니다.

기본 아이디어는 매우 간단합니다. sshuttle 호스트 시스템에서 로컬python 서버를 시작하고 지정된 CIDR 블록의 대상 패킷을 이 로컬 서버로 라우팅하는 규칙을 생성합니다iptables. 서버에서 패킷은 ssh 세션을 통해 다중화되어 서버로 전송됩니다. 서버는 다중화된 패킷을 분해하고 이를 업스트림으로 라우팅합니다. 따라서 기본적으로 이것은 TCP를 통한 TCP를 피하기 위한 영리한 해킹입니다(이는 다시 신뢰할 수 없는 네트워크에서 엉망입니다). ssh의 다중화 스트림은 단일 상태 저장 TCP 연결입니다(상태 비저장 VPN 연결과 비교). 이제 어떻게 대상 서버가 패킷을 분해하는지 궁금할 것입니다. 예, 당신을 위해 실행하는 일종의 sshuttle 데몬이 필요합니다. 이것은 sshuttle가 몇 가지 마법을 수행하는 곳입니다. 이 작업을 수행하기 위해 대상 호스트에 Python 스크립트를 자동으로 배포합니다. 예, sshuttle가 작동하려면 클라이언트와 대상 모두 pythoniptables가 설치되어 있어야 합니다.

용법


sshuttle -r user@port x.x.x.x
CIDR 블록으로 라우팅된 모든 패킷은 이제 sshuttle 데몬을 통과하게 됩니다. iptables 규칙을 구성했기 때문입니다.
또한 sshuttle는 호스트 시스템에서 로컬 파이썬 서버를 시작합니다. netstat를 사용하여 볼 수 있습니다.

$ sudo netstat -tunapl | grep python
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.1:12300         0.0.0.0:*               LISTEN      27425/python         

내 호스트 컴퓨터의 포트python에서 수신 대기하는 12300 서버가 있습니다. 실제로 확인하려면 sshuttle 에 의해 시작되며 pstree -p | less 를 사용하고 sshuttle 를 검색할 수 있습니다. 여기에서 sshuttle가 실제로 python 서버를 시작했고 PID( 27425 )가 netstat 명령에서 본 것과 일치하는 것을 볼 수 있습니다.

    -zsh(13201)---sshuttle(27425)-+-ssh(27446)---ssh(27447)
                                    `-sudo(27427)---python(27445)
--dns 플래그를 사용하여 DNS 쿼리를 전달할 수도 있습니다. 이것은 프라이빗 영역에서 DNS 레코드를 호스팅하는 Route53과 같은 것이 있는 경우 매우 유용합니다(예: .internal 와 같은 tld ).

SSH 터널보다 낫습니까?



예, 다음을 사용하여 ssh로 포트 포워드할 수도 있습니다.ssh -nNT -L <local-port>:{upstream-host}:{upstream-port} user@remotessh 터널의 문제는 정상적인 WiFi 연결에서 빈번한 패킷 손실을 경험하고 이를 처리하는 것이 상당히 실망스럽다는 것입니다. 또한 개인 네트워크의 여러 포트에 액세스해야 하는 경우가 있어 -L 플래그를 명시적으로 제공해야 하므로 번거롭다고 생각합니다. 또한 ssh는 TCP만 수행할 수 있으므로 DNS 쿼리(UDP를 통해)를 전달할 수 없습니다.
sshuttle 덕분에 내 인생이 너무 단순해졌습니다!

지느러미!

원래 게시 됨 my blog

좋은 웹페이지 즐겨찾기