목차

Reverse SSH Tunneling

출처 : http://egloos.zum.com/mcchae/v/11194088

우리 집안에 들어와 있는 인터넷선을 NAT를 이용해서 자신의 노트북이 192.168.1.10 이라는 주소를 공유기를
통하여 주소를 받았다고 가정합니다.

그리고 원격 공인 IP를 가지는 10.20.30.40 이라는 리눅스 서버가 있어 여기에 SSH로 접속할 수 있다고 가정합니다.

그러면 192.168.1.10 머신에서

$ ssh user@10.20.30.40 

이라고 하여 10.20.30.40 머신에 접속 가능하다고 가정합니다.

그런데 NAT 환경 등으로 인하여 10.20.30.40 에서는 192.168.1.10 으로는 결코 접속할 수 없습니다.
그 이유는 네트워크 경로가 마련되어 있지 않기 때문이지요.
물론 공유기에서 해당 서비스포트를 포트 포워딩을 설정하여 할 수 있지만 이것은 논외 입니다.

이제 위와 같은 환경임에도 불구하고 SSH를 간단히 맺을 수 있는 방법을 소개합니다.

바로 ssh 중에 -R 옵션을 통하여 가능합니다.

우선 192.168.1.10 머신에서 아래와 같은 명령을 줍니다.

$ ssh -f -R 12345:localhost:22 user@10.20.30.40 sleep 100

# 또는

$ ssh -nNT -o TCPKeepAlive=yes -R 12345:127.0.0.1:22 user@10.20.30.40

(암호를 물어보면 암호를 넣습니다. 아니면 키 관리에 의하여
ssh-keygen 명령을 통해 만든 id_rsa.pub 의 내용을 원격 접속할 사용자 홈디렉터리에
.ssh/authorized_keys 를 넣어 키로 접속해도 됩니다. putty에서 키를 이용 참조)

간단히 설명하면 다음과 같습니다.
-f 옵션으로 user@10.20.30.40 에 접속하여 sleep 100 명령을 실행합니다.
그와 더불어
-R 12345:localhost:22 옵션은 접속된 10.20.30.40 번의 12345 포트를 listen 하는데
거기에 접속하는 연결을 로컬 (192.168.1.10)의 22번 포트에 거꾸로 연결시킵니다.

위와 같이 되어 있는 상황에서 100초 이내에,

원격(10.20.30.40) 서버의 터미널에서

$ ssh ruser@localhost -p 12345

와 같이 접속 시도를 하면

192.168.1.10에서 10.20.30.40 으로 만들어 놓은 터널을 통하여
거꾸로 10.20.30.40에서 192.168.1.10의 sshd 로 접속 가능합니다.

Permanent Reverse Tunneling

#!/bin/bash
DEST_PORT=10001
LOCAL_PORT=22

while true; do
	echo `date "+%F %T"` "try to connect..."
	ssh -nNT -o TCPKeepAlive=yes -o ServerAliveInterval=240 -R $DEST_PORT:127.0.0.1:$LOCAL_PORT support@my.server
	echo `date "+%F %T"` "restarting in 5 seconds.."
	sleep 5
done

#EOF
[cilent ]# ssh-keygen
[cilent ]# ssh-copy-id support@my.server
/root/ssh_tunnel.sh &> /var/log/ssh_tunnel.log &
[cilent ]# chmod +x /etc/rc.d/rc.local

autossh

자동으로 설정해주는 툴로 autossh라는 명령어가 있다. EPEL패키지로 제공되며 기본 RHEL 패키지에는 없다.