SSH Tunneling OR SSH Port Forwarding(SSH 터널링, SSH 포트 포워딩 설정하기)
참고 : https://linuxize.com/post/how-to-setup-ssh-tunneling/
SSH 접속이 가능한 SSHD 서버를 원격에 가지고 있다면, 그 SSHD 서버를 이용하여 다양한 네트워크 서비스를 이용할 수 있다. 쉽게 말하면, SSHD 서버가 있다면 그 서버가 속해 있는 네트워크에 어떤 포트로든 접속할 수 있고, SSHD 서버를 통하여 현재 내가 접속한 네트워크에도 트래픽을 가져올 수도 있다. 가장 이해하기 쉬운 예제를 들면, 방화벽이 가로막고 있더라도 SSHD 서버에만 접속할 수 있다면, 어떤 포트 번호를 사용하는 네트워크 통신이든 연결시킬 수 있다.
SSH Tunneling은 총 세 가지 방식이 있는데, 아마 대부분은 접속을 시작하는 컴퓨터가 SSH 클라이언트이기 때문에, 아래의 세 가지 방식 중에서 Local Port Forwarding과 Dynamic Port Forwarding을 주로 이용하게 될 것이다. 단순하게 한 두개의 포트를 사용하는 서비스를 이용한다면 Local Port Forwarding이면 충분하고, SSHD 서버를 마치 Proxy 서버 같이 쓰고 싶다면 Dynamic Port Forwarding을 사용하면 된다.
1. Local Port Forwarding
여기서 Local 이라는 단어의 의미는 현재 접속을 시작한 컴퓨터(SSH 명령어를 실행한 컴퓨터)에 포트가 열리고, 그 포트를 접속하면 원격에 있는 SSHD 서버를 통하여 SSHD 서버가 있는 네트워크의 포트로 통신이 연결된다는 의미이다.
즉, “현재 컴퓨터의 열린 포트번호 -> SSHD 서버 -> 목적지 서버의 포트번호”의 연결이 이루어진다.
ssh 명령어는 다음과 같은 형식인데,
ssh -L [LOCAL_IP:]LOCAL_PORT:DESTINATION:DESTINATION_PORT [USER@]SSH_SERVER
- [LOCAL_IP:]LOCAL_PORT - 현재 컴퓨터(Local)의 IP 주소와 포트 번호이다. LOCAL_IP를 지정하지 않으면, 현재 컴퓨터의 모든 IP주소와 연결된다. LOCAL_IP는 특별한 경우가 아니면 지정하지 않는다.
- DESTINATION:DESTINATION_PORT - 최종 목적지의 호스트명 또는 IP 주소와 포트번호를 지칭한다. 만약 SSHD 서버의 특정 포트 번호가 목적지라면, DESTINATION에는 localhost 또는 127.0.01 이라고 쓰면 된다. ※주목할 점은 여기서 localhost는 SSHD 서버 자체를 의미한다는 것이다. (현재 컴퓨터인 LOCAL 과 구분해야 한다.)
- [USER@]SERVER_IP - 원격 SSHD 서버의 IP 주소와 사용자 계정이다.
- 만약에 원격 SSHD 서버의 ssh 서비스 포트가 22번이 아니라면, 명령어에 -p 옵션과 ssh 서비스 포트번호를 지정하여야 한다.
예제로 들면, 공인 IP주소 167.136.64.2 인 SSHD 서버가 연결되어 있는 내부망에 IP주소가 192.168.100.20인 웹 서버가 포트번호 7000번에 동작하고 있다면, 현재 컴퓨터 클라이언트에서는 그 내부망 웹 서버에 바로 접속할 수 없지만, 다음의 명령어를 통해서 현재 컴퓨터의 8080번 포트를 열고, SSHD 서버를 거쳐 내부망 웹서버의 7000번 포트에 연결할 수 있다.
ssh -L 8080:192.168.100.20:7000 user@167.136.64.2
정상적인 접속이 된다면, SSH 연결화면에서 쉘 명령어도 입력할 수 있다.
접속화면 없이, 터널링(포트 포워딩)만을 실행하고자 한다면 다음과 같이 -N -f 옵션을 추가할 수도 있다.
ssh -L 8080:192.168.100.20:7000 -N -f user@167.136.64.2
- -f 는 ssh 명령어의 백그라운드 실행을 의미
- -N 은 ssh 접속화면, 쉘 프롬프트 화면이 없는 것을 의미
ssh 명령어가 실행되고, 접속이 정상적이라면
현재 컴퓨터에서 웹브라우저를 띄우고, http://127.0.0.1:8080 으로 접속하면, 바로 원격 내부망에 있는 http://192.168.100.20:7000 에 접속한 것과 동일한 화면이 나타날 것이다.
2. Remote Port Forwarding
여기서 Remote 라는 의미는 원격에 있는 SSHD 서버쪽에 포트를 여는 것이다. 즉 이 방식은 앞에 설명한 Local Port Forwarding과 완전히 반대 개념으로, SSHD 서버쪽 포트번호로 들어오는 연결을 현재 컴퓨터(SSH 클라이언트)가 연결된 네트워크의 특정 포트번호로 이어주는 것이다. SSH 클라이언트인 현재 컴퓨터로 원격 SSHD 서버쪽의 네트워크 연결이 들어오는 개념으로 Local Port Forwarding과 비교해서 네트워크 전송 방향이 반대라고 생각하면 된다.
Remote Port Forwarding은 우선 SSHD 서버 쪽의 설정이 필요하다.
sshd_config 파일에서 AllowTcpForwarding과 GatewayPorts, 두 개의 옵션을 활성화 해야 한다.
일반적인 Linux 서버에서 /etc/ssh/sshd_config 파일에는 다음과 같이 옵션이 주석으로 설정되어 있는데,
...
#AllowTcpForwarding yes
#GatewayPorts no
...
Remote Port Forwarding이 가능하게 하려면, 다음과 같이 바꿔서 옵션을 활성화해야만 한다.
...
AllowTcpForwarding yes
GatewayPorts yes
...
옵션이 바뀌었으면, SSHD 서비스를 재시작해야만 한다.
systemctl restart sshd 또는 service sshd restart 명령어를 root 권한으로 실행한다.
Remote Port Forwarding은 “SSHD 서버의 열린 포트번호 -> 현재 컴퓨터(SSH 클라이언트) -> 목적지 서버의 포트번호”의 연결이 이루어진다. 여기서 목적지 서버란 현재 컴퓨터(SSH 클라이언트)가 연결된 네트워크에 존재하는 서버를 말한다. Remote Port Forwarding에서 최종 목적지는 현재 컴퓨터(SSH 클라이언트)가 연결된 네트워크에 있는 것이며, Local Port Forwarding 과 왜 반대라고 하는 지를 이해할 것이라고 본다. Local Port Forwarding에서는 목적지 서버가 SSHD 서버의 연결된 네트워크에 존재한다.
ssh 명령어는 다음과 같은 형식인데,
ssh -R [REMOTE:]REMOTE_PORT:DESTINATION:DESTINATION_PORT [USER@]SSH_SERVER Copy
- [REMOTE:]REMOTE_PORT - SSHD 서버의 IP 주소와 포트 번호, REMOTE가 지정되지 않으면, SSHD 서버가 가지는 모든 IP주소와 연결될 수 있다는 의미이다. 실제 특별한 경우가 아니면 REMOTE를 지정할 필요가 없다.
- DESTINATION:DESTINATION_PORT - 최종 목적지의 호스트명 또는 IP 주소와 포트번호를 지칭한다. 최종 목적지는 현재 컴퓨터(SSH 클라이언트)가 연결된 네트워크에 존재해야 한다.
- [USER@]SERVER_IP - 원격 SSHD 서버의 IP 주소와 사용자 계정이다.
- 만약에 원격 SSHD 서버의 ssh 서비스 포트가 22번이 아니라면, 명령어에 -p 옵션과 ssh 서비스 포트번호를 지정하여야 한다.
예제로 들면, 현재 컴퓨터(SSH 클라이언트)가 존재하는 유무선공유기 내부망에 IP주소 172.16.8.1 이라는 웹서버가 8000번 포트로 웹 서비스를 하고 있는데, 67.136.64.2 인 SSHD 서버가 연결되어 있는 내부망에서 SSHD 서버의 5000번 포트를 통하여 웹서비스에 접속하고 싶다면 다음의 명령어를 실행한다.
SSHD 서버가 연결되어 있는 내부망에 존재하는 어떤 컴퓨터에서 현재 컴퓨터(SSH 클라이언트)가 존재하는 유무선공유기 내부망에 접속하는 상황이 그리 많지는 않겠지만, 이런 통신 연결도 가능하다는 것을 보여주는 예제이다.
ssh -R 5000:172.16.8.1:8000 user@167.136.64.2
정상적인 접속이 된다면, SSH 연결화면에서 쉘 명령어도 입력할 수 있다.
접속화면 없이, 터널링(포트 포워딩)만을 실행하고자 한다면 다음과 같이 -N -f 옵션을 추가할 수도 있다.
ssh -R 5000:172.16.8.1:8000 -N -f user@167.136.64.2
※ 네트워크 연결이 반대로 이루어지므로, [SSHD 서버에 열릴 포트번호]:[현재 SSH 클라이언트가 속한 네트워크내의 최종 목적지 서버 IP]:[최종 목적 포트번호] 의 순서를 잘 기억해야 한다.
3. Dynamic Port Forwarding
Dynamic Port Forwarding은 Local Port Forwarding과 유사한 네트워크 연결을 구성한다. 그러나 하나의 포트 번호와 하나의 포트 번호를 연결하는 것이 아니라, SOCKS Proxy 서버와 같이 동작하여 단일 포트를 접속하는 것이 아니라, 모든 포트 번호를 지원한다.
실제로 SOCKS Proxy 서비스를 위한 서비스 포트만 지정되고, SOCKS Proxy가 동작하면 어떤 목적지 포트 번호이든 사용할 수 있다.
ssh 명령어는 다음과 같은 형식이다.
ssh -D [LOCAL_IP:]LOCAL_PORT [USER@]SSH_SERVER
- [LOCAL_IP:]LOCAL_PORT - 현재 컴퓨터(Local)의 IP 주소와 포트 번호이다. LOCAL_IP를 지정하지 않으면, 현재 컴퓨터의 모든 IP주소와 연결된다. LOCAL_IP는 특별한 경우가 아니면 지정하지 않는다.
- [USER@]SERVER_IP - 원격 SSHD 서버의 IP 주소와 사용자 계정이다.
예제로 들면, 공인 IP주소 167.136.64.2 인 SSHD 서버가 연결되어 있는 네트워크 내부망으로 연결가능한 SOCKS Proxy server를 현재 컴퓨터(SSH 클라이언트)의 8080번 포트로 구성하는 명령어는 다음과 같다.
ssh -D 8080 -N -f user@167.136.64.2
이제는 현재 컴퓨터(SSH 클라이언트)에 구성된 SOCKS Proxy 서비스 8080번 포트를 통하면, 바로 SSHD 서버가 연결되어 있는 모든 내부망 네트워크로 접속할 수 있다는 것이다.
SOCKS Proxy 서비스를 이용하려면, 사용하려면 서비스 클라이언트 프로그램, 일반적으로 웹 브라우저에서 SOCKS Proxy 설정을 해주면 가능하다. SOCKS Proxy 설정은 간단하니, 인터넷에서 검색해서 찾아서 설정하기를 바란다.
현재 컴퓨터(SSH 클라이언트)에서 SOCKS Proxy 서버의 IP 주소는 127.0.0.1 그리고 포트번호는 앞에서 -D 옵션으로 지정한 8080을 넣어주면 된다.
다음의 링크에서 여러 클라이언트 프로그램에서의 SOCKS Proxy 설정을 참고하기 바란다.
https://websetnet.net/ko/how-to-use-windows-10-socks5-proxy-settings/