아 그게 뭐더라

SSH 리버스 터널링 접속하기 본문

공부/토막 상식

SSH 리버스 터널링 접속하기

뭐더라토 2020. 5. 30. 20:13

Secure SHell. SSH 접속 방법 메모.

 

검색하면 관련 정보가 이미 많이 나온다. 참고한 웹페이지들은 아래와 같다.

1. https://system-monitoring.readthedocs.io/en/latest/ssh.html

 

서버에서 원격시스템 접근 — System monitoring 0.1 documentation

서버에서 원격시스템 접근 원격시스템들은 원격지에 분산되어 있기 때문에 시리얼 콘솔을 이용해서 장비에 접근하는 것이 번거롭고 시간을 많이 소비하게 된다. 때문에 원격에서 시스템에 접��

system-monitoring.readthedocs.io

2. http://toic.org/blog/2009/reverse-ssh-port-forwarding/

 

Bypassing corporate firewall with reverse ssh port forwarding - think shell - | toic.org

Probably lots of you are behind some sort of very restrictive corporate firewall. Unable to access your office pc from home because of firewall policies. In normal cases this scenario is more than welcomed. No outsiders should be allowed to access internal

toic.org

3. http://blog.naver.com/PostView.nhn?blogId=alice_k106&logNo=221364560794&parentCategoryNo=&categoryNo=22&viewDate=&isShowPopularPosts=false&from=postView

 

150. [SSH, Network] SSH 포트 포워딩(SSH 터널링)의 개념 및 사용 방법

이번 포스트에서는 'SSH 포트 포워딩' 또는 'SSH 터널링' 이라고 불리는 것에 대해서 설명한다. 1....

blog.naver.com

 

 

1. SSH 터널링 (= SSH 포트포워딩)

 이건 SSH 접속만을 위한 것은 아니고, 말 그대로 포트포워딩 하는데 SSH를 이용하는 것이다. SSH가 그냥 보안이 적용된 프로토콜이기 때문에 가능한 것 같다. 다이어그램은 3번 url에 잘 나와 있다.

 

Client 는 a 포트를 써서 여기로(자신 주소의 a 포트) 포트포워드를 시키고 싶다.

Server는 (Client에서 봤을 때) B의 주소를 가진다.

포트포워드시키고 싶은 주소는 (Server에서 봤을 때) C이며, 포트는 c이다.

 

아래 명령어를 Client에서 실행시키면 B로 접속되면서 포트포워딩이 된다.

ssh -L a:C:c B

사실 내가 알고있는 일반적인 포트포워딩이라면 C는 localhost (=127.0.0.1) 이 되는것 같다.

 

이제 Client의 a 포트로 접속하는 것은, A를 거쳐 B에 SSH 접속후, C의 c 포트에 접속하는 것과 같다.

말로만 쓰니 이해는 잘 안되는데 아무튼 뭐 그렇다. 위 링크들을 보면 더 이해가 잘 된다.

 

2. SSH 리버싱

중요: 당연히 이걸 학교에서 쓰면 안된다. 학교 내부망을 외부망에 연결시키는 것이라서 보안상 매우 취약해진다. 

 

 대부분의 통신이 그렇듯이 SSH도 client가 server에 요청하는거다. 하지만 이를 리버싱으로 서버와 클라이언트를 뒤집을 수가 있다. 똑같이 1번과 같이 가정하자. 여기서는 server와 client의 개념이 모호하기 때문에 랩실 컴퓨터, 서버실 컴퓨터, 공인ip 컴퓨터 세 개로 부른다.

 

공인ip 컴퓨터는 b포트를 써서 여기로(자신 주소의 b포트) 포트포워드를 시키고 싶다.

공인ip 컴퓨터는 (랩실 컴퓨터에서 봤을 때) B의 주소를 가진다.

포트포워드시키고 싶은 서버실 컴퓨터의 주소는 (랩실 컴퓨터에서 봤을 때) C이며, 포트는 c이다.

 

아래 명령어를 랩실 컴퓨터에서  실행시키면 B로 접속되면서 리버싱 터널링이 된다.

ssh -R  b:C:c B

 

리버싱이기 때문에 이건 (처음 접속때를 제외하면) Client (랩실 컴퓨터)가 Server (공인 ip 컴퓨터) 에 접속하는게 아니라, Server에서 Client에 접속하는 것과 같은 효과를 낸다. 이후 아래 명령어를 통해 서버실 컴퓨터로 접속할 수 있다는 말이다. 

ssh B -p b

 

3. 예시

서버실 컴퓨터 내부(사설)ip가 192.168.0.10 이라고 하면, 

랩실 컴퓨터에서 아래 명령어:

ssh -Nf -R  1234:192.168.0.10:22 admin@www.abcd.co.kr

 

아무 외부 컴퓨터에서 아래 명령어로 ssh 접속:

ssh linux@www.abcd.co.kr -p 1234

 

서버실 컴퓨터가 아니라 랩실 컴퓨터로만 ssh 연결하고  싶으면, 랩실 컴퓨터에서 아래 명령어:

ssh -Nf -R  1234:localhost:22 admin@www.abcd.co.kr

 

4. 켜놓기

ssh 뒤에 -fN 옵션을 붙이면 켜놓기가 된다. man page에 따르면 아래와 같다.

-f : Requests ssh to go to background just before command execution.

-N : Do not execute a remote command. This is useful for just forwarding ports.

 

5. Troubleshooting

공인 ip 컴퓨터에서 localhost로 ssh는 되는데, 외부 임의의 컴퓨터에서는 접속이 거부되는 경우가 있다. 방화벽 문제도 다 해결했는데 똑같은 현상이 발생한다면, 아래 링크를 보면 된다. (즉, netstat -ntlp로 봤을 때 sshd 포트가 0.0.0.0이 아닌 127.0.0.1을 LISTEN하고 있다면)

superuser.com/questions/588591/how-to-make-ssh-tunnel-open-to-public

Server(공인ip컴퓨터) 에서 sshd_config 중 GatewayPorts을 yes로  설정하고, 앞에 0.0.0.0을 붙여주면 된다.

 

6. 기타사항

ssh는 접속이 길어지면 보통 끊기는데, 이 포트포워딩 기능도 그렇다. crontab을 써서 자동으로 해주던가, ssh_config의 serveraliveinterval을 설정 /etc/ssh/sshd_config 의 ClientAliveInterval 60 을 설정해서 연결을 유지시키는 방법 등이 있다. 아니면 teamviewer나 anydesk, 구글 remote desktop으로 매번 들어가서 갱신해 주는 방법도 있다.

+) 참고로 구글 remote desktop은 우분투에서 사용하면 mount authorized 문제가 발생하므로 안쓰는게 정신에 이롭다. (#링크) 개인적으로는 teamviewer보다는 anydesk로 들어가는게 편하다.

앞에서도 적었지만, 학교에서 쓰면 안된다. 특히 공인 ip의 경우 해킹 시도가 매번 있으니 털리기 십상이다. 당장 나만 보더라도 로그인 시도가 엄청나다.

아니 잠만, 원래 이렇게 해킹시도가 많았던가? 세보니 5월 1일부터 339,700건... 당장 ssh 포트 바꾸고 root 접속 불가하게 바꿨다.

 

Comments