답변:
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에 성공적으로 연결 한 후에 추가 할 수 있습니다.
user@remote-server.com
합니까? 포트 포워딩에는 반드시 필요하지는 않지만 ssh는이 인수를 가지고 있으며 더 이상 연결을 시도합니다. 그리고이 성가신 옵션을 호스트 이름으로 설정하면 출력됩니다 …port 22: Connection refused
(아니요, 22 포트를 사용하지 않았습니다) . 내가 빠진 것이 아니라면 명령이 제대로 작동하지 않습니다.
user@remote-server.com
은 단지 예일 뿐이므로 문자 그대로 사용해서는 안됩니다. 연결하려는 컴퓨터 이름과이 컴퓨터의 사용자 이름으로 바꿔야합니다. 이 정보는 ssh 연결을 설정하는 데 필요합니다. ssh 연결이 설정된 후에 만이 연결을 통해 포트를 전달할 수 있습니다.
-N
는 SSH 연결이 없음을 의미하지 않습니다. 그것은 단순히 의미합니다 do not execute a remote command
( man page 참조 ). <user>@<host>
인수이 때문에, 필요 하지 에 SSH 접속 열 <host>
(OP의 경우에 대한 것이다 어느 localhost
) 원하는 포트 전달 을 통해 그 SSH 터널. OP 문제에 대한 하나의 솔루션이지만 가장 단순하지는 않습니다. SSH를 사용하지 않고 localhost로 전달하려면, 당신은 사용할 수 있습니다 socat
또는 netcat
StephaneChazelas 및하지-A-사용자의 답변으로
와 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 접근 방식 을 사용해야합니다 (그러나 수퍼 유저 권한이 필요함).
전통적인 nc
방법을 사용하는 것이 가장 쉬운 해결책입니다.
nc -l -p 8001 -c "nc 127.0.0.1 8000"
이 버전의 nc
에 netcat-traditional
우분투 패키지로 제공된다. ( update-alternatives
또는 전화해야합니다 nc.traditional
.)
ssh와 달리 이것은 암호화되지 않습니다. 한 호스트 외부에서 사용하는 경우 명심하십시오.
netcat-openbsd
있습니까?
nc
명령은 첫 번째 원격 연결 후에 종료됩니다. -k
계속 실행해야 할 경우 추가하십시오 .
nc: cannot use -p and -l
CentOS 6.4 에서이 오류가 발생 합니다. 해결 방법이 있습니까?
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
ss -tan
또는에서 표시된대로 청취하기 위해 포트를 열지 못합니다 netstat -tan
.
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
들어오는 포트를 모든 인터페이스에 바인딩하려는 경우
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는 듣기 응용 프로그램이 있어야한다고 생각합니다.
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의 게시물에 대한 답변을 남겼지 만 아직 평판이 없습니다.
이것은 서버에서 두 개의 udp 포트를 터널링하는 새로운 방법입니다. https://github.com/9crk/udpeer
udpeer 8001 8002
테스트하려면 :
nc -u xxxx.com 8001
nc -u xxxx.com 8002