SSH 터널을 통한 UDP 트래픽


66

제목은 거의 요약합니다. SSH 터널을 통해 UDP 트래픽을 보내려고합니다. 특히 터널을 통해 UDP 패킷을 보내고 서버가 다른 쪽에서 나에게 다시 보낼 수 있어야합니다. TCP 연결을 수행하는 방법을 알고 있습니다. UDP로 가능합니까?

답변:


36

이 작은 안내서 는 대부분의 UNIX 유사 운영 체제에서 표준 (ssh, nc, mkfifo)으로 제공되는 도구를 사용하여 SSH를 통해 UDP 트래픽을 보내는 방법을 알려줍니다.

SSH 연결을 통한 UDP 터널링 수행

단계적으로 SSH 연결로 TCP 전달 포트를여십시오.

로컬 시스템 (로컬)에서 추가 -L 옵션을 사용하여 SSH를 사용하여 원격 시스템 (서버)에 연결하여 TCP 포트가있는 SSH를 전달하십시오.

local# ssh -L 6667:localhost:6667 server.foo.com

그러면 로컬 컴퓨터의 포트 번호 6667에서 TCP 연결이 보안 채널을 통해 server.foo.com의 포트 번호 6667으로 전달 될 수 있습니다. 서버에서 TCP를 UDP로 전달 설정

서버에서 TCP 포트 6667에서 리스너를 열어 데이터를 지정된 IP의 UDP 포트 53으로 전달합니다. 나와 같은 DNS 전달을 원한다면 /etc/resolv.conf에있는 첫 번째 네임 서버의 IP를 사용할 수 있습니다. 그러나 먼저, 우리는 fifo를 만들어야합니다. fifo는 두 채널 사이에 양방향 통신이 필요합니다. 간단한 쉘 파이프는 왼쪽 프로세스의 표준 출력과 오른쪽 프로세스의 표준 입력 만 통신합니다.

server# mkfifo /tmp/fifo
server# nc -l -p 6667 < /tmp/fifo | nc -u 192.168.1.1 53 > /tmp/fifo

그러면 서버 포트 6667의 TCP 트래픽이 192.168.1.1의 포트 53에서 UDP 트래픽으로 전달되고 응답이 다시 올 수 있습니다. 머신에서 UDP를 TCP로 전달하도록 설정

이제 로컬 컴퓨터에서 수행 한 작업과 반대로 수행해야합니다. UDP 포트 53을 바인딩하려면 우선 액세스 권한이 필요합니다.

local# mkfifo /tmp/fifo
local# sudo nc -l -u -p 53 < /tmp/fifo | nc localhost 6667 > /tmp/fifo

로컬 컴퓨터 포트 53의 UDP 트래픽을 로컬 컴퓨터 포트 6667의 TCP 트래픽으로 전달할 수 있습니다. 로컬 DNS 서버를 즐기십시오 :)

예상 한대로 로컬 UDP 포트 53과 같은 로컬 컴퓨터에서 DNS 쿼리를 수행하면 로컬 TCP 포트 6667, 서버의 TCP 포트 6667, 서버의 DNS 서버로 전달됩니다. , UDP 포트 53 (192.168.1.1). 로컬 컴퓨터에서 DNS 서비스를 즐기려면 /etc/resolv.conf에서 다음 행을 이름 서버로 지정하십시오.

nameserver 127.0.0.1

28
이 솔루션은 안전하지 않습니다. TCP 스트림은 메시지 경계를 유지한다고 보장되지 않으므로 단일 UDP 데이터 그램이 부분적으로 분할되어 프로토콜이 손상 될 수 있습니다.
Juho Östman

2
IRC에서 사용하는 6667 (man SSH 예제에서) 대신 포트 1153을 사용하는 것도 좋습니다.
phil pirozhkov 2014 년

1
@ JuhoÖstman이 함정을 지적 해 주셔서 감사합니다. 문제를 알고 ... 솔루션을 실행 했습니까? 충분히 작은 메시지가 작동 할 가능성이있는 방법일까요?
humanandANDpeace

4
해결책은 패킷이 TCP 스트림을 통해 전송되기 전에 각 패킷에 길이를 추가하여 원래 패킷을 재구성하는 것입니다. 그렇게하기 위해 C 스크립트를 작성하는 것은 쉽지만 쉽게 사용할 수있는 솔루션이 있는지 확실하지 않습니다. 실제로 TCP는 일반적으로이 경우 메시지 경계를 유지하는 것처럼 보이지만 언제든지 이상한 오류가 발생할 수 있습니다.
Juho Östman

파이프와 fifo가 버퍼링되어 프레임 경계가 사라졌습니다. 많은 UDP 프레임을 하나의 TCP 프레임으로 연결할 수 있습니다.
Julio Guerra

26

(John의 대답이 다른 곳에서 같은 것을 가리킨다 고 생각합니다)는 TCP / SSH 연결을 통해 다른 컴퓨터의 UDP / DNS 서비스에 액세스하는 방법을 설명합니다.

로컬 UDP / 53 트래픽을 TCP로 전달한 다음 SSH의 포트 전달 메커니즘을 사용하여 TCP 트래픽을 다른 시스템으로 전달한 다음 TCP를 UDP / 53에서 다른 시스템으로 전달합니다.
일반적으로 openvpn으로 수행 할 수 있습니다.
그러나 여기서는 더 간단한 도구로 openssh와 netcat 만 사용합니다.

해당 페이지의 끝에 ' socat'를 참조하는 다른 주석
이 있습니다. 동일한 UDP / DNS 액세스는

서버 측 : socat tcp4-listen:5353,reuseaddr,fork UDP:nameserver:53
클라이언트 측 :socat udp4-listen:53,reuseaddr,fork tcp:localhost:5353

자세한 내용은 socat 예제 를 참조하십시오 .


3
이것은 받아 들인 대답보다 훨씬 유용합니다. 비디오 스트림의 단방향 리디렉션 (TS / UDP)이 필요했습니다 ... ssh orig_strm_src socat udp4-listen:4003,reuseaddr,fork STDOUT| socat STDIN udp-sendto:localhost:4003
nhed

FWIW, 나는 UDP 전달을 위해 SSH를 통해 socat을 설정하는 방법을 설명하는 더 자세한 가이드를 내 홈페이지에 작성했습니다 . SNMP를 예로 사용합니다.
Peter V. Mørch 5

20

SSH (적어도 OpenSSH)는 간단한 VPN을 지원합니다. 클라이언트 에서 -w또는 Tunnel옵션을 사용하여 양쪽 끝에 장치를 ssh만들 tun수 있으며,이를 사용하여 모든 종류의 IP 트래픽을 전달할 수 있습니다. ( Tunnel의 매뉴얼 페이지를 참조하십시오 ssh_config(5).) 양쪽 끝에 OpenSSH (및 아마도 루트 권한)가 필요합니다.


비 권한 포트의 UDP 터널링 및 PermitRootLogin이 'no'가 아닌 경우에도 원격 시스템에 대한 루트 권한이 필요합니다. 너무 나쁘다.
phil pirozhkov

@grawity philpirozhkov가 지적한 것처럼 필수 루트 로그인을하는 경우에도이 옵션을 지적 해 주셔서 감사합니다. 루트를 필요로하지 않도록 속일 수있는 방법이 있는지 궁금합니다.
humanandANDpeace

4
@humanityANDpeace :을 사용하여 tun / tap 장치를 미리 만들고 특정 사용자가 소유 한 장치를 만들 수 있습니다 ip tuntap add.
grawity

안녕 @ grawity. 나는 당신의 해결책을 좋아하지만 그것을 작동시킬 수는 없습니다. 나는 미리 제작 tun다음과 같이 장치를 sudo ip tuntap add mode tun사용할 때 이제까지하지만 -w이 같은 옵션을 ssh $Server -w $port내가 할 Tunnel device open failed. Could not request tunnel forwarding.내가 잘못 뭐하는 거지?
Lucas Aimaretto

16

또는 간단한 명령으로 ssf (이 사용 사례를 처리하도록 설계된)를 간단히 사용할 수 있습니다 .


고객 입장에서:

#>./ssfc -U 53:192.168.1.1:53 server.foo.com

이 명령은 localhost와 server.foo.com 사이의 보안 터널을 통해 로컬 포트 ​​53 (dns)을 192.168.1.1 포트 53으로 리디렉션합니다.


ssf 서버 대신 또는 ssf 서버 옆에 ssf 서버가 필요합니다 .

#>./ssfs

그건 그렇고, ssf의 클라이언트와 서버 측 모두 Windows / Linux / Mac에서 작동합니다. 이것은 사용자 응용 프로그램이므로 tun / tap 또는 VPN이 필요하지 않습니다.

포트 53을 리디렉션하려면 사용중인 도구에 관계없이 관리자 권한이 필요합니다.

자세한 정보, 세부 사항, 유스 케이스 또는 다운로드 : https://securesocketfunneling.github.io/ssf/


"여기에 내 제품이 있습니다"라는 경고에주의하십시오. 경계선 스팸입니다. 도움말 센터에서 지침을 읽고 따르는 것이 좋습니다 .
진압

7
기껏해야 그것은 뻔뻔한 플러그입니다. 어쨌든 솔루션이 귀하의 요청에 맞을 수 있습니다. 그건 그렇고, SSF는 OpenSource이며 비영리 단체입니다.
ssf-developers 7

11
@ heavyd : 그가 많은 해키 스크립트를 게시했다면 받아 들일 수 있지만 성숙한 오픈 소스 도구를 만들었 기 때문에 그렇지 않습니까? 원래 질문에 완벽하게 대답합니다.
Synthead 2019 년

나는 그것이 뻔뻔한 플러그 인 경우에도 이것이 내가 찾던 도구라는 것을 단호하게 인정해야합니다.
therealrootuser

9

ncSNMP 클라이언트는 계속 새 소스 UDP 포트를 선택하고 여러 개는 한 번에 활성화 될 수 있기 때문에 SNMP를 사용할 수 없었습니다 .

대신, socat블로그 게시물 에서 SNMP를 예로 사용하여 작업을 수행하는 방법을 설명하는 게시물을 작성했습니다 . 기본적으로 개요부터 시작하여 두 개의 터미널을 사용합니다.

개요

터미널 1 :

client$ ssh -L 10000:localhost:10000 server
server$ socat -T10 TCP4-LISTEN:10000,fork UDP4:switch:161

이것은 TCP 포트 10000의 SSH 전달을 생성하고 서버에서 socat을 실행합니다. socat 명령 행에서 스위치의 IP 주소가 "switch"라고 언급 된 것을 주목하십시오.

터미널 2 :

client$ sudo socat UDP4-LISTEN:161,fork TCP4:localhost:10000

클라이언트에서 socat을 설정합니다. 그렇게해야합니다.


이것은 나를 위해 일했다 :)
Paul Fenney

4

UDP 포트에 액세스 할 수 있으면 VPN이 더 나은 솔루션입니다.

TCP SSH 포트에만 액세스 할 수있는 경우 SSH 터널은 VPN과 마찬가지로 핑 및 패킷 역 추적에 적합합니다.

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