[Linux] SSH 포트포워딩 유지 Computer Tip

예전 블로그에서 Reverse SSH 연결을 설명한 적이 있듯이
SSH를 통하여 다양한 포트 포워딩이 가능합니다.

그런데 해당 ssh 연결이 ssh를 통하여 실행되고 있을 때만
가능하므로 이 연결 프로그램이 어떤 이유에서 건 (주로 타임아웃 많습니다)
죽게 되면 해당 연결은 끊어지게 됩니다.

이런 연결을 리눅스 (우분투를 기준으로 하는데 다 대동소이 합니다)에서
계속 유지하는 방법에 대해서 기술해 봅니다.


1) ~/.ssh/config 에 포트포워딩 기술

Host svr01
    HostName 11.22.33.44
    User user
    Port 22
    Compression yes
    GatewayPorts yes
    IdentityFile "/home/user/.ssh/id_rsa"
    ServerAliveInterval 10
    ControlMaster auto
    ControlPath ~/.ssh/%r@%h:%p
    ## Port Forwardings
    LocalForward 32000 localhost:12000
    LocalForward 32100 localhost:12100
    LocalForward 32200 localhost:12200

위의 내용처럼 기술해 놓으면
특정 Host의 user 로 접속하는데 어떤 키를 사용하여 들어가고
마지막 3줄 처럼 로컬 포트로 들어오는 것을 원격 호스트의
포트로 포워딩 시켜주게 됩니다.


2) ssh 연결

일반적으로는 터미널에서 

ssh svr01 

라고 명령을 내려 해당 호스트로 접속되면 포트포워딩이 곁다리로 
접속되게 되어 있지만, 만약 포트포워딩이 목적이라면,
접속하지 않고 다음과 같은 옵션으로 접속하면 됩니다.

ssh -MNf svr01

ssh 매뉴얼을 확인해 보면,

     -M      Places the ssh client into “master” mode for connection sharing.  Multiple -M options
             places ssh into “master” mode with confirmation required before slave connections are
             accepted.  Refer to the description of ControlMaster in ssh_config(5) for details.
위에 config에서 ControlMaster 와 관련이 있습니다.
해당 내용을 살펴보면,
OpenSSH에는 ControlMaster단일 네트워크 연결을 통해 여러 세션을 공유 할 수 있는 옵션 이 있습니다. 당신이 한 번 클러스터에 연결 암호 및 검증 코드를 입력하고 다른 모든 후속 가질 수있는이 수단 ssh세션 (포함 svn, rsync등을 통해 실행하는 것이 ssh) 재 인증을위한 필요없이 초기 연결 해제 피기 백을. 이러한 옵션은 명령 줄에서 매번 지정할 수 있지만 ssh매번 적용되도록 클라이언트 구성 파일 에 넣는 것이 가장 쉽습니다 .

이라고 되어 있군요. 즉, 한번 연결해 놓고 그 세션을 공유하여 사용할 수 있다는 의미가 되겠네요.
즉, TCP 세션은 1개이고 그것을 계속 재사용한다는 의미가 되겠네요.

     -N      Do not execute a remote command.  This is useful for just forwarding ports.
ssh 명령을 내릴 때 포트 포워딩만 할 것이고 터미널을 띄우거나 특정 명령을 내리지 않을 것이므로 이 옵션이 필요합니다.

     -f      Requests ssh to go to background just before command execution.  This is useful if ssh is
             going to ask for passwords or passphrases, but the user wants it in the background.  This
             implies -n.  The recommended way to start X11 programs at a remote site is with something
             like ssh -f host xterm.
ssh 명령이 데몬처럼 연결되고 백그라운드에서 돌도록 하는 옵션입니다.


3) 쉘스크립트 작성

~/sbin$ cat ssh-cron.sh
#!/usr/bin/env bash
SERVER=svr01
ps -ef | grep "ssh -MNf ${SERVER}" | grep -v grep > /dev/null
if [ $? -ne 0 ];then
    ssh -MNf ${SERVER}
fi

위와 같은 쉘스크립트를 작성하여
해당 프로세스가 발견되지 않으면 해당 명령을 내리도록 합니다.


4) crontab 에 넣기

* * * * * /home/user/sbin/ssh-cron.sh
위의 내용을 crontab 에 넣어 주면,
매 1분마다 체크하여 해당 연결이 없으면 재 연결을 하게 됩니다.



어느 분께는 도움이 되셨기를 ..


덧글

댓글 입력 영역

구글애드텍스트