GN⁺: SSH 터널링 및 포트 포워딩 시각 가이드 (2023)
(ittavern.com)SSH 터널링 및 포트 포워딩에 대한 시각적 가이드
- 요약: 이 블로그 포스트는 SSH 터널링 및 포트 포워딩에 대한 이해를 돕기 위해 작성되었음. 주제는 사용 사례, 설정, SSH 점프호스트, 로컬/원격/동적 포트 포워딩, 그리고 제한 사항을 포함함.
사용 사례
-
보안:
- FTP와 같은 안전하지 않은 연결 암호화
- SSH 터널을 통한 웹 관리자 패널 접근 (공개 키 인증)
- 노출되는 포트 수 감소 (22번 포트만 노출)
-
문제 해결:
- 방화벽/콘텐츠 필터 우회
- 다른 경로 선택
-
연결:
- NAT 뒤에 있는 서버 접근
- 점프호스트를 사용하여 인터넷을 통해 내부 서버 접근
- 로컬 포트를 인터넷에 노출
포트 포워딩
-
설정/준비:
- 로컬 및 원격 사용자는 포트를 열기 위한 권한이 필요함
- 0-1024번 포트는 루트 권한이 필요함
- 클라이언트와 네트워크 방화벽을 적절히 설정
- SSH 서버에서 포트 포워딩을 활성화해야 함:
AllowTcpForwarding yes
- 다른 인터페이스에서 포트를 포워딩하려면
GatewayPorts yes
를 활성화해야 함
SSH 점프호스트 / SSH 터널
-
점프호스트를 통한 연결:
ssh -J user@REMOTE-MACHINE:22 -p 22 user@10.99.99.1
-
여러 점프호스트 사용:
ssh -J user@REMOTE-MACHINE:22,user@ANOTHER-REMOTE-MACHINE:22 -p 22 user@10.99.99.1
로컬 포트 포워딩
-
예제 1:
ssh -L 10.10.10.1:8001:localhost:8000 user@REMOTE-MACHINE
-
예제 2:
ssh -L 8001:10.99.99.1:8000 user@REMOTE-MACHINE
원격 포트 포워딩
-
예제 1+2:
ssh -R 8000:localhost:8001 user@REMOTE-MACHINE ssh -R 8000:10.10.10.2:8001 user@REMOTE-MACHINE
-
예제 3:
ssh -R 10.99.99.2:8000:10.10.10.2:8001 user@REMOTE-MACHINE
동적 포트 포워딩
-
SOCKS 프로토콜 사용:
ssh -D 10.10.10.1:5555 user@REMOTE-MACHINE
SSH TUN/TAP 터널링
-
양방향 TCP 터널 생성:
ssh -w local_tun[:remote_tun]
백그라운드에서 SSH 실행
-
백그라운드 실행:
ssh -fN -L 8001:127.0.0.1:8000 user@REMOTE-MACHINE
-
백그라운드 SSH 중지:
ps -ef | grep ssh kill <PID>
SSH 연결 유지
-
타임아웃 처리:
-
ClientAliveInterval 15
-
ClientAliveCountMax 3
-
제한 사항
-
UDP:
- SSH는 신뢰할 수 있는 전달을 필요로 하므로 UDP는 지원되지 않음
-
TCP-over-TCP:
- 오버헤드 증가로 인해 처리량이 감소하고 지연 시간이 증가함
-
VPN 대체 아님:
- SSH 터널링은 VPN을 대체할 수 있지만, 성능 면에서 VPN이 더 적합함
-
잠재적 보안 위험:
- 필요하지 않은 기능은 비활성화하는 것이 좋음
GN⁺의 정리
- 이 글은 SSH 터널링과 포트 포워딩의 다양한 사용 사례와 설정 방법을 설명함
- SSH 터널링은 보안 연결을 제공하고 방화벽을 우회하는 데 유용함
- 그러나 VPN을 대체할 수는 없으며, 성능 저하와 같은 제한 사항이 있음
- 관련된 다른 프로젝트로는 OpenVPN과 같은 VPN 솔루션이 있음
Hacker News 의견
-
2024년에는 SSH 명령어를 직접 작성하는 대신,
~/.ssh/config
파일을 사용하여 LocalForward, RemoteForward, ProxyJump를 설정하는 것이 좋음- 예시 설정을 통해 여러 중간 SSH 연결을 거쳐 데이터를 전송할 때 시간을 절약할 수 있음
- 설정 후에는 별칭을 통해 target-server에 SSH, SCP, RSYNC를 사용할 수 있음
- LocalForward와 RemoteForward 설정을 통해 포트 포워딩을 쉽게 할 수 있음
-
SSH 터널링은 복잡한 회사 환경에서 필수적임
- 많은 관료주의와 대기 시간 때문에 필요한 접근 권한을 얻는 데 시간이 걸림
-
ssh -D 8888 someserver
명령어를 사용하여 브라우저의 SOCKS 프록시를 localhost:8888로 설정하면 브라우저 트래픽이 해당 서버를 통해 라우팅됨
-
방화벽 뒤에 있고 고정 IP가 없는 리눅스 서버나 IoT 장치에 SSH 접속을 원할 때는 터널링 서비스를 사용할 수 있음
- 예: sshreach.me
-
가장 복잡한 SSH 터널링 해킹 경험은 데이터 센터 간 연결에서 발생함
- A에서 B로, B에서 C로 데이터를 이동해야 했음
- rsync, SSH 터널, 키, 라우팅을 조합하여 데이터를 성공적으로 이동시킴
- 당시에는 큰 성취였으며, 지금도 그 기억이 생생함
-
네트워킹 시각화가 더 많이 이루어지길 바람
- 특히 저수준 연결에서의 트래픽 시각화가 필요함
-
TCP-over-TCP는 오버헤드가 증가하고 지연 시간이 늘어나 성능이 저하될 수 있음
- SSH 터널에서는 TAP/TUN을 사용하지 않는 한 문제가 되지 않음
- 그러나 여러 채널을 사용할 경우 성능 저하가 발생할 수 있음
-
SSH 터널은 훌륭한 도구지만, 요즘에는 TLS와 리버스 프록시 기능이 내장된 도구를 더 많이 사용함
- 관련 도구 목록: awesome-tunneling
-
sshuttle은 터널링에 더 나은 도구임
-
sshuttle -r user@host 10.0.0.0/8
명령어를 사용하여 VPN처럼 사용할 수 있음
-
-
15년 전 대학 네트워크의 방화벽을 우회하기 위해 SSH 터널을 사용하기 시작함
- 기본 포트를 443으로 변경하여 사용함
- 이후로 방화벽 우회 외에도 다양한 용도로 사용 중임
-
SSH 자체에 리다이렉트 기능이 있는지 궁금함
- A가 B에 SSH 접속을 시도하면 B가 C에 접속하라고 지시하고, A가 투명하게 C에 직접 접속하는 기능
- B는 더 이상 중요한 데이터 경로의 일부가 아님
- 이러한 기능이 존재하는지 궁금함