ssh 터널이 성공적으로 생성되었는지 어떻게 알 수 있습니까?


21

tunnel.shssh 터널을 계속 유지하기 위해 다른 사람들이 작성한 다음 스크립트를 사용합니다 .

#!/bin/bash
export SSH_HOST=tim@server 

if [ ! -f /tmp/.tunnel ] 
then
echo "Creat SSH tunnel"
ssh -f -D 9999 $SSH_HOST "if [ -f ~/.tunnel ]; then rm ~/.tunnel; fi; while [ ! -f ~/.tunnel ]; do echo > /dev/null; done" & 
touch /tmp/.tunnel 
else
echo "Close SSH tunnel"
ssh $SSH_HOST "touch ~/.tunnel" 
rm /tmp/.tunnel 
fi
exit

지속적인 ssh 터널을 만들려면 방금 발행하십시오 tunnel.sh. tunnel.sh다시 발행 할 때까지 터널이 닫히지 않습니다 .

ssh 터널이 실제로 성공적으로 생성되었는지 어떻게 확인할 수 있는지 궁금합니다.

터널의 주요 용도는 서버와 동일한 LAN에있는 일부 프린터로 문서를 인쇄하는 것이며 LAN 내에서만 프린터에 액세스 할 수 있습니다. 터널을 생성 한 후에는 인쇄시 아무런 문제가보고되지 않지만 실제로는 인쇄되어 있지 않기 때문에 문서가 실제로 인쇄되었는지 확인할 수 없습니다.

터널 덕분에 LAN에 있기 때문에 외부 IP가 서버와 같아야한다고 생각했습니다. 그러나 실제로 그들은 동일하지 않습니다 (나는 그것들을 발견했습니다 wget -q -O - checkip.dyndns.org|sed -e 's/.*Current IP Address: //' -e 's/<.*$//'). 왜 궁금해? 터널이 활성화 된 상태에서 인터넷의 일부 웹 사이트에 연결하면 서버가 나와 서버 간의 터널로 인해 연결의 인터넷 웹 사이트와 중간 지점이 아닌가?

답변:


25

그것은 필요한 것보다 훨씬 복잡합니다 :-)

터널을 시작하십시오.

ssh -f -N -D 9999 -M -S /tmp/ssh_tunnel_%h.sock -o ExitOnForwardFailure=yes $SSH_HOST && \
echo "ssh tunnel started successfully" || \
echo "ssh tunnel failed to start"

터널을 멈추십시오 :

ssh -S /tmp/ssh_tunnel_%h.sock -O exit $SSH_HOST

.

그게 당신이해야 할 전부입니다. 자세한 내용을 보려면 아래를 건너 뛰십시오.

두 번째 질문은 IP입니다. 아니요, IP는 변경되지 않습니다. 원격 호스트를 통해 SOCKS 프록시를 작성하기 만하면됩니다. 사용자가 지시하지 않는 한 시스템은이 프록시를 자동으로 사용하지 않습니다.

SSH 설명
터널 시작을위한 Args :
-f: ssh에게 백그라운드를 알려줍니다. 성공적으로 시작된 경우에만 자체적으로 배경이됩니다 ( -o아래 의 인수 와 협력 ).
-o ExitOnForwardFailure=yes: SOCKS 프록시를 설정할 수없는 경우 ssh가 종료되도록 지시합니다.
-N: 명령을 실행하지 마십시오. 우리는 단지 원격 호스트에서 아무것도하지 않고 터널링을 원합니다.
-D 9999: 당신의 SOCKS 프록시.
-M: -S 인수가 작동하려면 필수입니다.
-S /tmp/ssh_tunnel_%h.sock: 제어 소켓에 /tmp/ssh_tunnel_HOSTNAME.sock을 사용하도록 지시합니다. 이 -M옵션은 ssh가이 소켓을 설정해야하며 이미 소켓에서 수신 대기중인 다른 ssh에 명령을 발행하지 않아도됨을 알려줍니다. ssh가 이미 실행 된 후이 소켓을 사용하여 추가 터널을 설정할 수 있습니다. 그만큼%h 원격 호스트의 호스트 이름을 파일 이름의 일부로 사용합니다.

터널을 막기위한 방아쇠 :
-S /tmp/ssh_tunnel_%h.sock: 이것은 명백해야한다. 그러나 우리는 -M을 발행하지 않았기 때문에 ssh는 이미 존재하는 소켓에 연결하고 자체적으로 수행하는 것이 아니라 무엇을해야하는지 알려 주어야합니다.
-O exit: 이것은의 일부입니다 -S. 소켓에서 수신 대기하는 ssh에게 종료하도록 지시합니다.
$SSH_HOST아직 여기가 필요합니다. %h파일 이름 을 사용하지 않고 절대 소켓 경로를 지정하더라도 ssh는 여전히 원격 호스트를 지정하려고합니다. 이것이 내가 %h논쟁에 넣은 이유 입니다. ssh가 호스트를 요구할 때 사용하고 구성을 유지합니다.


5

이 유형의 터널은 IP 주소 정보를 변경하지 않습니다. 컴퓨터에 포트 9999를 열고 ssh 연결을 통해 해당 포트에 대한 연결을 원격 시스템 (tim @ server)으로 전달하기 만하면됩니다. 연결이 작동하는지 테스트하는 가장 쉬운 방법은 전달이 작성된 포트 (예 : 9999)에 텔넷으로 연결하는 것입니다.

$ telnet localhost 9999
서버 시도 중 ... 서버에
연결되었습니다.
이스케이프 문자는 '^]'입니다.

"서버에 연결되었습니다." 메시지가 표시되면 터널이 가동되었음을 의미합니다. 대신 "원격 호스트에 연결할 수 없습니다 : 연결이 거부되었습니다"라는 메시지가 표시되면 터널이 작동하지 않습니다.

두 번째 질문과 관련하여 브라우저의 경우 브라우저는 사용자가 지시하지 않는 한 터널을 사용하지 않습니다. 브라우저 네트워크 설정에서 프록시 설정을 구성하고 localhost : 9999를 socks5 프록시로 지정하면 웹 연결에서 ssh 터널을 사용해야하며 서버의 IP 주소에서 온 것으로 보입니다.


+1 감사합니다! (1) LAN에서 프린터로 인쇄 할 때 터널을 사용하는 포트 9999로 이동하는 방법을 어떻게 알 수 있습니까? 다른 거 없어요? (2) 내 IP 주소 정보를 변경하는 터널 유형이 있습니까?
Tim

@Tim, 특정 프린터가 특정 IP 주소 및 포트로 인쇄되도록 구성되었을 수 있습니다. 프린터 설정 방법에 따라 다릅니다. 일반적으로 프린터를 정의 할 때 둘 다 지정할 수 있습니다. 예. 자체 IP 정보가있는 터널 유형이 있습니다. 일반적으로 이들을 위해 별도의 tun / tap en.wikipedia.org/wiki/TUN/TAP 인터페이스 를 생성합니다. 여기에는 자체 IP 주소가 첨부되어 있으며 해당 주소를 벗어나는 모든 트래픽은 다른 네트워크에서 온 것으로 보입니다 .
개브.

감사! Firefox 환경 설정의 고급-> 연결-> 설정에서 수동 프록시 구성을 선택하고 HTTP 프록시의 경우 "localhost"를 입력하고 포트의 경우 "9999"를 입력하십시오. 그 후 Firefox의 웹 사이트에 연결할 수 없습니다. 왜 궁금해?
Tim

@Tim 조금 혼란 스럽습니다 ... 설정해야 할 것은 HTTP 프록시가 아닌 SOCKS Host입니다. 처음 시도했을 때도 같은 문제가 발생했습니다.
개브.

1

필자의 경우 (우분투 14.10의 Chrome) 내 외부 주소는 적어도 브라우저 내에서 변경됩니다. 그냥 구글 "내 IP 주소는 무엇입니까?" 프록시 연결 유무에 관계없이.

또한 프록시를 설정 한 후 터널을 파괴하여 트래픽을 얻을 수 있는지 확인하십시오. 이렇게하면 크롬에서 "프록시 서버에 연결할 수 없습니다"라는 오류가 표시됩니다.

다른 방법 : 원격 호스트로 터널링 한 후 새 ssh 세션을 작성하고 실행하십시오 tcpdump -A dst port 80. 그런 다음 일부 페이지를 탐색하면 터미널에 관련 트래픽이 표시됩니다.

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