본문 바로가기
Cloud/Google Cloud Platform

회사에서 방화벽으로 막혀 있는 사이트 우회 방법: SSH tunneling 과 Socks5 활용

by Kibua20 2020. 12. 17.

회사 보안 정책으로 인하여 비업무 사이트, 특정 커뮤니티 등이 방화벽에 의해서 막혀 있는 경우 이를 우회하는 방법을 설명합니다.  일반적으로 회사 보안 정책이 강하더라고 인터넷 포트(80, 443)와 SSH 포트(22)의 Outbound는 허용하고 있는 경우가 많아 이를 전제로 방화벽 우회하는 방법을 설명합니다.   

 

방화벽을 우회하는 방법은 기본적으로 Proxy 서버나 VPN 서버를 활용하는 것입니다.  무료 Proxy, VPN 서버를 제공하는 상용 서비스도 많으나 개인 정보를 판매한다는 소문(? 링크)도 있어,  직접 Google Cloud나 Oracle Cloud의 VM (Virtual machine)에 Proxy server를 설치할 예정입니다.  Goolge Cloud에서 http/https proxy 서버인 squid를 활용하는 방법은 이전 포스팅 자세히 설명되어 있습니다.  본 포스팅은 개념은 유사하지만 SSH Tunneling과 dante Socks 서버를 활용하는 방법을 설명하고자 하고자 합니다.

 

회사 방화벽을 우회해서 막혀 있는 사이트를 접속하는 방법은 아래 그램에 설명되어 있습니다. 

① Chrome에서 localhost의 특정 포트(9999)로 TCP 데이터를 전송합니다.

②  SSH client에서 특정 포트(9999)의 데이터를  dante 가 설치된 proxy 서버로 SSH tunneling을 통해서 데이터를 전송합니다. 이 과정에서 SSH protocol이기 때문에 전송 데이터는 암호화됩니다.

③ dante Proxy 에서 socks 포트로 데이터를 받아서 인터넷을 접속합니다. 

회사에서 방화벽으로 막혀 있는 사이트 우회 방법:  SSH tunneling과 socks 활용

이 과정을 실제 구현하기 위해서는 서버를 먼저 준비해야 합니다. 무료 서버는 Google Cloud나 Oracle Cloud에 VM(가상 머신)을 사용할 수 있고, 가상 머신을 만드는 방법은 이전 포스팅 #1, 포스팅 #2을 참고해주세요. 

 

Proxy 서버에 sock5를 지원하는 dante-server를 설치하고 configuration을 설정한 다음 Cloud의 방화벽 설정에서 Socks5 포트를 허용합니다. Client에서 SSH tunneling을 동작시키고 Chrome에서 Socks Proxy를 설정하여 막힌 사이트를 접속합니다.

 

  1. Proxy Server에 Socks5 Server (dante-server)를 설치하기 
  2. Proxy Server에서 dante-server configuration 수정
  3. Cloud 방화벽 설정하기 (dante-server 검증을 위한 임시 단계임. SSH 포트를 사용할 예정이라 Skip 가능)
  4. Client에서 curl을 사용해서 dante proxy 서버 정상 동작 확인하기 (임시 단계로 Skip 가능)  
  5. Client-Proxy Server 간 SSH tunneling 설정하기 
  6. Chrome에서 Socks Proxy 설정하여 Localhost의 포트 번호 지정하기 
  7. 결과 확인

 

★ [주의] 회사 보안 정책은 기본적으로 준수해야 합니다. 정말 급한 경우에만 개인 책임하에 우회 진행해야 합니다.  아래 방법은 회사 보안 팀에서 모니터링 될 수 있습니다.  ★

 

 1. Proxy Server에 Socks5 Server (dante-server)를 설치하기

Google 또는 Oracle VM(가상 머신)에 Proxy서버로 활용할 예정이며, 가상 머신에 무료 Sock5 서버인 dante-server를 설치합니다. 

 

$ sudo apt update

$ sudo apt  install dante-server 

dante-server 설치

 

dante-server설치 시 danted.service 파일까지 같이 적용되고, 재부팅을 하더라도 service 형태로 자동 실행됩니다. 

 

$ Created symlink /etc/systemd/system/multi-user.target.wants/danted.service

    → /lib/systemd/system/danted.service.

 

apt로 설치된 danted 버전은 v1.4.2으로 최신 버전이 설치됩니다.  최신 버전은 dante 홈페이지에서 확인이 가능합니다.

 

$ danted -v
Dante v1.4.2.  Copyright (c) 1997 - 2014 Inferno Nettverk A/S, Norway

 

2. Proxy Server에서 dante-server configuration 수정

dante-server 설치 후 /etc/dante.conf 파일을 수정해야 해야 합니다.  dante.confi 파일의 각 세부항목은 dante 홈페이지에 자세하게 설명되어 있습니다. 

 

# danted.conf 파일 백업

$ sudo cp /etc/danted.conf /etc/danted.conf.bak

 

# dandte.conf 파일 수정

$ sudo vi /etc/danted.conf

 

기존 파일에서 아래 파일의 내용으로 변경합니다. danted를 통한 socks 연결 접속을 모두 허용하는 설정입니다.  conf 파일 설정 중에서 external 값은 ifconfig에서 확인한 Network Interface 이름으로 작성할 수 있습니다.  오라클 클라우드 VM 인 경우 network 카드의 이름은 ens3로 설정되어 있습니다.

 

# /etc/danted.conf

logoutput: syslog
user.privileged: root
user.unprivileged: nobody

# The listening network interface or address.
internal: 0.0.0.0 port=1080

# The proxying network interface or address. check network interface name by ifconfig
external: ens3

# socks-rules determine what is proxied through the external interface.
# The default of "none" permits anonymous access.
socksmethod: none

# client-rules determine who can connect to the internal interface.
# The default of "none" permits anonymous access.
clientmethod: none

client pass {
        from: 0.0.0.0/0 to: 0.0.0.0/0
        log: connect disconnect error
}

socks pass {
        from: 0.0.0.0/0 to: 0.0.0.0/0
        log: connect disconnect error
}

# ifconfig로 이름 확인

$ Ifconfig 

ens3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 9000

        inet 10.0.0.6  netmask 255.255.255.0  broadcast 10.0.0.255

        inet6 fe80::17ff:fe00:76b2  prefixlen 64  scopeid 0x20<link>

        ether 02:00:17:00:76:b2  txqueuelen 1000  (Ethernet)

        RX packets 71857  bytes 76310537 (76.3 MB)

        RX errors 0  dropped 0  overruns 0  frame 0

        TX packets 57371  bytes 33904335 (33.9 MB)

        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

 

 

변경한 dante.conf 내용을 적용하기 위해서는 systemctl 명령어로 danted 서비스를 재시작합니다.  danated의 service 로딩이 정상적으로 동작확인은 systemctl status 명령어로 확인할 수 있습니다. 

 

$ sudo systemctl restart danted 

$ sudo systemctl status danted 

dante service의 동작 확인

netstat 명령어로 확인하면 1080 포트를 LISTEN 하고 있음을 알 수 있습니다.

 

$ sudo netstat -npt

danted에서 1080 포트 Listen확인

 

3. 서버 방화벽 열기 

이 과정은 꼭 필요한 과정은 아니지만 Socks 서버가 정상 동작하는지 확인한 과정에만 필요합니다. Google Cloud나 Oralce Cloud에서는  SSH 22번 포트를 제외하고 Inbound 포트가 대부분 막혀있어 방화벽을 열어야 합니다.  dante.conf 파일에서 바인딩한 1080 포트를 방화벽에서 허용해야 합니다. 

 

[개발환경/Oracle Cloud] - Oracle Cloud 방화벽 설정 (http/https 특정 포트 열기)

[개발환경/Google Cloud Platform] - GCP(Google Cloud) 방화벽 설정: 프로토콜과 포트를 사용 허용 또는 거부하기

 

Oracle 클라이드에서 사용해야 하는 명령어 요약:

$ sudo iptables -I INPUT 5 -i ens3 -p tcp --dport 1080 -m state --state NEW,ESTABLISHED -j ACCEPT

$ sudo apt install netfilter-persistent 

$ sudo netfilter-persistent save

$ sudo netfilter-persistent start

 

4. Client에서 curl을 사용해서 dante proxy 서버 정상 동작 확인하기 

로컬 PC에서 아래 curl  명령어를 사용해서 Socks 서버가 정상 동작하는지 확인해야 합니다.   naver.com에서 응답하는 HTML 파일을 표시해야 합니다.  방화벽에 막혀 데이터 전송이 안되는 경우 응답이 없습니다. 이 단계도 Socks 서버의 정상 동작을 확인하는 목적이기 때문에 skip 해도 무방합니다.

 

$ curl -v -x socks5://서버IP:1080 http://naver.com

Client 에서 curl을 사용해서 dante proxy 서버 정상 동작 확인하기

 

 

5.Client-Proxy Server 간 SSH tunneling 설정하기 

Socks 서버가 정상적으로 동작한다면 SSH Tunneling (또는 SSH Forwarding)을 설정하는 단계입니다.  우분투나 윈도우나 ssh client가 기본 설치되어 있기 때문에 동일한 명령어를 사용 가능합니다.   SSH tunneling 명령은 -D 옵션 [로컬 포트]을 사용합니다.  -D 옵션은 local 'dynamic' application level port forwarding 옵션으로 SSH 클라이언트가 로컬 포트를 LISTEN 하고 있는 것입니다.  -N 옵션은 터미널로 사용하지 않고, 연결된 세션만 유지하는 것입니다.  자세한 내용은 아래 매뉴얼을 확인해주세요. SSH tunneling을 중지하려면 Ctrl+D를 누르면 종료됩니다.

 

$ ssh -D [localhost 포트] [서버 주소]  -N

$ ssh -D 9999  ubuntu@140.238.14.208 -N 

Client-Proxy Server간 SSH tunneling 설정하기 

 

 SSH 의 -D 옵션 설명서

 

5.2 Chrome에서 Socks Proxy 설정

SSH tunneling이 설정된 상태에서 Chrome의 Socks Proxy 확장 프로그램을 설치해서 Chrome의 브라우저에서 Localhost를 통하여 데이터를 SSH Client로 전달합니다.  회사에서 막힌 사이트를 접속하고자 할때만 버튼 하나로 Socks Proxy를 enable할 수 있어 편리하게 사용가능합니다.

 

Socks Proxy 설정

Socks Proxy 확장 프로그램에서 '옵션' 메뉴에서 localhost SOCKS proxy port를 9999로 설정하고 동작하도록 활성화합니다.

Socks Proxy 활성화
Socks Proxy에서 localhost 포트 지정

 

6. 결과 확인

로컬 PC의 Chrome에서 SOCKs proxy를 enable 하고 ssh -D 9999  ubuntu@140.238.14.208 -N 가 실행하고 있는 상태에서 IP 주소 확인 사이트에서 공인 IP를 확인하면 로컬 PC의 IP 대신  Socks서버 IP (=오라클 클라우드)로 설정됨을 확인할 수 있습니다.  결과적으로 로컬 PC 에서 Socks Proxy서버까지 SSH 포트(22번)만 허용되어 있으면 Socks 서버를 통해서 막혀 있는 사이트 접속이 가능합니다.  SSH 포트(22번)도 막혀 있는 경우 SSH 연결 시 열려 있는 80 포트로 설정하면 됩니다.

 

 

※ 참고 링크

www.binarytides.com/setup-dante-socks5-server-on-ubuntu/

www.binarytides.com/linux-ssh-socks-proxy/

 

 

관련 글

[모바일 SW 개발/REST API] - 외부 망에서 Localhost를 접속하기: ngrok (일부 무료)

[모바일 SW 개발/REST API] - 외부 망에서 Localhost를 접속하기: localtunnel (무료, domain제공)

[모바일 SW 개발/REST API] - 자주 사용하는 curl 명령어 옵션과 예제

[개발환경/Google Cloud Platform] - IP Address CIDR 표현법과 사용 예

[개발환경/Google Cloud Platform] - GCP에서 Squid를 이용한 Proxy 서버 설정 방법

[개발환경/우분투] - Docker 개념과 명령어 사용 방법 및 예제

[개발환경/Google Cloud Platform] - GCP(Google Cloud) 로컬 PC에서 VM에 로그인 없이 바로 SSH로 바로 접속: 다른 SSH 클라이언트 사용 및 SSH Key 등록

[개발환경/Google Cloud Platform] - GCP(Google Cloud) 방화벽 설정: 프로토콜과 포트를 사용 허용 또는 거부하기

[개발환경/Google Cloud Platform] - Google Cloud Platform을 활용하여 평생 '무료' PC 만들기

[개발환경/윈도우와 WSL] - 윈도우용 MobaXterm - SSH 및 X-Server 지원

[개발환경/Oracle Cloud] - Oracle Cloud 방화벽 설정 (http/https 특정 포트 열기)

[개발환경/Oracle Cloud] - 오라클 클라우드 '평생' 무료 VM 만들기 (Google Cloud 무료 조건 비교)

[개발환경/Oracle Cloud] - Oracle Cloud SSH Key 여러 개 등록하기 (여러 PC에서 Cloud Access)




댓글