Digging Tunnels in Three Directions
한국어 원문으로 표시합니다.
목표
-L, -R, -D 세 가지 포워딩을 모두 만들어 보고, 각 터널이 어디에 포트를 여는지 직접 확인합니다.
왜 중요한가
포워딩은 방향만 헷갈리지 않으면 전부 쉽습니다. -L 은 내 쪽 포트를 열고, -R 은 저쪽 포트를 열고, -D 는 내 쪽에 SOCKS 프록시를 세웁니다. 그리고 -L 의 가운데 호스트 이름은 SSH 서버 기준으로 해석됩니다 — 내 쪽에서 그 이름이 안 풀려도 상관없습니다. 이 사실 하나가 배스천 경유 접속의 거의 전부입니다.
이 실습에서 SSH 서버는 127.0.0.1:2222 입니다. 서버와 클라이언트가 같은 호스트라 -R 결과도 바로 확인할 수 있습니다.
단계
/opt/fixtures/nt-http/server.py를 9200 포트,127.0.0.1바인딩으로 띄우세요. 이것이 터널의 목적지입니다.- 로컬 포워딩으로
19200→127.0.0.1:9200터널을 백그라운드로 열고,curl -s http://127.0.0.1:19200/ok결과를/root/tun/local.txt로 저장하세요. 19200을 누가 열었는지 확인해/root/tun/proof.txt로 저장하세요. 프로세스 이름에ssh가 보여야 합니다.- 원격 포워딩으로 SSH 서버 쪽에
19300을 열어127.0.0.1:9200으로 보내고,curl -s http://127.0.0.1:19300/ok결과를/root/tun/remote.txt로 저장하세요. - 동적 포워딩(SOCKS)으로
11080을 열고, 그 프록시를 통해http://127.0.0.1:9200/ok를 요청한 결과를/root/tun/socks.txt로 저장하세요. - 로컬 포워딩 하나를 더 열되 이번에는 모든 주소에 바인딩해
19201→127.0.0.1:9200으로 보내고, 자기 인터페이스 IP 로 접속한 결과를/root/tun/gateway.txt로 저장하세요. - 현재 떠 있는 ssh 터널 프로세스들의 커맨드라인을
/root/tun/inventory.txt로 저장하세요. 최소 4줄(-L두 개,-R,-D)이 있어야 합니다. /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 로 접속되지 않습니다.
백엔드 서비스 띄우기
/opt/fixtures/nt-http/server.py 를 9200 포트, 127.0.0.1 바인딩으로 띄우세요. 이것이 터널의 목적지입니다.
터널의 목적지가 될 서비스가 필요합니다. 루프백에만 띄워도 터널을 통하면 접근됩니다.
로컬 포워딩
로컬 포워딩으로 19200 → 127.0.0.1:9200 터널을 백그라운드로 열고, curl -s http://127.0.0.1:19200/ok 결과를 /root/tun/local.txt 로 저장하세요.
-L 뒤에는 세 값을 콜론으로 이어 씁니다. 가운데 호스트는 SSH 서버 기준으로 해석됩니다.
터널이 연 포트 확인
19200 을 누가 열었는지 확인해 /root/tun/proof.txt 로 저장하세요. 프로세스 이름에 ssh 가 보여야 합니다.
ss 로 리슨 소켓을 보면 프로세스 이름이 나옵니다. 터널은 ssh 프로세스가 포트를 엽니다.
원격 포워딩
원격 포워딩으로 SSH 서버 쪽에 19300 을 열어 127.0.0.1:9200 으로 보내고, curl -s http://127.0.0.1:19300/ok 결과를 /root/tun/remote.txt 로 저장하세요.
-R 은 SSH 서버 쪽에 포트를 엽니다. 이 실습에서는 서버가 같은 호스트라 결과를 바로 확인할 수 있습니다.
SOCKS 프록시
동적 포워딩(SOCKS)으로 11080 을 열고, 그 프록시를 통해 http://127.0.0.1:9200/ok 를 요청한 결과를 /root/tun/socks.txt 로 저장하세요.
-D 는 포트 하나만 받습니다. curl 에는 SOCKS5 프록시를 지정하는 옵션이 있습니다.
바깥 주소에 바인딩
로컬 포워딩 하나를 더 열되 이번에는 모든 주소에 바인딩해 19201 → 127.0.0.1:9200 으로 보내고, 자기 인터페이스 IP 로 접속한 결과를 /root/tun/gateway.txt 로 저장하세요.
-L 의 앞쪽에 바인딩 주소를 추가로 적을 수 있습니다. 또는 -g 옵션을 쓰는 방법도 있습니다.
터널 목록 정리
현재 떠 있는 ssh 터널 프로세스들의 커맨드라인을 /root/tun/inventory.txt 로 저장하세요. 최소 4줄(-L 두 개, -R, -D)이 있어야 합니다.
지금 떠 있는 ssh 프로세스들의 커맨드라인을 보면 각 터널의 방향을 알 수 있습니다.
세 방향 비교표
/root/tun/report.txt 를 다음 3줄로 만드세요. 각 값은 그 옵션이 포트를 여는 쪽입니다.
L=local / R=remote / D=local
포트가 어디에 열리는지가 핵심 차이입니다. 값은 local 또는 remote 로 적으세요.