tunnel.sh
SSH 터널을 활성 상태로 유지하기 위해 다른 사람이 작성한 다음 스크립트를 사용합니다 .
#!/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
터널이 실행 중인지 확인하고 터널을 열거나 닫습니다.