개인용 웹 프록시(web proxy) 서버 구축하기

일반 가정에 할당된 공인IP는 변경되는가?

일반 가정에서 인터넷 서비스를 사용하면 DHCP를 통해 IP를 할당받기 때문에 IP가 변경된다고 생각하기 쉽다. 그리고 실제로도 원칙적으로는 변경되는 것이 맞다.

하지만 DHCP는 일정시간 할당한 IP의 기기가 꺼져있더라도 이전에 할당했던 IP를 다른 기기에 할당하지 않고 다시 접속하기를 기다린다. 그리고 해당 시간 내 기기가 켜져서 다시 접속하면 이전에 할당했던 IP를 다시 할당한다. 그렇다 보니 필자의 집 같은 경우는 최근 2~3년 동안 IP가 바뀌지 않고 있다. 이는 대부분의 가정이나 카페, 쇼핑매장 등이 마찬가지 상황이다. 대부분의 일반 가정이나 매장에서 인터넷 회선 가입 시 제공되는 인터넷 공유기를 끄는 경우를 본적이 없다. 구립, 시립, 교육청 산하의 도서관 같은 공공기관이나 기업이라면 더욱 IP가 변경되지 않는다.

따라서 “일반 가정에 할당된 공인IP는 변경된다”는 팩트는 반만 팩트인 것이다. 아니 반의 반정도의 팩트가 될까 싶다.

그런 상황에서 SNS나 커뮤니티 등에 접속하거나 글을 쓰거나 하면 작성자의 공인IP가 노출된다. 따라서 노트북이나 스마트폰을 들고 다니며 Wifi를 통해 작업하는 사람들의 경우 사용했던 공인IP를 추적하면 동선을 파악할 수도 있다. IP주소를 입력하면 해당 IP를 사용하고 있는 위치가 어디인지 확인하는 서비스도 있으니 충분히 가능한 가설이다.

내 IP를 노출시키지 않는 방법

개인이 사용하고 있는 IP를 노출시키지 않기 위해서는 일반적으로 VPN을 사용한다. 필자도 미국에 Wirguard VPN이 설치된 무료 가상서버를 한대 장만해서 필요한 경우 접속하여 사용하고 있었다. 하지만 매번 VPN을 연결하는 것도 귀찮고 연결해 두면 아무래도 속도가 느려 불편하다. 때로는 필요에 의해 VPN을 연결한 상태에서 ISO 파일같은 용량이 큰 파일을 다운로드 받아야 하는 경우도 생기는데 이는 그다지 달가운 상황은 아니다.

그래서 특정 웹사이트 접속만 VPN을 통해 접속하도록 할 수 있는지 확인했지만 VPN에서는 IP로만 가능하다는 결론에 도달했다. 그래서 과감하게 개인적으로 설치해 사용할 수 있는 Proxy 서버를 설치하게 되었다.

이 포스트에서 소개할 Proxy 서버는 웹 브라우저를 통해 웹사이트에 접속할 때 도메인 주소를 기반으로 Proxy서버를 거치게 할 것인지 Proxy 서버를 거치지 않고 직접 접속하게 할 것 인지를 정할 수 있다. 기업이나 기관에서는 일반적으로 업무용PC에서 인터넷 접속을 모두 차단하고 업무적으로 필요한 웹사이트만 Proxy 서버를 거쳐 외부 웹사이트에 접속할 수 있도록 하여 보안을 강화하는 수단으로 사용되는데 개인적으로 사용할 수 있는 Proxy 서버는 그 반대의 설정이 가능한 것이다.


Shadowsocks Proxy

이 Shadowsocks 프록시는 아이러니하게도 중국의 인터넷 검열을 우회하게 위해 중국인 개발자에 의해 처음 만들어진 Socks5 기반의 프록시 SW다. 2012년에 Github에 리포지토리가 개설된 것이 시초다. 이후 2015년에 해당 개발자가 리포지토리를 삭제했는데 해당 개발자가 이슈트래커에 남긴 기록에 의하면 공안이 찾아와 개발을 중단할 것을 요구해 어쩔 수 없이 개발을 중단하고 리포지토리를 삭제했다고 언급했다. 그리고 그는 미국의 캘리포니아로 이주해 살고 있는 것 같다.

이후 원 소스는 몇몇 포크된 코드로 개발이 이어졌지만 대부분 2~3년 전부터는 업데이트가 없는 듯 하다. 하지만 개인적으로 사용한다면 사용에 문제는 없는 것 같다. 그래서 설치하고 테스트를 진행했는데 생각보다 쉽게 설정이 가능했고 안정성도 문제 없는 듯 하다. 그래서 포스트를 작성한다.

리눅스에 Shadowsocks Proxy 서버 설치

VPN 서버와 마찬가지로 Proxy도 서버에 설치되어 클라이언트의 인터넷 접속 게이트웨이 역할을 수행한다. 필자는 미국리전에 있는 우분투 24.04 리눅스 서버에 Shadowsocks를 설치했다.

먼저 apt의 리포지토리를 최신으로 업데이트 한다.

$ sudo apt update

다음 명령으로 Shadowsocks를 설치한다. 원 개발자가 만든 것은 아니고 이후 포크되어 오픈소스 개발자들이 참여하여 추가적인 개발이 이루어진 버전이다.

$ sudo apt install shadowsocks-libev -y

설치가 정상적으로 실행되면 설정파일을 다음과 같이 수정해야 한다. Shadowsocks를 설치하면 Proxy 클라이언트의 설정이 기본적으로 적용되는데 여기서는 Proxy 서버로 사용할 것이므로 서버 설정으로 변경한다.

{
    "server":["::1", "0.0.0.0"],
    "mode":"tcp_and_udp",
    "server_port":8388,
    "password":"클라이언트 인증에 사용할 비밀번호",
    "timeout":300,
    "method":"chacha20-ietf-poly1305"
}

비밀번호를 평문으로 넣는 것을 보니 개인용도임에 분명하다. 모드와 포트번호, 비밀번호 그리고 메소드(암호알고리즘)은 나중에 PC에 설치되는 Proxy 클라이언트에서도 필요하다. 동일하게 입력해줘야 한다.

이제 다음 명령으로 서버를 리부팅했을 때 자동으로 실행되도록 하고 서버를 실행한다.

$ sudo systemctl enable shadowsocks-libev-server@config

$ sudo systemctl start shadowsocks-libev-server@config

정상적으로 실행되었다면 다음과 같이 상태를 확인해본다.

$ sudo systemctl status shadowsocks-libev-server@config

Active: active (running) 이라고 표시되면 정상상태다.

이제 서버에서 해줘야 하는 작업은 완료되었다. 혹시 서버 앞단에 방화벽이 있다면 방화벽 정책으로 Shadowsocks 서버 설치 시 지정한 포트인 8388을 열어줘야 한다. (Inbound 정책)


PC에 Shadowsocks 설치하기

기업이나 조직에서 사용하는 Proxy 서버라면 PC에는 별도로 설치하는 SW는 없다. 뒤에 나올 Windows 10/11 이나 MAC OS에서 Proxy 서버를 지정하고 정책파일의 URL만 넣어주면 된다. 하지만 Shadowsocks는 개인용으로서 전체 또는 특정 웹사이트 접속 시에만 IP 세탁을 위해 Proxy 서버를 경유하도록 해야하므로 해당 정책을 클라이언트에서 설정해야 편하다.

그래서 Shadowsocks는 PC에 작은 프로그램을 설치하고 PAC 파일(Proxy Auto-Configuration)을 작성하고 수정할 수 있도록 해야한다. PC에 설치할 Shadowsocks 파일은 다음의 경로에서 다운로드 받는다.

https://github.com/shadowsocks/shadowsocks-windows/releases

이 파일은 포터블 실행 파일의 압축파일이다. 다운로드 받고 적당한 폴더에서 압축을 해제한다.

맨 아래의shadowsocks.exe를 더블클릭해 실행한다. 정확하게 기억이 나진 않지만 다음 처럼 트레이아이콘에 Shadowsocks 아이콘이 보이는데 아래 사진처럼 검정색 종이비행기가 아니라 연한 회색의 종이비행기였다. 리눅스에 설치된 Proxy 서버와 연결이 안되었기 때문이다.

처음으로 Shadowsocks를 설치하고 실행하면 다음과 같이 서버 설정 창이 떴던 것으로 기억된다. 만약 서버 설정창이 보이지 않는다면 트레이아이콘에서 마우스 우클릭을 한 뒤 서버 메뉴에 가면 서버를 설정할 수 있는 메뉴가 있다. 서버 추가 또는 서버 설정 등의 메뉴를 틀릭해 다음과 같이 서버를 등록할 수 있는 창으로 들어간다.

서버 IP는 리눅스 서버의 IP를 넣어주고 서버포트, 암호화 프로토콜, 비밀번호는 앞의 리눅스에서 설치할 때 설정파일에 작성한 값을 동일하게 넣어주면 된다. 그리고 아래의 프록시 포트를 지정하고 포터블 모드를 체크해준 다음 저장(확인)하면 된다.

그리고 다음과 같이 트레이 아이콘에서 “시스템 프록시” 메뉴에서 “프록시 자동 구성 (PAC)” 선택해 체크 표시가 되게 해준다.

다음은 “서버” 메뉴에서 앞에서 등록한 서버를 선택해 체크 표시가 보이게 해준다.

여기까지 설정하고 나서 Shadowsocks의 트레이아이콘을 확인해보면 진한색(검정)으로 바뀌어 있어야 한다. 만약 안바뀌었다면 확인 차원에서 트레이아이콘에서 “종료”한 다음 Shadowsocks를 다운로드 받아 실행한 경로에 가서 다시 실행한 다음 확인해본다.

이제 트레이아이콘이 연한 회색 종이비행기에서 검정색 종이비행기로 바뀌어 있다.

Windows 10/11 프록시 설정

다음은 Windows 제어판에서 프록시를 설정할 차례다.

Windows 실행 창에서 “설정”을 실행한 다음 “네트워크 및 인터넷”으로 간 다음 “프록시”를 선택하면 다음과 같이 프록시 설정 창이 보인다.

위 화면처럼 “자동으로 설정 검색”은 끈다.

맨 아래의 “프록시 서버 사용”은 “설정” 버튼을 눌러 나오는 창에서 “끈다”

그리고 “설정 스크립트 사용”은 “편집” 버튼을 누르면 나오는 창에서 설정 스크립트 사용을 “켠다” 그리고 다음과 같이 스크립트 주소가 보이는지 확인하자.

이 주소가 바로 설치된 Shadowsocks Windows 버전의 PAC(Proxy Auto-Configuration) 파일을 웹 브라우저가 다운로드 받을 경로다. 브라우저가 실행되면 proxy 사용 설정이 되어 있는지 확인하고 사용하도록 되어 있다면 Windows의 이 설정에 등록된 URL에서 프록시 정책을 다운로드 받는다고 이해하면 된다.

이 주소는 Shadowsocks가 실행하며 세팅해주는 것으로 보인다.

여기까지 설정되었다면 “저장”버튼을 누르는 것을 마지막으로 Windows 10/11의 프록시 설정은 끝난다.

PAC(Proxy Auto-Configuration) 설정

이 상태에서 웹 브라우저를 실행하여 브라우저가 사용하는 IP를 확인할 수 있는 웹사이트에 접속해 보면 지금 인터넷에 연결된 공인 IP가 아닌 앞에서 Shadowsocks를 설치한 리눅스 서버에 할당된 공인IP가 보이게 된다. 만약 집에서 접속했는데 집의 인터넷 공유기에 할당된 IP가 보인다면 정상적으로 설정되지 않은 것이다.

즉 모든 웹 브라우저의 요청이 Windows에 설치된 Shadowsocks를 통해 Shadowsocks가 설치된 리눅스 프록시 서버로 간 다음 인터넷을 통해 접속하려는 웹사이트로 가야한다. VPN과 같은 방식이다. 다만 웹 브라우저가 아닌 일반 프로그램들은 Proxy 서버가 아니라 직접 인터넷으로 나가게 된다.

이제 작업할 내용은 PAC 정책의 수정이다. 이 정책 수정을 통해 Proxy 서버를 통해 접속할 웹 사이트 주소와 그렇지 않은 웹사이트 주소를 설정해야 한다.

다음과 같이 작업표시줄의 Shadowsocks 트레이 아이콘에서 우클릭 후 표시되는 메뉴화면에서 “프록시 자동구성 (PAC)”의 “로컬 프록시 자동 구성 파일 수정” 메뉴를 선택한다.

“로컬 프록시 자동 구성 파일 수정” 메뉴를 클릭하면 다음과 같이 PAC 설정 파일이 있는 폴더를 탐색기에서 보여준다. 그리고 pac.txt라는 파일이 선택되어 있다. 이 파일을 수정하라는 의미다.

Notepad같은 텍스트 파일 편집기로 열어 다음과 같이 코드를 작성한다. Java Script 다.

이 파일에는 기본적으로 꽤 긴 코드가 저장되어 있는데 모두 삭제하고 붙여 넣으면 된다. 아래의 코드다.

// 전역 도메인 배열: {domain: "도메인", desc: "설명"}
var proxyList = [
  { domain: "ppomppu.co.kr", desc: "뽐뿌" },
  { domain: "svrforum.com", desc: "서버포럼" },
  { domain: "dcinside.com", desc: "디씨인사이드" },
  { domain: "facebook.com", desc: "페이스북" },
  { domain: "clien.net", desc: "클리앙" },
  { domain: "x.com", desc: "엑스" },
  { domain: "twitter.com", desc: "트위터, 구)엑스" },
  { domain: "instagram.com", desc: "인스타그램" },
  { domain: "ip.pe.kr", desc: "IP주소확인" }
];

// Full matching helper
// true if host === domain OR host ends with '.' + domain
function matchDomain(host, domain) {
  if (!host || !domain) return false;
  host = host.toLowerCase();
  domain = domain.toLowerCase();

  if (host === domain) return true;
  if (host.length > domain.length && host.endsWith("." + domain)) return true;
  return false;
}

function FindProxyForURL(url, host) {
  // 로컬/내부 네트워크는 DIRECT
  if (isPlainHostName(host) ||
      shExpMatch(host, "*.local") ||
      shExpMatch(host, "127.*") ||
      shExpMatch(host, "10.*") ||
      shExpMatch(host, "192.168.*") ||
      shExpMatch(host, "172.*")) {
    return "DIRECT";
  }

  // 전역 배열에 포함되어 있는지 Full match 검사
  for (var i = 0; i < proxyList.length; i++) {
    var d = proxyList[i].domain;
    if (matchDomain(host, d)) {
      // 로컬 Shadowsocks SOCKS5 포트로 전달
      return "SOCKS5 127.0.0.1:1080";
    }
  }

  // 그 외는 직접 연결
  return "DIRECT";
}

이 코드는 코드 상단의 배열 proxyList [] 에 등록된 도메인의 웹사이트에 접속할 때만 Proxy 서버를 통하고 그 외의 도메인 주소를 갖는웹사이트는 Proxy 서버를 통하지 않고 직접 접속하도록 정책이 적용된 PAC 코드다.

이 코드를 적용하고 웹브라우저를 통해 proxyList [] 에 포함된 웹사이트에 접속하면 Proxy 서버에 부여된 공인IP로 접근하게 된다. 만약 사이트를 수정하고 싶다면 “로컬 프록시 자동 구성 파일 수정” 메뉴를 통해 pac.txt 파일을 열어 proxyList []의 도메인 주소 목록을 편집 후 저장하면 된다.

웹 브라우저에서 별도로 설정해줄 것은 없다.

#웹프록시 #프록시서버 #shadowsocks #ip주소감추기

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다