Overview
리눅스 환경을 사용하면서 서버 관리나 네트워크를 다룰 때 SSH(Secure Shell)는 빠질 수 없는 필수 기술이다. 하지만 많은 사람들이 SSH를 단순히 원격 접속 용도로만 사용한다. SSH가 가진 또 하나의 강력한 기능이 바로 터널링(Tunneling)이다.
이번 글에서는 SSH 터널링이 무엇인지, 어떤 상황에서 유용한지, 그리고 어떻게 사용하는지 실제 예제와 함께 자세히 살펴보자.
SSH 터널링이란?
SSH 터널링이란 SSH의 보안 연결을 이용해 네트워크 통신을 암호화된 채널로 전달하는 기법을 말한다. 이를 통해 일반적으로 접근할 수 없는 원격 서버나 내부망 서비스에 안전하게 접근하거나 보안을 강화할 수 있다.
SSH 터널링은 크게 세 가지 유형으로 나눌 수 있다.
- 로컬 포트 포워딩(Local Port Forwarding)
- 원격 포트 포워딩(Remote Port Forwarding)
- 다이내믹 포트 포워딩(Dynamic Port Forwarding)
하나씩 살펴보자.
SSH 터널링의 세 가지 유형과 사용법
1. 로컬 포트 포워딩(Local Port Forwarding)
가장 흔히 쓰이는 방식이다. 로컬에서 지정한 포트를 통해 원격 서버의 특정 포트에 접근할 수 있도록 터널을 만든다.
ssh -L [로컬포트]:[원격서버IP]:[원격서버포트] 사용자명@[SSH서버주소]
예시:
ssh -L 8080:localhost:80 user@example.com
- 이렇게 하면 원격 서버(example.com)의 웹 서버(80포트)를 로컬 PC의 8080 포트를 통해 접근할 수 있다.
활용 사례:
- 방화벽에 막힌 서버에 로컬 환경에서 접근할 때
- 보안상 외부 노출이 제한된 내부 서비스 테스트 시 유용
2. 원격 포트 포워딩(Remote Port Forwarding)
반대로 원격 서버에서 로컬 서버의 특정 포트에 접근하도록 한다.
ssh -R [원격서버포트]:[로컬IP]:[로컬포트] 사용자명@[SSH서버주소]
예시:
ssh -R 9000:localhost:22 user@example.com
- 원격 서버(example.com)의 9000 포트로 접속하면 로컬 컴퓨터의 SSH(22포트)로 연결된다.
활용 사례:
- 로컬 개발 환경을 외부에서 접근할 수 있게 할 때
- 외부에서 접근이 제한된 네트워크의 컴퓨터 관리
3. 다이내믹 포트 포워딩(Dynamic Port Forwarding)
SOCKS 프록시를 만들어 로컬의 트래픽을 암호화된 SSH 연결을 통해 라우팅한다. 웹 브라우징 등을 안전하게 할 때 유용하다.
ssh -D [로컬SOCKS포트] 사용자명@[SSH서버주소]
예시:
ssh -D 1080 user@example.com
- 이후 브라우저에서 SOCKS 프록시를 localhost:1080으로 설정하면, 모든 트래픽이 SSH 연결을 통해 암호화된다.
활용 사례:
- 공용 와이파이 등 안전하지 않은 네트워크에서 인터넷 사용할 때
- 특정 국가에서 제한된 서비스에 접근할 때
SSH 터널링의 장점과 주의점
장점
- 네트워크 보안 강화 및 암호화된 연결 제공
- 접근이 제한된 내부망에 안전하게 접근 가능
- 별도의 VPN 설정 없이 간편히 터널링 가능
주의점
- SSH 연결이 끊기면 터널도 중단됨 (지속성 문제)
- 포트 번호 충돌을 방지해야 함
- 서버 부하 및 성능 저하가 발생할 수 있음
SSH 터널링 실제 활용 예시
실제 업무 환경에서 자주 사용하는 예제를 통해 이해를 높여보자.
예시 상황: 회사 내부 네트워크의 데이터베이스에 원격지에서 안전하게 접속하고 싶을 때
ssh -L 5432:localhost:5432 user@remote.company.com
- 이후 로컬 클라이언트에서 `localhost:5432` 로 접속하면, 회사의 데이터베이스에 암호화된 터널을 통해 안전하게 접근할 수 있다.
Remote 서버에 터널링을 설정해 놓는 방법
실무에서는 로컬 PC가 아닌 원격 서버(Remote server)에 SSH 터널을 미리 설정해 놓고 다른 곳에서 해당 서버의 터널을 이용하는 경우가 많다. 특히 AWS와 같은 클라우드 환경의 관리형 서비스에 접근할 때 흔히 사용된다.
다음은 원격 서버에서 Redis와 같은 외부 서비스를 접근하기 위해 터널을 설정하는 예시다.
사용예시
ssh -fN -L 0.0.0.0:6395:test-somaz-redis-v2.maj2pm.ng.0001.euc1.cache.amazonaws.com:6379 root@10.33.1.252
위 명령어가 의미하는 바는 다음과 같다.
명령어 옵션 | 의미 |
`-f` | 터널을 백그라운드에서 실행 (명령어 실행 후 터미널을 사용할 수 있게 함) |
`-N` | 터널링만 수행하고, 원격 서버에서 추가적인 명령을 실행하지 않음 |
`-L` | 로컬 포트 포워딩을 수행함 |
`0.0.0.0:6395` | 원격 서버에서 모든 인터페이스(모든 IP)로 6395번 포트를 열고 연결 대기 |
`test-somaz-redis...:6379` | 실제 연결하려는 원격 Redis 서버 주소와 포트 |
`root@10.33.1.252` | SSH 터널을 구축할 서버의 사용자 및 IP 주소 |
- 이렇게 설정하면 10.33.1.252 서버에서 6395 포트로 접속 시, AWS ElastiCache와 같은 원격 Redis 인스턴스에 안전하게 접근할 수 있다.
보안 주의사항
- 위와 같이 0.0.0.0을 사용하여 모든 IP에서 접근 가능하도록 하면 보안에 취약할 수 있으니, 꼭 보안 그룹이나 방화벽을 통해 접근 가능한 IP를 제한하자.
- 가능하면 내부 네트워크에서만 접근 가능하게 설정하는 것이 좋다.
Redis 터널링 데몬 설정 (자동화 및 재부팅 유지)
실무에서는 SSH 터널을 자동 실행하도록 설정하는 것이 중요합니다. 이를 위해 Systemd 서비스를 활용하여 터널을 유지할 수 있다.
1️⃣ Redis 터널링 스크립트 생성
sudo vi /usr/local/bin/redis-tunnels.sh
스크립트 내용 (`redis-tunnels.sh`)
#!/bin/bash
# 첫 번째 터널 실행
/usr/bin/ssh -N -i /home/ec2-user/.ssh/id_rsa \
-L 0.0.0.0:<Used Port>:<Redis Endpoint>:6379 \
ec2-user@<VM Private IP> &
# 두 번째 터널 실행
/usr/bin/ssh -N -i /home/ec2-user/.ssh/id_rsa \
-L 0.0.0.0:<Used Port>:<Redis Endpoint>::6379 \
ec2-user@<VM Private IP> &
wait
- Used Port : 사용할 IP
- Redis Endpoint : Redis 주소
- Vm Private IP : VM 사설 IP
스크립트 실행 권한 추가
sudo chmod +x /usr/local/bin/redis-tunnels.sh
2️⃣ Systemd 서비스 설정 (자동 실행)
sudo vi /etc/systemd/system/redis-tunnels.service
서비스 파일 (`redis-tunnels.service`)
[Unit]
Description=Redis SSH Tunnels
After=network.target
[Service]
User=ec2-user
ExecStart=/usr/local/bin/redis-tunnels.sh
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
Systemd 서비스 활성화 및 실행
sudo systemctl daemon-reload
sudo systemctl enable redis-tunnels.service
sudo systemctl start redis-tunnels.service
서비스 상태 확인
sudo systemctl status redis-tunnels.service
유용한 SSH 터널링 옵션
옵션 | 설명 |
`-N` | 원격 명령 실행하지 않고 터널링만 수행 |
`-f` | SSH 터널을 백그라운드에서 실행 |
`-C` | 데이터 압축하여 성능 향상 |
`-v` | 자세한 디버깅 메시지 출력 |
실제 사용 예시
ssh -fNCL 3306:localhost:3306 user@example.com
SSH 터널링 보안 팁
- 인증 방식으로 패스워드 대신 SSH 키를 사용하는 것이 안전하다.
- 서버에 접근 가능한 IP 제한을 설정하는 것이 좋다.
- 주기적으로 SSH 로그를 점검해 보안을 유지하자.
마무리
- SSH 터널링은 단순히 원격 서버에 접속하는 것을 넘어, 안전하고 유연하게 네트워크 문제를 해결할 수 있는 강력한 도구이다.
- 네트워크 관리, 보안 환경 구축, 개발 테스트 등 다양한 상황에서 유용하게 활용할 수 있다.
- 다만 강력한 도구인 만큼 보안에도 철저히 신경 써야 한다.
- 항상 적절한 접근 권한 설정과 키 기반 인증을 사용하여 더욱 안전하게 SSH 터널링을 활용하자.
- SSH 터널링을 활용하여 보안성과 효율성을 동시에 높이는 네트워크 관리자가 되어보자.
Reference
https://www.ssh.com/academy/ssh/tunneling
https://blog.cloudflare.com/ssh-tunnels-what-they-are-and-how-to-use-them/
'Networking, Security, Protocols' 카테고리의 다른 글
Reverse Proxy(역방향 프록시)란? (2) | 2024.11.13 |
---|---|
haproxy 개념 및 구성 가이드 (0) | 2024.04.09 |
Cilium이란? (2) | 2024.02.06 |
Vault 설치와 사용법 (2) | 2024.01.24 |
Curl(Client URL)이란? (0) | 2023.05.26 |