티스토리 뷰

development

SSH Port Forwarding

주먹불끈 2019. 4. 1. 19:19

개요

 

기존에 Serveo 라는 서비스를 간단히 소개 적이 있었다.

- https://jusths.tistory.com/73

- 지금 돌아보니 개념이해에 약간의 오류가 있다.

 

막연히 쓰기만 했었는데 언젠가 SSH Port Forwarding 한번 정리해보고 싶었다.

 

참고링크

 

링크1: https://www.booleanworld.com/guide-ssh-port-forwarding-tunnelling/ 괜찮았음

링크2: https://blog.trackets.com/2014/05/17/ssh-tunnel-local-and-remote-port-forwarding-explained-with-examples.html

- 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 해주자.

 

https://man.openbsd.org/ssh.1

-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
«   2024/03   »
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
글 보관함