내 SSH 터널이 성공적으로 생성되었는지 어떻게 알 수 있나요?

내 SSH 터널이 성공적으로 생성되었는지 어떻게 알 수 있나요?

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가 서버의 IP와 동일해야 한다고 생각했습니다. 그러나 실제로 그것들은 동일하지 않습니다(나는 그렇게 함으로써 그것들을 발견했습니다 wget -q -O - checkip.dyndns.org|sed -e 's/.*Current IP Address: //' -e 's/<.*$//'). 이유를 알고 싶습니다. 터널이 활성화된 상태에서 인터넷상의 웹사이트에 접속할 때, 나와 서버 사이의 터널로 인해 서버는 나와 연결된 인터넷 웹사이트의 중간 지점이 아닌가?

답변1

이것은 필요한 것보다 더 복잡합니다 :-)

터널을 시작합니다.

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는 변경되지 않습니다. 당신이 해야 할 일은 원격 호스트를 통해 SOCKS 프록시를 생성하는 것뿐입니다. 지정하지 않는 한 시스템은 이 프록시를 자동으로 사용하지 않습니다.

SSH 설명
터널 시작을 위한 매개변수:
-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가 호스트를 요청하고 일을 체계적으로 유지하는 경우에도 이것을 사용할 수 있습니다.

답변2

이 유형의 터널은 IP 주소 정보를 변경하지 않습니다. 그것이 하는 일은 컴퓨터에 포트 9999를 열고 SSH 연결을 통해 해당 포트의 연결을 원격 컴퓨터(tim@server)로 전달하도록 지시하는 것뿐입니다. 연결이 설정되었는지 테스트하는 가장 쉬운 방법은 전달이 생성된 포트(예에서는 9999)에 텔넷으로 연결하는 것입니다.

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

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

두 번째 질문의 경우, 귀하의 브라우저에서는 귀하가 지정하지 않는 한 브라우저가 터널을 사용하지 않습니다. 브라우저 네트워크 설정에서 프록시 설정을 구성하고 localhost:9999를 양말5 프록시로 지정할 수 있습니다. 그러면 웹 연결이 SSH 터널을 사용하고 서버의 IP 주소로 나타나야 합니다.

답변3

내 경우(Ubuntu 14.10의 Google Chrome) 적어도 브라우저 내에서는 외부 주소가 변경되었습니다. 그냥 Google에서 "내 IP 주소는 무엇인가요?" 프록시를 사용하거나 사용하지 않고 연결합니다.

또한 프록시를 설정한 후 터널을 파괴하고 여전히 트래픽이 발생하는지 확인하세요. 이렇게 하면 크롬에서 "프록시 서버에 연결할 수 없습니다"라는 오류가 반환됩니다.

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

답변4

이것이 최선의 해결책입니다:

#!/bin/bash
export SSH_HOST=
export SSH_PORT=

if ps -lef | grep ssh | grep $SSH_PORT
then
echo "Starting SSH tunnel"
ssh -f -N -D $SSH_PORT -M -S /tmp/ssh_tunnel_%h.sock -o ExitOnForwardFailure=yes $SSH_HOST && \
echo "ssh tunnel started successfully" || \
echo "ssh tunnel failed to start"
else
echo "Stopping SSH tunnel"
ssh -S /tmp/ssh_tunnel_%h.sock -O exit $SSH_HOST
fi
exit

터널이 실행 중인지 확인하고 터널을 열거나 닫습니다.

관련 정보