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



답변

그것은 필요한 것보다 훨씬 복잡합니다 🙂

터널을 시작하십시오.

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가 호스트를 요구할 때 사용하고 구성을 유지합니다.


답변

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

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

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

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


답변

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

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

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


답변