SSH 와 파일 전송 · 터널링과 포트포워딩 · 실습
터널 세 방향 파기
목표
-L, -R, -D 세 가지 포워딩을 모두 만들어 보고, 각 터널이 어디에 포트를 여는지 직접 확인합니다.
왜 중요한가
포워딩은 방향만 헷갈리지 않으면 전부 쉽습니다. -L 은 내 쪽 포트를 열고, -R 은 저쪽 포트를 열고, -D 는 내 쪽에 SOCKS 프록시를 세웁니다. 그리고 -L 의 가운데 호스트 이름은 SSH 서버 기준으로 해석됩니다 — 내 쪽에서 그 이름이 안 풀려도 상관없습니다. 이 사실 하나가 배스천 경유 접속의 거의 전부입니다.
이 실습에서 SSH 서버는 127.0.0.1:2222 입니다. 서버와 클라이언트가 같은 호스트라 -R 결과도 바로 확인할 수 있습니다.
단계
1. /opt/fixtures/nt-http/server.py 를 9200 포트, 127.0.0.1 바인딩으로 띄우세요. 이것이 터널의 목적지입니다.
2. 로컬 포워딩으로 19200 → 127.0.0.1:9200 터널을 백그라운드로 열고, curl -s http://127.0.0.1:19200/ok 결과를 /root/tun/local.txt 로 저장하세요.
3. 19200 을 누가 열었는지 확인해 /root/tun/proof.txt 로 저장하세요. 프로세스 이름에 ssh 가 보여야 합니다.
4. 원격 포워딩으로 SSH 서버 쪽에 19300 을 열어 127.0.0.1:9200 으로 보내고, curl -s http://127.0.0.1:19300/ok 결과를 /root/tun/remote.txt 로 저장하세요.
5. 동적 포워딩(SOCKS)으로 11080 을 열고, 그 프록시를 통해 http://127.0.0.1:9200/ok 를 요청한 결과를 /root/tun/socks.txt 로 저장하세요.
6. 로컬 포워딩 하나를 더 열되 이번에는 모든 주소에 바인딩해 19201 → 127.0.0.1:9200 으로 보내고, 자기 인터페이스 IP 로 접속한 결과를 /root/tun/gateway.txt 로 저장하세요.
7. 현재 떠 있는 ssh 터널 프로세스들의 커맨드라인을 /root/tun/inventory.txt 로 저장하세요. 최소 4줄(-L 두 개, -R, -D)이 있어야 합니다.
8. /root/tun/report.txt 를 다음 3줄로 만드세요. 각 값은 그 옵션이 포트를 여는 쪽입니다.L=local / R=remote / D=local
참고
- 터널은
ssh -N -f -L 19200:127.0.0.1:9200 -p 2222 -i /root/.ssh/id_labhub root@127.0.0.1형태로 엽니다. - SOCKS 경유 요청은
curl --socks5-hostname 127.0.0.1:11080 http://127.0.0.1:9200/ok입니다. - 모든 주소 바인딩은
-L 0.0.0.0:19201:127.0.0.1:9200처럼 앞에 주소를 추가합니다. - 흔한 실수 1:
-N없이 열면 원격 셸이 붙어 백그라운드에서 멈춥니다. - 흔한 실수 2: 6번에서 로컬 포워딩의 바인딩 주소 자리를 빼먹으면 루프백에만 열려 인터페이스 IP 로 접속되지 않습니다.
단계 8개
- 백엔드 서비스 띄우기
- 로컬 포워딩
- 터널이 연 포트 확인
- 원격 포워딩
- SOCKS 프록시
- 바깥 주소에 바인딩
- 터널 목록 정리
- 세 방향 비교표