때때로 원격(Remote) 호스트가 사설 네트워크(NAT) 뒤에 있거나 방화벽이 설정되어 있어, 외부(또는 LAN 내부)에서 직접 SSH로 접속하기가 매우 어렵습니다. 이러한 환경에서 중계(Middle-man) 서버를 통해 리버스 포트 포워딩(Reverse Port Forwarding) 기법을 사용하면, 원격 호스트에 대한 접속을 우회적으로 가능하게 만들 수 있습니다.
예컨대 다음과 같은 시나리오를 상상해봅시다:
아래는 이러한 상황에서 원격 호스트 → (리버스 포트 포워딩) → 중계 서버 → LAN 클라이언트 순서로 SSH 통신을 구성하는 구체적 방법입니다.
SSH KeepAlive 설정
홈 디렉터리의 SSH 설정 파일(~/.ssh/config
)에 다음 내용을 추가합니다.
Host *
ServerAliveInterval 60
ServerAliveCountMax 3
중계 서버로 리버스 포트 포워딩 실행
다음 명령어를 통해 원격 호스트의 localhost:22
를 중계 서버의 2345번 SSH 포트와 연결합니다.
ssh -fN -R 2222:localhost:22 -p 2345 middle_user@example.com
-R 2222:localhost:22
: 중계 서버에서 들어오는 2222
포트를 원격 호스트의 22
포트로 포워딩.-fN
: 백그라운드(-f)로 명령을 실행하며 원격 명령 실행은 안 함(-N).-p 2345
: 중계 서버의 SSH 포트가 2345번으로 열려 있음.middle_user@example.com
: 중계 서버 계정 및 도메인/호스트.SSH 데몬 설정
/etc/ssh/sshd_config
파일에 아래 내용을 추가(또는 수정)합니다.
GatewayPorts yes
ClientAliveInterval 60
ClientAliveCountMax 3
GatewayPorts yes
: 리버스 포트 포워딩을 통해 외부에서 접근할 수 있도록 포트를 개방합니다.ClientAliveInterval / ClientAliveCountMax
: 연결 상태 확인(KeepAlive)을 위한 설정입니다.SSH 데몬 재시작
변경 사항을 적용하기 위해 SSH 서비스를 재시작합니다.
sudo systemctl restart sshd
또는
sudo service sshd restart
중계 서버를 통해 원격 호스트로 SSH 접속
LAN 내부의 클라이언트는 중계 서버에서 포워딩된 2222
포트를 통해 원격 호스트에 SSH로 접속합니다.
TERM=xterm-256color ssh -p 2222 remote_user@192.168.0.111
TERM=xterm-256color
: 터미널 색상 기능을 활성화하기 위한 환경 변수 설정.-p 2222
: 중계 서버가 리버스 포트 포워딩으로 열어둔 포트 번호.remote_user@192.168.0.111
: 실제 접속할 원격 호스트의 사용자 계정과 내부 IP(또는 호스트명).이 과정을 통해 원격 호스트가 NAT/방화벽 뒤에 있더라도, 외부에 있는 중계 서버를 거쳐 LAN 내부 사용자가 안전하고 간편하게 SSH 접속을 할 수 있습니다.
필요에 따라 호스트명, 포트 번호, 사용자 계정 정보 등을 적절히 조정해 사용하시기 바랍니다.