방화벽 때문에 접근을 할 수 없는 사이트가 있을 때 살짝 우회해서 사용할 수 있는 팁입니다. 만약, 기업이나 기관 등의 네트워크에서 사용할 경우 정보보안 정책을 위반할 수 있다는 점은 유의하셔야 합니다.
SSH 터널링(Tunneling)이란
SSH Tunneling이라는 것은 다른 말로 SSH Port Forwarding 이라고도 하는데요. SSH가 연결되는 암호화 채널을 이용해서 여타 다른 연결을 우회하는 방법입니다. 그래서 말 그대로 마치 막혀있는 벽에 터널을 뚫는듯한 효과가 있는 거죠. 예를 들어 방화벽에서 네이버 서버로 접속하는 "https://www.naver.com" 도메인을 막고 있다거나 아니면 특정 서비스 포트가 막혀 있을 때 통신 채널을 강제로 SSH 터널을 통과하도록 하는 겁니다.
이렇게 터널링을 활용하면 서버의 설정을 바꾸지 않고 간단히 방화벽을 우회할 수 있습니다. 그리고 클라이언트-서버 간의 통신 암호화가 지원되지 않는 상황에서도 암화화된 통신을 할 수 있습니다. 하지만 제가 사용해본 바로는 속도가 빠르지 않아서 일상적인 접속이나 대량의 트래픽이 발생하는 경우에는 적합하지 않습니다.
SSH 터널링 종류
SSH 터널링은 SSH 연결을 구축하는 주체를 기준으로 포워딩하는 포트가 같은 기기에 있으면 Local forwarding이라 하고 다른 기기에 있으면 Remote forwarding이라고 합니다. 첨에는 이게 무슨 소린가 싶었는데 그림을 그려보니까 이해되더라고요.
Local Port Forwarding
먼저 Local forwarding입니다. 일반적으로 사용하는 환경에 적용되는 것이 Local forwarding입니다. 예를 들어 아래 그림처럼 왼쪽에 있는 검은 박스를 클라이언트의 PC라고 해보겠습니다. 이메일이나 클라우드에 접속하려고 하는 상황입니다. 이 클라이언트 PC는 방화벽 안에 위치하고 있는데 방화벽은 SSH연결을 제외하고 다른 모든 포트들은 차단하고 있습니다. 그리고 오른쪽에 있는 검은색 박스 중 Service 박스를 접속하고자 하는 이메일, 클라우드 등 어떤 목적지의 서버라고 할게요. 클라이언트에서 이 서비스 서버로 가는 포트는 방화벽이 막고 있어서 접속이 불가능합니다.
이때 클라이언트 PC에서 방화벽 외부에 있는 SSH서버(접속주소는 ssh.server.com이라고 하겠습니다.)로 접속을 합니다. 이때 임의 포트, 예를 들어 5555번 포트를 포워딩 포트로 지정합니다. 그러면 5555번으로 들어오는 데이터는 SSH연결을 통해서 방화벽 외부로 나갈 수 있게 됩니다. 그리고 외부 SSH서버에서는 방화벽 등의 제약사항이 없기 때문에 서비스 서버로 접근할 수 있게 되는 거죠.
접속 방법은 일반적인 ssh 접속 명령어 사이에 -L 옵션과 다음과 같이 연결해줄 로컬의 포트번호와 서비스 서버의 주소를 콜론(:)으로 연결해서 추가해서 사용하면 됩니다. 여기서 포워딩되는 포트 5555번이 ssh 연결을 구성하는 주체인 클라인언트 PC의 로컬에 있기 때문에 Local forwarding이라고 합니다.
ssh -L [로컬 포트번호]:[서비스 서버주소]:[서비스 포트번호] [ssh ID]@[ssh 서버주소]
ssh -L 5555:service.server.com:1234 sshID@ssh.server.com
Remote Port Forwarding
다음으로 Remote forwarding입니다. 위의 Local forwarding과는 반대로 방화벽이 외부로 나가는 SSH연결을 막고 있습니다. 대신 ssh에 대해서 들어오는 연결은 허용하고 있습니다. 이럴 때 방화벽 외부에 있는 PC에서 방화벽 내부의 서버에 SSH 연결을 해줍니다. 이때 옵션으로 원격지에 있는 SSH서버의 포트 (역시 5555번이라고 하겠습니다.)를 포워딩할 포트로 지정합니다.
이렇게 하면 ssh서버의 5555번 포트를 모니터링하고 있다가 여기로 들어오는 데이터가 있으면 SSH 터널을 통해서 방화벽 밖으로 꺼내올 수 있습니다.
접속 방법은 다음과 같습니다. ssh 접속 명령어 사이에 -R 옵션을 사용하고 포워딩할 원격지에 있는 포트번호, 최종 목적지의 주소를 콜론(:)으로 붙여서 추가해서 사용합니다. 포워딩되는 5555번 포트는 ssh연결을 하는 PC가 아니라 원격지에 있는 포트이기 때문에 Remote forwarding이라고 합니다.
ssh -R [리모트 포트번호]:[서비스 서버주소]:[서비스 포트번호] [ssh ID]@[ssh 서버주소]
ssh -R [5555]:[service.server.com]:[1234] sshID@ssh.server.com
이제 ssh forwarding의 개념을 간단히 살펴봤으니 실제로 유용하게 사용할 수 있는 ssh tunneling 구축방법 및 우회 접속 방법에 대해서 알아보겠습니다.
Dynamic port forwarding
Dynamic forwarding은 Local forwarding과 개념은 비슷한데 차이점이라면 1:1 연결이 아니라 1:N 연결이라고 생각하면 됩니다. 위에서는 -L, -R 옵션으로는 포트번호 5555번을 어디에 연결시킬지 그 목적지를 지정했었습니다. 그러나 Dynamic mode에서는 포트번호만 지정하고 목적지를 지정하지 않는데요.
ssh -D [로컬 포트번호] [ssh ID]@[ssh 서버주소]
ssh -D 5555 sshID@ssh.server.com
이렇게 되면 5555번 포트로 접속하는 컴퓨터는 마치 터널을 통과해서 ssh서버가 있는 위치에 있는 컴퓨터처럼 인식이 됩니다. 개념이 VPN이나 프록시와 비슷하죠. 그럼 이제 이 신박한 기능 사용하는 방법입니다.
사용법
일단 전제조건이 당연하게도 방화벽 외부에 ssh 서버가 있어야 합니다. 저는 라즈베리파이를 개인 서버로 사용 중인데 이럴 때 요긴하게 써먹을 수 있어서 좋네요.
리눅스 계열 서버에는 ssh는 기본적으로 사용할 수 있도록 되어 있는데 Dynamic forwarding을 사용하기 위해서 한 가지 확인할 부분이 있습니다. "/etc/ssh/sshd_config" 파일에 TCP port forwarding 기능인 "AllowTcpForwarding" 옵션을 찾아서 "yes"로 되어 있는지 확인해야 합니다.
옵션이 꺼져 있어서 켰다면 "sudo systemctl restart sshd" 명령으로 ssh 서비스를 재시작해줍니다. 이렇게 하면 ssh 서버는 준비가 완료되었습니다.
이제 클라이언트에서 접속합니다. 클라이언트 PC는 회사에 있고 회사 네트워크를 사용 중입니다. 클라이언트에서 간단히 파워쉘 등 터미널을 열어서 -D 옵션으로 ssh 연결을 해줍니다.
이제 터널이 만들어졌습니다. 위 사진에서는 50005번 포트를 포워딩했습니다. 이제 50005번 포트로 들어가는 모든 데이터는 터널을 통과해서 ssh서버가 있는 집으로 가게 되었습니다.
ssh를 접속한 터미널은 그대로 두고 이제 인터넷 연결을 50005번으로 우회 설정해 줍니다. 윈도에서 프록시 설정 창을 열어줍니다. "인터넷 속성 > LAN 설정 > 프시 설정" 메뉴로 따라가면 됩니다.
여기서 Socks 옵션에 주소는 "127.0.0.1", 포트는 "50005"를 넣고 확인을 눌러줍니다. 이렇게 하면 윈도에서 인터넷을 통한 데이터는 모두 50005번 포트로 들어가게 됩니다.
만약 브라우저를 Firefox를 사용한다면 OS의 프록시 설정을 만지지 않고 브라우저 설정만 고쳐서 사용할 수도 있습니다.
불여우 설정창에 네트워크 설정 옵션이 있는데 여기도 동일하게 SOCKS 프록시를 설정해 줄 수 있습니다. 여기에 동일하게 127.0.0.1 주소와 50005 포트번호를 넣어주면 불여우는 프록시를 통해서 동작하게 됩니다.
이제부터는 회사에 방화벽이 있었는데... 없습니다. 여러 가지 이유로 회사 네트워크에서는 접속을 차단하는 클라우드 서버나 쇼핑사이트 등에 접속이 가능합니다.
다만 한 가지 유의할 사항이 있습니다. 회사가 방화벽으로 어떤 연결을 차단했다면 뭔가 이유가 있겠죠. ssh turnneling의 올바른 용도는 방화벽 우회가 아니라 공개된 네트워크에서 보안연결을 확보하는 것이 좀 더 타당하다고 할 수 있습니다. 하지만 어떤 피치 못할 사정으로 방화벽을 우회하기 위한 목적으로 사용하신다면 회사의 네트워크 관리자는 이 사실을 모니터링하고 있을 가능성이 아주 높다는 것 위의 하세요. (*-*)
끝!
'Tips' 카테고리의 다른 글
삼성 갤럭시 탭4 10.1 SM-T530 안드로이드 9(LineageOS 16) 업그레이드 (42) | 2023.03.24 |
---|---|
github에서 비밀번호 숨기는 팁(--assume-unchanged) (0) | 2023.02.15 |
노트북 배터리 상태(열화) 확인하기 (2) | 2023.01.04 |
리버스 프록시를 통한 iptime 공유기 외부접속 이슈(CSRF 차단) AS 후기 (0) | 2022.12.27 |
댓글