한 로컬 포트에서 다른 포트로 터널을 만드는 간단한 방법?


76

개발 서버가 있는데 192.168.1.x : 8000이 아닌 127.0.0.1:8000에서만 액세스 할 수 있습니다. 빠른 해킹으로 로컬 네트워크에서 192.168.1.x : 8001을 연결할 수 있고 클라이언트와 127.0 사이의 트래픽을 터널링 할 수 있도록 다른 포트 (예 : 8001)에서 수신 대기하는 것을 설정하는 방법이 있습니까? 0.1 : 8000?


4
netcat이 할 수 있습니다.
Andy

답변:


44

ssh를 사용하는 것이 가장 쉬운 솔루션입니다.

ssh -g -L 8001 : localhost : 8000 -f -N user@remote-server.com

그러면 워크 스테이션의 로컬 포트 ​​8001이 remote-server.com 포트 8000의 로컬 호스트 주소로 전달
-g됩니다. 네트워크의 다른 클라이언트가 내 워크 스테이션의 포트 8001에 연결할 수 있도록합니다. 그렇지 않으면 워크 스테이션의 로컬 클라이언트 만 전달 포트에 연결할 수 있습니다.
-N내가하고있는 일은 포트를 전달하고 쉘을 시작하지 않는다는 것을 의미합니다.
-f성공적인 SSH 연결 및 로그인 후 백그라운드로 포크를 의미합니다.
포트 8001은 ssh가 죽거나 죽을 때까지 많은 연결을 위해 열려 있습니다. Windows에있는 경우 우수한 SSH 클라이언트 PuTTY가이를 수행 할 수 있습니다. 8001을 로컬 포트 ​​및 localhost : 8000 및 대상으로 사용하고 설정에 로컬 포트 ​​전달을 추가하십시오. PuTTY에 성공적으로 연결 한 후에 추가 할 수 있습니다.


4
무엇을 user@remote-server.com합니까? 포트 포워딩에는 반드시 필요하지는 않지만 ssh는이 인수를 가지고 있으며 더 이상 연결을 시도합니다. 그리고이 성가신 옵션을 호스트 이름으로 설정하면 출력됩니다 …port 22: Connection refused (아니요, 22 포트를 사용하지 않았습니다) . 내가 빠진 것이 아니라면 명령이 제대로 작동하지 않습니다.
Hi-Angel

@ Hi-Angel user@remote-server.com은 단지 예일 뿐이므로 문자 그대로 사용해서는 안됩니다. 연결하려는 컴퓨터 이름과이 컴퓨터의 사용자 이름으로 바꿔야합니다. 이 정보는 ssh 연결을 설정하는 데 필요합니다. ssh 연결이 설정된 후에 만이 연결을 통해 포트를 전달할 수 있습니다.
Piotr Dobrogost

당신이 포트가 부팅에서 사용 가능하게하려면 다음 위의 방법을 사용하여 systemd 서비스 "autossh"을 참조하십시오 - everythingcli.org/ssh-tunnelling-for-fun-and-profit-autossh
리처드 홀리스

또한 "연결이 거부되었습니다"라는 메시지가 나타납니다. 그리고 SSH 연결이 관련되지 않은 경우 (-N에 따라) user@remote-server.com 인수가 왜 필요한지 여전히 이해하지 못합니다. 패킷을 전달해야합니다.
Alexander Taylor

2
@AlexanderTaylor -N는 SSH 연결이 없음을 의미하지 않습니다. 그것은 단순히 의미합니다 do not execute a remote command( man page 참조 ). <user>@<host>인수이 때문에, 필요 하지 에 SSH 접속 열 <host>(OP의 경우에 대한 것이다 어느 localhost) 원하는 포트 전달 을 통해 그 SSH 터널. OP 문제에 대한 하나의 솔루션이지만 가장 단순하지는 않습니다. SSH를 사용하지 않고 localhost로 전달하려면, 당신은 사용할 수 있습니다 socat또는 netcatStephaneChazelas 및하지-A-사용자의 답변으로

94

socat서버 :

socat tcp-listen:8001,reuseaddr,fork tcp:localhost:8000

기본적 socat으로 시스템의 모든 IPv4 또는 IPv6 주소 (지원되는 경우)에서 TCP 포트 8001을 수신합니다. 당신은 대체하여 IPv4의 / 6로 제한 할 수 있습니다 tcp-listen함께 tcp4-listen또는 tcp6-listen을 추가하여, 또는 특정 지역의 주소로 ,bind=that-address.

당신이 프록시있는 연결 소켓 같은, 당신은 대신에 어떤 주소를 사용할 수 있습니다 localhost, 그리고 교체 tcp와 함께 tcp4또는 tcp6당신은 IPv4 또는 IPv6 주소에 대한 주소 확인을 제한하려는 경우.

포트 8000에서 수신 서버에 대한 연결이 (의 경우 프록시에서 오는으로 표시됩니다 참고 localhost가 될 것이다, localhost아니 원래 클라이언트). 서버가 클라이언트가 누구인지 알 수 있으려면 DNAT 접근 방식 을 사용해야합니다 (그러나 수퍼 유저 권한이 필요함).


1
로컬 ssh 서버를 실행할 필요가 없기 때문에 감사합니다.
jontro

같은 포트이지만 다른 주소를 사용할 수 있습니까?
Amos

@amos, 편집 참조.
Stéphane Chazelas

특정 IP의 트래픽 만 전달할 수 있습니까?
Phate

1
@Phate, 단일 IP 주소 (및 매뉴얼 페이지 의 rangetcpwrap옵션)에서 연결을 수신하도록 socat에 지시를 참조하십시오 socat.
Stéphane Chazelas

46

전통적인 nc방법을 사용하는 것이 가장 쉬운 해결책입니다.

nc -l -p 8001 -c "nc 127.0.0.1 8000"

이 버전의 ncnetcat-traditional우분투 패키지로 제공된다. ( update-alternatives또는 전화해야합니다 nc.traditional.)

ssh와 달리 이것은 암호화되지 않습니다. 한 호스트 외부에서 사용하는 경우 명심하십시오.


2
누구든지에 동등한 것을 알고 netcat-openbsd있습니까?
Sridhar Sarnobat

2
netcat포함 된 버전의 아날로그 busybox: nc -v -lk -p 8001 -e /usr/bin/nc 127.0.0.1 8000. ( params의 설명 )
Ivan Kolmychek

2
작동하지만 nc명령은 첫 번째 원격 연결 후에 종료됩니다. -k계속 실행해야 할 경우 추가하십시오 .
Sopalajo de Arrierez 2016 년

nc: cannot use -p and -lCentOS 6.4 에서이 오류가 발생 합니다. 해결 방법이 있습니까?
Nick Predey

권한있는 포트를 로컬로 전달해야 할 때 루트로 쉽게 사용할 수 있기 때문에 ssh 솔루션 보다이 솔루션을 선호합니다.
Christian

24

OpenBSD netcat은 기본적으로 Linux 및 OS X에서도 사용할 수 있습니다.

OSX :

mkfifo a
mkfifo b
nc 127.0.0.1 8000 < b > a &
nc -l 8001 < a > b &

리눅스 :

mkfifo backpipe
nc -l 12345 0<backpipe | nc www.google.com 80 1>backpipe

OS X bash에서 작동하는 대안은 양방향 파이프 를 사용하는 것 입니다. 다른 유닉스에서도 작동 할 수 있습니다 :

nc 127.0.0.1 8000 <&1 | nc -l 8001 >&0

나는 당신이 openbsd netcat을 사용하고 있다는 것을 처음에는 알지 못했습니다. 이것은 우분투 패키지에서 다른 넷캣을 설치하는 것보다 낫습니다.
RobertR

Ubuntu 15.04에서 OpenBSD 예제가 실패했습니다. 쉘 경로 재 지정을 사용하면 netcat이 ss -tan또는에서 표시된대로 청취하기 위해 포트를 열지 못합니다 netstat -tan.
Justin C

⁺¹. FTR : 대체 방법은 Ubuntu
Hi-Angel

귀하의 솔루션을 이해하지 못합니다. 설명 할 수 있습니까?
Trismegistos

@trismegistos이 예제에서 netcat 리스너와 클라이언트는 입력을 일부 공유 파일 (mkfifo pipe..first first)로 리디렉션하고, 공유 파일을 입력 / 출력의 소스 / 대상으로 사용하여 효과적으로 터널을 만듭니다. 일반적으로 클라이언트 / 리스너가 사용되지만, 일부 기술은 클라이언트 + 클라이언트 / 수신기 + listener- 사용 wiki.securityweekly.com/...을 하고 slideshare.net/amiable_indian/secrets-of-top-pentesters는 읽고해야합니다.
Info5ek

4

ServerFault에 대한 David Spillett답변 인용

rinetd는 작업을 수행해야하며 Windows 바이너리는 http://www.boutell.com/rinetd/ 에서 얻을 수 있습니다 (Linux에서 동일한 것을 찾는 사람은 rinetd는 거의 모든 배포판의 표준 저장소에 있습니다. "apt-get install rinetd"또는 "yum install rinetd"등으로 설치 가능)

형식으로 구성 파일을 가져 오는 간단한 바이너리입니다.

bindaddress bindport connectaddress connectport

예를 들면 다음과 같습니다.

192.168.1.1 8001 127.0.0.1 8000

또는

0.0.0.0 8001 127.0.0.1 8000

들어오는 포트를 모든 인터페이스에 바인딩하려는 경우


3
iptables -t nat -A PREROUTING -p tcp --dport <origin-port> -j REDIRECT --to-port <destination-port>

service iptables save
service iptables restart

에서 dport와 같이에 연결하려고하면을 (를 ) nc -v localhost 2345받고 Connection refused있습니다. 나는 iptables에별로 좋지 않지만 dport는 듣기 응용 프로그램이 있어야한다고 생각합니다.
Hi-Angel

origin-port가 대상 포트와 다른 인터페이스에 있으면 어떻게됩니까?
Trismegistos

0

Mark A. 의 답변을 바탕으로 Mac에서 작동하도록 약간 조정해야했습니다 (적어도 macOS Mojave 버전 10.14.4 이상)

mkfifo a
mkfifo b
nc 127.0.0.1 8000 < b > a &
nc -l 8001 < a > b &
printf "" > a

그 printf 진술은 결정적인 것으로 보인다. 그렇지 않으면 포트 8000에 연결하는 netcat 명령은 실제로 연결을 시도하지 않으며 포트 8001을 수신하는 netcat 명령은 실제로 포트 8001을 수신하지 않습니다. printf가 없으면 포트 8001에 연결하려고 할 때마다 연결이 거부되었습니다.

내 가정은 netcat이 실제로 소켓 작업을 수행하기 전에 stdin에서 차단해야한다는 것입니다 (어쩌면 어떤 이유로 그것을 읽으려고 할 수도 있습니다). 따라서 printf 문이 fifo a에 쓰지 않으면 netcat 명령은 포트 8001에서 수신을 시작하지 않습니다.

참고 : Mark의 게시물에 대한 답변을 남겼지 만 아직 평판이 없습니다.


0

이것은 서버에서 두 개의 udp 포트를 터널링하는 새로운 방법입니다. https://github.com/9crk/udpeer

udpeer 8001 8002

테스트하려면 :

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