방화벽 뒤 원격 호스트 접근을 위한 SSH 리버스 포트 포워딩 가이드

Je-yeong·2025년 1월 4일
0

1. 문제 상황과 동기(Motivation)

때때로 원격(Remote) 호스트가 사설 네트워크(NAT) 뒤에 있거나 방화벽이 설정되어 있어, 외부(또는 LAN 내부)에서 직접 SSH로 접속하기가 매우 어렵습니다. 이러한 환경에서 중계(Middle-man) 서버를 통해 리버스 포트 포워딩(Reverse Port Forwarding) 기법을 사용하면, 원격 호스트에 대한 접속을 우회적으로 가능하게 만들 수 있습니다.

예컨대 다음과 같은 시나리오를 상상해봅시다:

  • 원격 호스트는 사설망 내부에 있어 공인 IP가 없거나 방화벽 규칙으로 인해 외부에서 바로 접속이 불가능합니다.
  • 하지만 원격 호스트는 외부로 나가는 트래픽(Outbound)에는 제약이 없어, SSH로 공인 서버(중계 서버)에 접속할 수 있습니다.
  • LAN 내부의 사용자는 반드시 원격 호스트에 접근해야 하지만, 방화벽 제약으로 인해 직접 연결이 곤란합니다.
  • 이 문제를 해결하기 위해 중계 서버가 중간 역할을 수행하면, LAN 내부 사용자도 원격 호스트에 접근할 수 있게 됩니다.

아래는 이러한 상황에서 원격 호스트 → (리버스 포트 포워딩) → 중계 서버 → LAN 클라이언트 순서로 SSH 통신을 구성하는 구체적 방법입니다.


2. 원격 호스트(Remote host) 설정

  1. SSH KeepAlive 설정
    홈 디렉터리의 SSH 설정 파일(~/.ssh/config)에 다음 내용을 추가합니다.

    Host *
      ServerAliveInterval 60
      ServerAliveCountMax 3
    • ServerAliveInterval은 일정 주기로 KeepAlive 패킷을 보내 연결이 끊어지지 않도록 합니다.
    • ServerAliveCountMax는 KeepAlive 패킷에 응답이 없을 경우 몇 번까지 재시도할지 결정합니다.
  2. 중계 서버로 리버스 포트 포워딩 실행
    다음 명령어를 통해 원격 호스트의 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 : 중계 서버 계정 및 도메인/호스트.

3. 중계 서버(Middle-man) 설정

  1. SSH 데몬 설정
    /etc/ssh/sshd_config 파일에 아래 내용을 추가(또는 수정)합니다.

    GatewayPorts yes
    ClientAliveInterval 60
    ClientAliveCountMax 3
    • GatewayPorts yes : 리버스 포트 포워딩을 통해 외부에서 접근할 수 있도록 포트를 개방합니다.
    • ClientAliveInterval / ClientAliveCountMax : 연결 상태 확인(KeepAlive)을 위한 설정입니다.
  2. SSH 데몬 재시작
    변경 사항을 적용하기 위해 SSH 서비스를 재시작합니다.

    sudo systemctl restart sshd

    또는

    sudo service sshd restart

4. LAN 내부 클라이언트(Client)에서 접속

중계 서버를 통해 원격 호스트로 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(또는 호스트명).

5. 정리

이 과정을 통해 원격 호스트가 NAT/방화벽 뒤에 있더라도, 외부에 있는 중계 서버를 거쳐 LAN 내부 사용자가 안전하고 간편하게 SSH 접속을 할 수 있습니다.

  • 원격 호스트 → (SSH 리버스 포트 포워딩) → 중계 서버 → LAN 내부 클라이언트
  • 방화벽 규칙으로 인해 직접 연결이 불가능한 경우, 중계 서버를 통한 간접 연결이 문제를 해결

필요에 따라 호스트명, 포트 번호, 사용자 계정 정보 등을 적절히 조정해 사용하시기 바랍니다.

profile
Versatile

0개의 댓글

관련 채용 정보