* 사업 등 관련 문의: T) 02-322-4688, F) 02-322-4646, E) info@wikisecurity.net
Openvpn으로 자신의 IP를 숨기는 간단한 프로그램(golang)
* 자기 IP를 숨기려는 목적은 여러 가지가 있다.
- 구글이 중국에서 철수 했을때도 Public VPN을 이용하여 차단만을 우회하는 중국인들도 많았고
- Red Team으로 구성된 Real PT를 수행하기 위해 불가피하게 자신의 IP를 숨겨야 하는 상황도 있고
- 보안 취약점 진단을 하면서 Block된 자신을 IP를 우회하기 위해 사용되기도 하며
- 간단한 보안 시스템을 개발한 후 서로 다른 Source IP로 테스트하기 위한 목적으로 도 사용되고
- 최근 유행하는 게임인 포켓몬 게임의 Fake GPS와 같이 자신의 물리적 위치를 속이기 위해 사용하기도 하고
(지금 CN에서는 총동원령이 내려지고 데놓고 공격하겠다고 하는데.. 우리는 집안싸움이나 하고 개나소나 대장하겠다고 서로 삿대질이나 하고 있다.. 참 한심하다~)
* 자기 IP를 숨기는 방법도 여러 가지가 있다.
- 목적지가 내부망이 아닌 인터넷망이라면 여러가지 방법이 있고 이를 상업적으로 제공하는 회사들도 있으나 중요한 것은 목적에 따라 어떤 방법을 선택하느냐하는 것이다.
- Open 또는 Private Proxy Server를 이용하는 방법
- Cloud Server 또는 Open Shell Server를 이용하는 방법
- Open 또는 Private VPN을 이용하는 방법
* 이번에 소개할 방법은 Open VPN을 이용한 방법이다.
- 자기 IP를 숨기는 방법중에 비교적 안전성을 보장받을 수 있는 VPN을 이용하는 방법이다.
- 전세계 봉사자들에 의해 약 6,000여개의 Public VPN Proxy Server목록을 업데이트하는 VPN Gate를 이용하는 방법이다.
- 환경설정을 통해 이 Public VPN Realy Server에 직접 접속하여 사용하는 방법도 있지만(http://www.vpngate.net/en/ 참조)
- 소스를 보면 알겠지만 vpngate에서는 VPN Relay Server 정보를 손쉽게 가져올수 있도록 api를 제공하고 있다.
- autovpn은 이 api를 이용하며 구글이 만든 개발언어 go로 만들어졌는데, 일부분 수정해서 돌려봤다.(소스는 문서 아래 참조)
(음.. 그러니깐, golang 이랑 openvpn이 설치되어 있어야 한다)
* 수정한 소스코드(autovpn.go)는 아래와 같이 간단하다.
// autovpn.go
//
package main
import (
"bufio"
"encoding/base64"
"fmt"
"io/ioutil"
"net/http"
"os"
"os/exec"
"os/signal"
"strings"
"syscall"
)
func check(e error) {
if e != nil {
panic(e)
}
}
func main() {
chosenCountry := "US"
if len(os.Args) > 1 && len(os.Args[1]) == 2 {
chosenCountry = os.Args[1]
}
URL := "http://www.vpngate.net/api/iphone/"
fmt.Printf("=> getting server list\n")
response, err := http.Get(URL)
check(err)
defer response.Body.Close()
scanner := bufio.NewScanner(response.Body)
fmt.Printf("=> parsing response\n")
counter := 0
for scanner.Scan() {
if counter <= 1 {
counter++
continue
}
splits := strings.Split(scanner.Text(), ",")
if len(splits) < 15 {
break
}
hostname := splits[0]
country_long := splits[5]
country := splits[6]
conf, err := base64.StdEncoding.DecodeString(splits[14])
if err != nil || chosenCountry != country {
continue
}
fmt.Printf("=> writing config file\n")
err = ioutil.WriteFile("/tmp/openvpnconf", conf, 0664)
check(err)
fmt.Printf("=> lokking for %s(%s)...Server:%s\n", chosenCountry, country_long, hostname)
cmd := exec.Command("sudo", "openvpn", "/tmp/openvpnconf")
cmd.Stdout = os.Stdout
c := make(chan os.Signal, 2)
signal.Notify(c, os.Interrupt, syscall.SIGTERM)
go func() {
<-c
cmd.Process.Kill()
}()
cmd.Start()
cmd.Wait()
fmt.Printf("=> try another VPN Server? (y/n) ")
var input string
fmt.Scanln(&input)
if strings.ToLower(input) == "n" {
os.Exit(0)
}
}
}
- 우선 필요한 패키지 설치가 필요하다.(이미 있다면 pass)
$ sudo apt-get install golang $ sudo apt-get install openvpn
- 그리고 받은 autovpn 소스를 컴파일을 한다.
$ go build autovpn.go
- 이제 아래와 같이 실행하면, (파라메터로 받은 국가 도메인의 Public VPN Relay Server으로 접속)
$ ./autovpn TH <= 태국
* autovpn을 실행이전과 이후의 스크린샷
- autovpn 실행이전에는 network interface와 라우팅 테이블이 아래와 같이 2개뿐이다.
- autovpn 실행이후에는 tun0라는 NW interface가 하나 추가되었고, 라운팅 테이불도 설정한 태국의 VPN Relay Server로 P2P Trunneling을 만들었다.
(*) 자~~ 이제 TH이름으로 CN으로 go go~~~~ move~ move~~