포트 포워딩과 터널링의 개념과 사용 사례, 설정 방법, SSH 점프호스트, 로컬/리모트/동적 포트 포워딩, 제약 사항을 예시와 함께 설명하는 실전 가이드.
간단히 말해, 포트 포워딩과 터널링을 더 일찍 알았으면 좋았을 텐데요. 이 글에서는 제가 직접 더 잘 이해해 보고, 경험과 팁을 여러분과 공유합니다.
Topics: 사용 사례, 구성, SSH 점프호스트, 로컬/리모트/동적 포트 포워딩, 그리고 한계
SSH 터널링과 포트 포워딩은 SSH 클라이언트에서 SSH 서버로, 또는 그 반대로, 안전한 SSH 연결을 통해 TCP 트래픽을 전달하는 데 사용할 수 있습니다. TCP 포트나 UNIX 소켓을 사용할 수 있지만, 이 글에서는 TCP 포트에만 집중합니다.
세부 구현에 깊게 들어가지는 않겠지만, 아래의 예시와 옵션만으로도 일상적인 업무에서 충분히 활용할 수 있을 것입니다.
보안: 암호화되지 않은 연결(FTP 등 레거시 프로토콜) 암호화 보안 SSH 터널(공개 키 인증)로 웹 관리자 패널 접근 잠재적으로 노출되는 포트 수 축소(추가 80/443 대신 22만 노출) 문제 해결: 방화벽/콘텐츠 필터 우회, 다른 경로 선택 연결: NAT 뒤 서버에 접근 점프호스트를 사용해 인터넷을 통해 내부 서버에 접근 로컬 포트를 인터넷에 노출
더 많은 사용 사례가 있지만, 이 정도만으로도 가능성을 가늠할 수 있을 것입니다.
시작하기 전에: 아래 예시의 옵션들은 조합하여 환경에 맞게 구성할 수 있습니다. 참고로 bind_address를 설정하지 않으면 기본값은 localhost입니다.
서버에서 SSH 포트 포워딩이 활성화되어 있어야 합니다: AllowTcpForwarding yes
기본적으로 활성화되어 있었던 걸로 기억합니다.
127.0.01 이외의 인터페이스에서 포트를 포워딩하려면 SSH 서버에서 GatewayPorts를 활성화해야 합니다: GatewayPorts yes
SSH 서버 서비스를 재시작하는 것을 잊지 마세요.
하나 이상의 호스트를 거쳐 원격 호스트에 투명하게 연결합니다.
ssh -J user@REMOTE-MACHINE:22 -p 22 user@10.99.99.1

참고: 기본 포트 22를 사용한다면 포트 지정은 생략할 수 있습니다!
REMOTE-MACHINE을 점프호스트로 사용할 때:
[user@REMOTE-MACHINE]$ ss | grep -i ssh
tcp ESTAB 0 0 167.135.173.108:ssh 192.160.140.207:45960
tcp ESTAB 0 0 10.99.99.2:49770 10.99.99.1:ssh
설명: 167.135.173.108 - REMOTE-MACHINE의 공인 IP
92.160.120.207 - LOCAL-MACHINE의 공인 IP
10.99.99.2 - REMOTE-MACHINE의 내부 IP
10.99.99.1 - REMOTE-WEBAPP의 내부 IP
점프호스트는 콤마로 구분합니다: ssh -J user@REMOTE-MACHINE:22,user@ANOTHER-REMOTE-MACHINE:22 -p 22 user@10.99.99.1
ssh -L 10.10.10.1:8001:localhost:8000 user@REMOTE-MACHINE

127.0.0.1에서만 리슨하는 REMOTE-MACHINE의 웹서버 접근 로그:
127.0.0.1 - - [30/Dec/2022 18:05:15] "GET / HTTP/1.1" 200
요청은 LOCAL-MACHINE에서 기원합니다.
ssh -L 8001:10.99.99.1:8000 user@REMOTE-MACHINE

REMOTE-WEBAPP의 웹서버 접근 로그:
10.99.99.2 - - [30/Dec/2022 21:28:42] "GET / HTTP/1.1" 200
요청은 LOCAL-MACHINE의 내부 IP(10.99.99.2)에서 기원합니다.
ssh -R 8000:localhost:8001 user@REMOTE-MACHINE

ssh -R 8000:10.10.10.2:8001 user@REMOTE-MACHINE

ssh -R 10.99.99.2:8000:10.10.10.2:8001 user@REMOTE-MACHINE

중요: 루프백 인터페이스가 아닌 다른 인터페이스에서 리슨하려면 SSH 서버에서 GatewayPorts yes가 활성화되어 있어야 합니다.
여러 포트를 전달하려면 SSH는 SOCKS 프로토콜을 사용합니다. 이는 투명 프록시 프로토콜이며, SSH는 최신 버전인 SOCKS5를 사용합니다.
SOCKS5 서버의 기본 포트는 RFC 1928에 정의된 1080입니다.
클라이언트는 SOCKS 프록시를 사용하도록 올바르게 구성되어야 합니다. 애플리케이션 또는 OS 레이어에서 설정할 수 있습니다.
ssh -D 10.10.10.1:5555 user@REMOTE-MACHINE

‘LOCAL’ 클라이언트에서 curl을 사용해 올바른 연결/경로를 테스트하세요: curl -L -x socks5://10.10.10.1:5555 brrl.net/ip
모든 것이 제대로 동작하면 REMOTE-MACHINE의 공인 IP가 반환될 것입니다
자세히 다루지는 않지만, -w 플래그로 양방향 TCP 터널을 만들 수 있습니다. 인터페이스는 사전에 생성되어 있어야 하며, 아직 테스트해 보지 않았습니다.
-w local_tun[:remote_tun]
터널을 백그라운드에서 실행하는 기본 방법은 -fN입니다:
-f - 백그라운드에서 실행
-N - 쉘 없음
ssh -fN -L 8001:127.0.0.1:8000 user@REMOTE-MACHINE
그 외에는 screen 등 다른 도구를 사용하세요.
user@pleasejustwork:~$ ps -ef | grep ssh
[...]
user 19255 1 0 11:40 ? 00:00:00 ssh -fN -L 8001:127.0.0.1:8000 user@REMOTE-MACHINE
[...]
PID로 프로세스를 종료: kill 19255
자세히 다루지는 않지만, SSH 연결을 유지하는 방법은 여러 가지가 있습니다.
두 옵션은 클라이언트와 서버 중 한쪽 혹은 양쪽 모두에서 설정할 수 있습니다.
ClientAliveInterval은 연결을 유지하기 위해 매 n초마다 요청을 보냅니다: ClientAliveInterval 15
ClientAliveCountMax는 상대방의 응답 없이 연결을 종료하기 전에 추가로 보낼 하트비트 요청 횟수입니다: ClientAliveCountMax 3
3이 기본값이며, 0으로 설정하면 연결 종료를 비활성화합니다. 이 예에서는 약 45초 동안 응답이 없으면 연결이 끊어집니다.
autossh, 스크립트, 크론잡 등 다양한 방법이 있습니다.
이는 본 글의 범위를 벗어나며, 나중에 따로 다룰 수도 있습니다.
SSH는 모든 것을 올바르게 복호화하기 위해 신뢰할 수 있는 전달에 의존합니다. UDP는 신뢰성을 제공하지 않으므로 SSH 터널 위에서 지원되지 않으며 권장되지도 않습니다.
그럼에도, 이 글에서 설명한 방법처럼 구현하는 방법이 있기는 합니다. 저도 아직 테스트가 필요합니다.
오버헤드 증가로 처리량이 낮아지고 지연 시간이 늘어납니다. 패킷 손실이나 고지연(예: 위성) 연결에서는 TCP meltdown을 유발할 수 있습니다.
이 글은 훌륭한 정리입니다.
그럼에도 저는 한동안 OpenVPN-over-TCP를 사용했고 문제없이 잘 동작했습니다. UDP보다 처리량은 낮지만 신뢰성은 좋았습니다. 결국 환경에 크게 좌우됩니다.
전반적으로 VPN을 대체하지는 못합니다. SSH 터널링을 그렇게 사용할 수는 있지만, 성능 관점에서는 VPN이 더 적합합니다.
해당 기능이 필요 없다면 비활성화하는 것이 좋습니다. 위협 행위자는 이러한 기능을 사용해 방화벽이나 다른 보안 장치를 우회할 수 있습니다.
일반 링크: SSH manual sshd_config manual 이 글은 unix.stackexchange의 답변과 Dirk Loss의 블로그 글에서 영감을 받았습니다.
유용한 피드백을 준 Frank와 ruffy에게 감사!
E-Mail hello@ittavern.com
Matrix @caffeinefueled:ittavern.com
Matrix Public Room #counter:ittavern.com
XMPP hello@ittavern.com
SimpleX Chat 공유 프로필
이름(선택 사항)
E-mail(선택 사항)
웹사이트(선택 사항)
Most recent Articles: