SSH 터널 / 세션에 UDP 홀 펀칭을 사용하는 방법


21

주말 별장에 Raspberry Pi를 배포하고 싶습니다. Raspberry Pi는 온도를 기록하고 고정 IP를 가진 원격 서버로 전송하여 데이터를 저장하고 간단한 웹 사이트에 표시합니다.

그러나 Raspberry Pi에서 무언가를 변경하려는 상황이 발생할 수 있습니다. 예를 들어 시스템 업데이트 또는 데이터를 서버로 보내는 프로그램의 변경 등.

제안 된 설정으로 LAN 외부에서 Raspberry Pi에 연결할 수 없습니다.

참고 : 네트워크를 변경하고 싶지 않으며 기존 라우터에는 포트 전달, dynDNS 또는 VPN 기능이 없습니다.

최근에 UDP 홀 펀칭을 읽었습니다. 기본 아이디어는 클라이언트가 UDP 패키지를 알려진 서버 주소 (즉, 공용 IP 또는 dynDNS가 활성화 된 상태)로 전송한다는 것입니다. 클라이언트 A에 연결하려는 클라이언트 B는 서버에게 클라이언트 A의 공용 IP 및 포트 번호를 요청합니다.

그런 다음 동적 인 공용 IP 및 포트에서 클라이언트 A에 직접 연결할 수 있습니다. 클라이언트 A가 현재 사용 된 포트에서 서버에 처음 연결되었으므로 NAT는 패키지를 클라이언트 A로 전달합니다.

아이디어를 정확하게 요약했으면 좋겠다.

이 모든 것이 멋지게 들리지만, 문제는 라우터가 TCP 연결의 핸드 셰이크를 "이해"할 수 있고 올바르게 구축되지 않으면 앞으로 전달되지 않기 때문에 TCP 연결로 작동하도록 보장되지 않는다는 것입니다 패키지.

따라서 클라이언트 A가 dynDNS, 고정 공용 IP 또는 포트 전달 기능이있는 라우터 뒤에 있지 않고 클라이언트 B에서 클라이언트 A로 SSH 세션을 열려면 어떻게해야합니까? 공개, 고정 IP 또는 도메인 이름을 가진 중앙 서버의 사용은 어려울 수 있습니다.


UDP 홀 펀치는 가능하지만 TCP는 불가능한 인터넷 연결 장치가 있습니까? 더 나은 NAT 장치를 얻으십시오.
cpt_fink

나는 udp로 ssh를 수행하지 않았지만 여기에 링크가 있습니다 zarb.org/~gc/html/udp-in-ssh-tunneling.html
barlop

나는 모르지만 ssh guru에게 물었다 .ssh가 udp를 전달할 수 있다고 말했지만 그것이 VPN처럼 작동하고 스위치가있는 경우에만 그는 말했다. -w그러나 그는 tcp를 통해 udp라고 말했다. ssh로 udp를 전달하려는 시도가 포함됨), 대기 시간이 길고 더 이상 원하지 않는 항목의 재전송과 같은 문제가 포함됩니다. 그래도 시도하는 것이 여전히 흥미로운 것 같습니다. 나는 ssh와 -w를 통해이 VPN을 여기에서 언급했다. wiki.archlinux.org/index.php/VPN_over_SSH
barlop

인바운드 포트를 열고 싶지 않은 이유가 궁금합니다. -이것은 최고의 보안을 요구하는 시나리오처럼 들리지 않습니다. 또는 클라이언트 B가 클라이언트 B가 액세스 할 수있는 서버에 대한 역방향 포트 바인딩으로 아웃 바운드 SSH 연결을 유지할 수 있습니다. 그렇게하면 중개인 서버를 통해 연결할 수 있습니다. 그러나 이러한 종류의 배열은 실패하기 쉽기 때문에 물리적 접근이 제한적일 때 정렬이 잘못되면 바람직하지 않습니다.
kabadisha

답변:


8

pwnat


".. NAT 뒤에 있는 피어와 의 연결을 시작하는 것은 쉬운 일이 아닙니다 . "

".. 거의 모든 NAT 구현 은 최근 일치하는 아웃 바운드 요청에 해당하지 않는 인바운드 트래픽의 전달을 거부합니다 . "


"..이 pwnat도구는 자율 NAT 탐색을 GNU / Linux 전용의 독립형 구현입니다 . NAT 뒤의 서버에 접속 한 후 UDP 패킷을 사용하여 TCP 의미를 가진 채널을 설정 합니다. NAT 뒤의 클라이언트와 서버를 모두 지원합니다 . (NAT 중 하나가 가짜 [사용자 정의] ICMP 메시지를 전송할 수있는 경우)이 구현 은 최종 사용자를 대상으로합니다. "


  
사용법 : ./pwnat <-s | -c> <args>

  -c 클라이언트 모드
    <args> : [로컬 IP] <로컬 포트> <프록시 호스트> [프록시 포트 (def : 2222)] <원격 호스트> <원격 포트>

  -s 서버 모드
    <args> : [로컬 IP] [프록시 포트 (def : 2222)] [[허용 된 호스트] : [허용 된 포트] ...]

  -6 IPv6 사용  
  -v 디버그 출력 표시 (최대 2 개)  
  -h 도움말 표시 및 종료  

예 :  

    누구나 프록시 할 수있는 서버 측 :
      ./pwnat -s

    google.com:80에 연결하려는 고객 :
      ./pwnat -c 8000 <pwnat.server.com> google.com 80
    그런 다음 http : // localhost : 8000으로 이동하여 Google을 방문하십시오!  


pwnat;  네트워크 신호 흐름 차트


"를 가능하게하는 핵심 아이디어 서버클라이언트의 IP 주소를 배울는 위한 서버주기적으로 고정 된, 알려진 IP 주소로 메시지를 보낼 수 있습니다. 가장 간단한 방법은에 ICMP 에코 요청 메시지를 사용하여 할당되지 않은 IP 주소 와 같은 1.2.3.4 1.2.3.4가 할당되지 않았으므로 ICMP REQUEST 는 기본 경로가없는 라우터에 의해 라우팅되지 않습니다. "

"1.2.3.4로 전송 된 메시지의 결과로 NAT는 이 요청 에 응답 하여 회신을 라우팅 할 수있게 됩니다. 연결 클라이언트는 이러한 응답을 위조합니다. 구체적으로, 클라이언트는을 나타내는 ICMP 메시지를 전송합니다 TTL_EXPIRED. 인터넷 라우터가 메시지를 합법적으로 전송할 수 있으며 보낸 사람 주소가 서버의 대상 IP와 일치하지 않아야합니다. "

" (가짜) ICMP의 응답에 대한 서버를 기울인다수령에 따라, IP가 보낸 사람에게 연결 개시 는 ICMP 응답에 지정합니다. 클라이언트가 전역 적으로 라우팅 IP 주소를 사용하는 경우 이 완전히 문제가없는 것입니다 모두 TCP 나 UDP를 사용할 수 있습니다 클라이언트사전 동의 된 포트 에서 청취 하는 경우 양방향 연결을 설정합니다 . "

"(사전 합의 된 포트가없는 경우 대부분의 경우 ICMP ECHO 응답 페이로드일부로 포트 번호를 전달할 수 있습니다 ."


출처 : http://samy.pl/pwnat.pdf
https://github.com/samyk/pwnat


pwnat는 localhost와 localhost 연결조차 거의 기능하지 않습니다. 일부 패킷을 보내고받을 수 있지만 강력한 연결을 설정하는 데는 그다지 유용하지 않습니다.
스콧

@Scott 글쎄, 그것은 흥미로운 해킹이지만 실제로 ICMP와 같은 네트워크 프로토콜의 오용 및 남용을 기반으로 한 개념 증명입니다. 나는 그것에 의존하지 않을 것입니다. 오래되고 유지 관리되지 않았으므로 사용하지 않는 것이 좋습니다. 질문에 UDP 홀 펀칭을 구체적으로 명시하지 않았다면 언급조차하지 않았을 것입니다. 신뢰할 수있게하려면 VPN 터널을 연결하십시오.
목소리

불만은 없지만 "이 솔루션은 프로덕션 환경에서 사용하기에 적합하지 않습니다"는 잠재적으로 안정적인 솔루션을 찾는 사람에게 유용한 정보라고 생각합니다.
스콧

@Scott 그런 환경이나 그런 환경에서 사용해서는 안됩니다. 많은 독점 제품이 thesez 기술을 사용합니다. 어쨌든 사람들이 스스로 결정을 내릴 수있는 충분한 정보가 여기에 있습니다. 나는 그것을 추천하지 않습니다. 그러나 VPN 터널을 사용합니다. 반면에 일부 네트워크는 VPN 트래픽을 필터링하므로 사례별로 처리해야합니다. NAT 라우터를 통과하는 데 도움이 필요하십니까?
목소리

리버스 SSH 터널을 사용하여 두 개의 NAT 시스템을 연결하는 현재 실행 가능한 솔루션이 있습니다. 그러나 고정 IP가 있거나 라우터에서 포트 전달을 구성 할 수있는 "중간자"시스템이 필요합니다. 이것은 내가 그 중개인을 잘라낼 수 있었을 것입니다. 오 잘
스콧


0

다소 더럽지 만 쉬운 솔루션이지만 netcat을 사용하는 것은 어떻습니까? Raspberry Pi에서 명령을 반복하는 스크립트를 만들 수 있습니다.

nc <public_ip> <port1> | sh | nc <public_ip> <port2>  

로컬 호스트에서 다음을 수행하십시오.

nc -l <port1>

과:

nc -l <port2>  

첫 번째 인스턴스에서 명령을 입력하고 두 번째 인스턴스에서 응답을 볼 수 있습니다.


이것은 "UDP 홀 펀칭" 과 어떤 관련이 있습니까?
목소리

어떻게이 NAT를 통과합니까?
ZEE September
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.