티스토리 뷰
개요
기존에 Serveo 라는 서비스를 간단히 소개 한 적이 있었다.
- https://jusths.tistory.com/73
- 지금 돌아보니 개념이해에 약간의 오류가 있다.
막연히 쓰기만 했었는데 언젠가 SSH 의 Port Forwarding 을 한번 정리해보고 싶었다.
참고링크
링크1: https://www.booleanworld.com/guide-ssh-port-forwarding-tunnelling/ 괜찮았음
- Local port forwarding 의 localhost (=127.0.0.1) 의 정체를 알려준 고마운 링크
유튜브1: https://www.youtube.com/watch?v=JKrO5WABdoY
- 이미지들이 정말 좋다. 아래의 캡처 이미지의 출처이다.
유튜브3: https://vimeo.com/54505525?cjevent=ac7f2637515011e9838a008f0a18050c
- 끝판왕이라 하는 링크인데 아직 보지는 못했음
소개 및 준비
SSH Port Forwarding 은 SSH Tunnelling 이라고도 부른다. 이 표현이 더 마음에 든다.
- Local 과 Remote 컴퓨터간에 터널을 뜷는다.
암호화 되지 않은 VNC와 같은 프로토콜도, 방화벽 뒤의 database server 도 안전하게 쓸 수 있다.
일종의 Proxy, VPN 처럼 활용하여 제한되거나 방화벽이 있는 네트워크를 우회할 수도 있다.
(참고) 같은 말 다른 표현
SSH Client |
SSH Server |
Local PC Local computer |
Remote PC REmote computer |
내 컴퓨터 |
원격 컴퓨터 |
준비사항
1) SSH Server 가 될 컴퓨터가 forwarding 을 허용해야 한다 (Local / Remote port forwading 모두)
- /etc/ssh/sshd_config 에서 AllowTcpForwarding 이 Yes 로 설정되어야 한다.
2) Remote port forwarding 의 경우에는 GatewayPorts 항목도 Yes 여야 한다.
3) 위와 같이 설정을 변경한 다음에는 Server 를 restart 해준다.
sudo service sshd stop sudo service sshd start |
(참고) service vs systemctl
- service 를 상위 래퍼라고 보면 되고, systemctl 은 좀더 디테일한 컨트롤이 가능하다 보면 되겠다.
- 링크: https://stackoverflow.com/questions/43537851/difference-between-systemctl-and-service-command
Local Port Forwarding
상황 1.
1) Server (그림의 HostB) 의 port 143 으로 접근하고 싶지만 내 컴퓨터 (그림의 HostA) 와는 방화벽으로 막혀있다.
- 하지만 port 22 (for SSH) 만은 열려있다.
2) 이 상황에서 아래와 같이 SSH 로 터널을 뜷을 수 있다.
- Local Port Forwading 터널을 뜷었다는 것은, 내 컴퓨터 (HostA) 의 port 2001 로 접근하면
- HostB 의 port 143 으로 제공되는 서비스 (Database server, Web server 등등) 을 접근하게 된다는 것이다.
→ 이때, 실제로 방화벽을 뜷고 연결을 담당하는 port 22 는 secure 하게 관리된다.
|
1) SSH 로 HostB 에 터널을 뜷는다. - SSH Server 에는 user1 이라는 계정을 가지고 있어야 한다. - default port 인 22 를 사용한다. - 다른 port (예를 들어 2222)를 설정하였으면 맨 뒤에 -p 2222 와 같이 추가해주면 된다. |
|
2) 이때 traffic 은 Local (-L 의 의미, 내 컴퓨터, HostA) 의 port 2001 로 들어와서 |
|
3) localhost 의 port 143 으로 전달된다. - (매우매우 중요) 여기서 localhost 라는 것은 SSH 로 연결된 Server 의 시점이다. - 즉, 여기서는 HostB 의 입장에서 - (HostA 는 접근할 수 없지만) HostB 는 접근할 수 있는 - IP, Port 를 의미한다. |
상황 2.
위의 설명을 좀더 명확히 보충해주는 그림이다.
1) HostA 입장에서는 HostD 의 port 143 을 접근할 수 없다고 할때에
2) HostA 는 오직 SSH (port 22) 를 통하여 HostB 와만 연결할 수 있고, HostB 는 HostD port 143 을 접근할 수 있다면
3) 아래와 같이 HostB (via SSH) 를 거쳐서 HostD port 143 에 접근할 수 있게 되는 것이다.
상황 3.
한 단계만 더 나아가보자
위 상황 1, 2 의 경우에 Local PC 인 HostA 의 port 2001 은 오직 자기 자신만이 접근할 수 있다.
이때 다른 컴퓨터인 HostC 가 HostA 와 연결되어 있으며, port 2001 로 접근하고 싶다면
아래와 같이 -g 옵션만 추가해주면 된다.
Remote Port Forwarding
이 기능을 serveo 가 서비스 해준다. https://serveo.net/
가능한 상황을 예를 들어보자.
준비사항 복습
- /etc/ssh/sshd_config 에서 AllowTcpForwarding 이 Yes 로 되어 있어야 한다. - Remote port forwarding 이라면 GatewayPorts 로 Yes - 설정을 바꾼뒤 적용하려면 ssh server 를 stop /start 하거나 restart 해줘야는 거 잊지말자 |
1) 내 컴퓨터 (HostA) 에서 서버를 하나 돌린다 port 는 143 이다.
- 내 컴퓨터는 외부에서 접근할 수 있는 ip 는 없다.
- 하지만 HostB 는 외부에서 접근할 수 있는 IP 가 있으며, HostA 는 HostB 에 SSH 로 연결이 가능하다.
2) 아래와 같이 Remote port forwarding 을 해주면, 외부에서 HostB 의 port 2001 로 접근하면
- HostA port 143 을 통해서 제공하는 서비스를 이용할 수 있다.
|
1) HostA 에서 SSH 로 HostB 로 터널을 뜷겠다. - HostB 에 user1 이라는 계정을 가지고 있다. |
|
2) 외부에서 Remote PC (-R 의 의미) 의 port 2001 로 접근하면 |
|
3) (이번에는 Local port forwarding 과는 다르게) - 내 컴퓨터 (localhost) 의 port 143 으로 접근하는 것이 된다. * 만약 localhost:143 이 아니라 HostA 가 접근할 수 있다면 - HostD:143 과 같이 forwarding 도 가능하다. |
덤으로 serveo 소개
- 링크: https://serveo.net/
Public IP 가 없이 로컬에서 작업한 웹서버를 빠르게 public 하게 접근이 가능하도록 해주는 서비스
심지어는 왠만하면 변경되지 않는 domain 도 하나 만들어준다.
|
이제는 조금 익숙해졌을지 모르겠다.
1) SSH 를 이용하여 serveo.net 에 SSH 터널을 뜷는다. 2) Remote (=serveo.net) 가 제공하는 Public PC 의 port 80 으로 접근하면 3) 내 컴퓨터에서 돌리는 웹서버인 localhost:3000 으로 연결이 된다. |
|
서버를 돌리고 있지도 않았지만 왼쪽과 같이 - Remote port forwarding 이 동작하게 되며, - serveo 가 제공하는 xxxx.serveo.net 으로 접근하면 내 컴퓨터의 웹서버인 localhost:3000 으로 연결된다. |
SSH Port Forwarding 이 좋기만 할까?
- 결국은 방화벽을 우회하는 꼼수이다. port 22 를 열어두는 예외는 해커도 이용할 수 있는 것이다.
- 옛날과 달리 왠만한 프로토콜은 SSH 를 이용하지 않아도 secure mode 를 지원한다.
Tip
Shell 까지 열기 싫으면 -N 을 추가해주자
SSH 를 백그라운드로 돌리고 싶으면 -f 를 해주자.
-N Do not execute a remote command. This is useful for just forwarding ports. |
Requests ssh to go to background just before command execution. This is useful if ssh is going to ask for passwords or passphrases, but the user wants it in the background. This implies -n. The recommended way to start X11 programs at a remote site is with something like ssh -f host xterm. If the ExitOnForwardFailure configuration option is set to “yes”, then a client started with -f will wait for all remote port forwards to be successfully established before placing itself in the background. |
'development' 카테고리의 다른 글
The Two Egg Problem (0) | 2019.05.15 |
---|---|
나는 아마존에서 미래를 다녔다. (0) | 2019.04.23 |
x-mouse 로 windows 10 가상 데스크탑 활용하기 (1) | 2019.03.12 |
unix time command: real, user, sys (0) | 2019.02.11 |
WSL meets ConEmu - start (0) | 2019.01.31 |
- Total
- Today
- Yesterday
- folklore
- clean agile
- 티스토리챌린지
- 노션
- OpenAI
- 영화
- 2023
- 클린 애자일
- ChatGPT
- 독서후기
- notion
- 독서
- 엉클 밥
- 체호프
- Bug
- go
- github
- solid
- golang
- API
- bun
- Gin
- intellij
- 제이펍
- websocket
- 오블완
- 잡학툰
- 인텔리제이
- strange
- agile
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |