해외에 있는 리눅스 서버에 OpenVPN 설치하여 IP 세탁하기

VPN은 정보보안 분야에선 필수적인 솔루션이다. 서로 다른 장소에 위치한 두개의 업무공간, 또는 업무공간과 서버가 위치한 IDC를 공개된 네트워크인 인터넷 구간을 통하면서도 안전하게 보안이 유지되는 하나의 내부 네트워크로 묶어주기 위해 사용되는 네트워크 보안 솔루션이다.

 

그런데 제목에 "IP 세탁"이라는 문구가 들어가니 조금 자극적이긴 하다. 하지만 개인이 VPN을 사용하고자 하는 목적은 분명하다.

 

첫째는 개인 정보보호를 위해 내가 사용하는 컴퓨터 또는 집에 자리잡고 있는.. 공유기에 할당된 공인IP를 노출시키지 않기 위함이다.

둘째는 중국이나 우리나라처럼 그 이유는 다르지만 개인의 인터넷 사용을 제한하는 희안한 정책을 펴는 나라에 사는 사람들이 해외의 IP를 통해 인터넷을 자유롭게 사용하고자 함이다.

셋째는 드물긴 하지만 해외 IP를 통해 타국에는 판매하지 않는 정책을 펴는 쇼핑몰을 이용하기 위한 경우도 있다. 

 

간혹 유료 VPN을 사용하는 경우도 있지만 갑자기 해외 클라우드에 만들어 둔 리눅스에 OpenVPN을 설치하여 활용해봐야겠다는 생각이 들었고 바로 행동에 옮겼다.

 

OpenVPN 설치

운영한다고 하기도 뭐하지만 개인적으로 유지하고 있는 블로그 중에 미국의 클라우드 업체인 Vultr(벌처라고 부르는 듯)라는 곳에 워드프레스를 설치해 둔 리눅스 서버가 있다. 이 리눅스 서버는 벌처 클라우드의 시애틀 리전에 위치하고 있다.  그리고 AWS나 아마존과는 다르게 벌처의 가상서버에는 직접 공인IP를 할당해준다. 즉 VPN서버로 사용하기에 적합하다 할 수 있다.

 

벌처(Vultr)클라우드에 위치한 우분투리눅스 서버다.

벌처 클라우드에 위치한 우분투리눅스 20.04 서버
vultr cloud (시애틀)에서 구동중인 우분투 리눅스 20.04 LTS

45로 시작하는 IP주소가 할당되어 있다는 것을 알 수 있다. 만약 공인IP가 NAT로 할당된 서버라면 ens3 이더넷 인터페이스에 사설IP가 표시될 것이다. 만약 그런 서버에 OpenVPN을 설치하려면 NAT로 할당된 공인IP주소를 미리 확인해두어야 한다.

 

리눅스에 OpenVPN 서버를 설치하려면 openvpn과 easy-rsa라는 패키지가 설치되어 있어야 한다. 그런데 이 패키지를 수동으로 설치하고 OpenVPN에서 요구하는 CA인증서를 만들고 인증서를 생성하는 과정이 만만치가 않다. 게다가 OpenVPN의 클라이언트(PC)에서 인증서를 다운로드 받아 설정하는 과정에서 원인을 알 수 없는 에러도 많이 발생한다.

 

그렇다보니 이 두개의 패키지를 설치하고 OpenVPN 클라이언트에서 사용할 수 있는 .opvn 파일까지 자동으로 생성해주는 스크립트를 만들어 배포하는 곳이 있다. 

 

바로 https://github.com/angristan/openvpn-install 이곳이다.

 

이곳에 가보면 Usage 항목에 OpenVPN 설치를 자동화해주는 스크립트를 다운로드 받고 실행 퍼미션을 부여하는 두줄의 명령어가 있다.

 

이 명령어를 아래 화면처럼 실행한다.

openvpn 자동 설치 스크립트 다운로드
openvpn install script download

그리고 가능하다면 이미 설치되어 있을지도 모르는 OpenVPN과 easy-rsa 패키지를 삭제할 것을 권한다. 다운로드 받은 openvpn-install.sh가 실행되면서 자동으로 설치해주기 때문이다. 

 

그리고 이 설치스크립트를 아래 화면처럼 리눅스 서버에 로그인하여 실행한다.

 

$ sudo bash openvpn-install.sh

openvpn install script
openvpn 자동설치 스크립트 실행

openvpn 자동설치 스크립트를 실행하면 가장 먼저 공인IP를 입력하라고 한다. 만약 이 항목에 기본적으로 사설IP가 표시된다면 NAT로 할당되는 공인IP를 확인하여 입력한다. 그리고 IPv6 활성화여부, OpenVPN이 사용할 포트 번호, TCP 혹은 UDP 중 어떤것을 사용할지 등등을 묻는다.

 

다만... Vultr 클라우드에서 UDP를 제한하고 있는지 UDP를 선택하면 벌처 클라우드의 방화벽에서 UDP 포트를 개방해줘도 통신이 되지 않는 문제가 있었다. 그래서 일단 TCP로 바꿔서 테스트를 했다.

 

이후 openvpn과 easy-rsa 패키지를 설치하고 혼자서 많은 작업을 진행한다. 

 

중간에 이름을 하나 입력하는 항목이 나오는데... 클라이언트의 이름이라고 보면 된다. 여기서는 blogger를 입력했다. 그러면 다음과 같이 PC로 다운로드 받아 OpenVPN GUI에서 사용할 .ovpn 파일을 만들어준다. 참 친절한 녀석이다. ^^

OpenVPN 클라이언트용 .ovpn 파일
OpenVPN 설치, 설정 완료 후 만들어진 OpenVPN 클라이언트용 .ovpn 파일

이 파일은 PC로 다운로드 받아 둔다.

 

이 .ovpn 파일을 열어보면 다음과 같은 내용이 보인다.

.ovpn 파일의 앞부분

나는 두번째 라인을 tcp로 바꾸었다. 이 파일은 설치 스크립트 첫 부분에서 프로토콜을 udp로 선택했을 때 클라이언트에 다운로드하여 클라이언트에서 실행할 OpenVPN GUI에 적용할 .ovpn이다. 리눅스 서버에 OpenVPN을 설치하고 프로토콜을 tcp로 변경하면 두번째 라인의 proto udb에서 tcp로 변경하고 세번째 라인의 explicit-exit-notify 를 지워줘야 한다. 명심하자.

 

아래는 .ovpn 파일의 뒷부분이다. 뒷 부분에는 CA인증서와 서버 인증서가 포함되어 있다.

ovpn 파일의 뒷부분

OpenVPN 설치가 완료되면 자동으로 구동되는데 다음과 같이 상태를 확인할 수 있다.

systemctl 명령으로 openvpn 구동 상태 확인
openvpn 구동 상태 확인

ifconfig -a 명령을 실행해보면 아래와 같이 vpn 터널링 용 가상 이더넷 인터페이스 tun0 가 생성되어 있는 것을 확인할 수 있다.

openvpn 설치/실행 후 생성된 VPN 터널링 용 가상 이더넷 인터페이스
openvpn 설치/실행 후 생성된 VPN 터널링 용 가상 이더넷 인터페이스

tun0 가 바로 vpn 터널링용 가상 이더넷이고 ip는 10.8.0.1이 할당되어 있는 것을 알 수 있다. 만약 집의 PC나 노트북에 PC용 OpenVPN 클라이언트 프로그램인 OpenVPN GUI를 설치하고 다운로드 받아 둔 .ovpn 파일을 읽어들여 vpn 연결을 시도하여 성공하면 tun0와 가상의 암호화된 사설 네트워크가 연결되는 것이다. 당연히 PC에는 10.8.0.x의 IP가 할당되는 가상의 터널링 이더넷 인터페이스가 생성될 것이라는 것을 네트워크 보안 과목에서 VPN을 공부했다면 짐작할 수 있어야 한다. ^^

 

이 대목에서 드러나지는 않지만 문제(?)가 발생하는 경우가 있다. 바로 tun0와 ens3 인터페이스간 라우팅이 이루어지지 않으면 IP세탁(?)을 위해 vpn으로 접속한 클라이언트들이 보낸 패킷들이 tun0에서 ens3로 가지 못하는 문제가 생긴다. 

 

이 문제는 OpenVPN 서버가 설치된 리눅스 서버가 라우팅을 해주도록 설정하면 해결된다. 이 서버의 경우 Vultr 클라우드에 위치하고 있고 AWS의 Security Group에 해당되는 Firewall 기능을 사용하기 때문에 iptable의 정책을 모두 지워둔 상태였다. 

 

그래서 다음의 세 명령을 통해 tun0에 ens3에 할당된 IP를 NAT하도록 하였고 ens3와 tun0 두 인터페이스간의 패킷을 포워딩하도록 설정하여 해결했다.

openvpn 터널링 인터페이스의 NAT 및 라우팅 설정
터널링 인터페이스와 기본 인터페이스간 NAT 및 라우팅 허용 설정

이제 미국 시애틀에 있는 리눅스 서버에 OpenVPN 설치는 완료되었다. 

참로로 아래는 리눅스 서버에 OpenVPN을 설치 했을 때 서버 용 설정 파일인 server.conf 파일이다.

openvpn server, server.conf
OpenVPN 서버의 설정파일 : server.conf

프로토콜을 tcp로 변경하였고 dns 서버는 8.8.8.8 로 설정되어 있는 것을 알 수 있다. 그 외에도 암호화 통신은 TLS 1.2 이상으로만 하도록 되어 있는 것도 볼 수 있다. 

 

이제 PC에 OpenVPN GUI를 다운로드 받아 설치한다. OpenVPN 공식 홈페이지에서 무료버전인 커뮤니티 버전을 다운로드 받으면 된다. (여기서)(과정은 생략)

 

그리고 서버에 OpenVPN을 설치하면 자동으로 만들어주는 .ovpn 파일을 PC로 다운로드 받는다.

.ovpn 파일

다운로드 받은 .ovpn 파일은 아래 폴더에 저장한다. PC에 설치한 OpenVPN GUI의 기본 설정파일 경로다.

OpenVPN GUI의 기본 설정파일 위치

OpenVPN GUI를 설치하면 아래 화면처름 Windows 10 트레이에 모니터와 자물쇠 표시가 된 아이콘이 보인다. 이 아이콘이 바로 OpenVPN GUI의 트레이 아이콘이다. 

Windows 10 - OpenVPN Tray Icon

이 트레이 아이콘에서 마우스 우클릭을 통해 VPN 연결, 연결해제, 종료, 로그보기, 설정보기, 설정파일읽어오기 등 작업을 수행할 수 있다. 앞에서 blogger.ovpn 파일을 비어있는 config 폴더에 복사해 넣었다면 트레이 아이콘에서 "연결"을 누르면 아래와 같이 VPN 연결이 이루어진다.

OpenVPN GUI의 VPN connect
OpenVPN GUI의 VPN 접속 로그

정상적으로 연결되면 로그 마지막 줄에 "succeeded"라는 메시지가 보이고 수신 바이트와 전송 바이트가 카운트되기 시작한다.

그리고 Windows PC의 명령창에서 ipconfig /all 명령을 실행하면 아래와 같이 OpenVPN TAP Adapter가 생성되어 있는 것을 볼 수 있다. 이 Adapter는 서버에서 생성된 터널링 이더넷과 동일한 VPN 통신에 사용되는 가상 이더넷이다. 그리고 IP는 서버의 tun0와 같은 IP 대역임을 알 수 있다. 즉 인터넷 구간을 통해 가상의 암호화된 터널링 네트워크를 통해 동일한 네트워크 즉 바로 옆에 위치하여 같은 L2 허브에 연결된 것 처럼 동작함을 알 수 있다.

windows pc에 생성된 vpn 가상 어댑터
OpenVPN GUI에서 VPN 연결 시 생성된 터널링 어댑터

그리고 화면 가장 아래에 기본적인 "무선 LAN 어댑터 로컬 영역 연결* 1"도 그래도 있음을 알 수 있다.

 

그리고 VPN이 연결되면 기본적으로 모든 트래픽은 VPN 연결에 의해 생성된 VPN 네트워크로 전송된다.

 

요즘 재택근무가 활성화되면서 보안을 위해 회사에 VPN 장비를 두고 집에서 회사로 VPN 연결을 통해 업무를 수행하도록 하고 있다. 때문에 VPN 장비에 트래픽 부하가 집중되기 때문에 "분할(Split) 터널링" 기술을 이용해 업무를 수행하는 트래픽만 회사의 VPN 장비로 전송되도록 하고 이외의 트래픽은 집의 공유기를 통해 VPN 연결하기 전과 같이 전송하도록 하는 흐름이  감지되는데... 기업의 기밀을 취급하거나 개인정보를 취급하는 업무를 수행하는 경우에는 보안상 절대 권할만한 기술은 아니다.

 

어쨌든 미국 시애틀에 있는 OpenVPN에 연결을 한 뒤 "내 IP 확인하기" 웹사이트에 접속해 보았다.

한국의 집에서 미국 시애틀의 OpvnVPN 서버에 접속 한뒤 내 PC의 IP 확인

오홋..!! IP가 미국으로 나온다. 

 

트위터에 접속해봤다.

트위터에 접속 - 미국 워싱턴주 시애틀로 나온다.

역시나 미국의 워싱턴주에 있는 시애틀로 인식되어 "의심스러운" 로그인이라고 경고가 발생한다.

 

IP 세탁이 완료되었다.

 

운영체제 계정 인증 추가하기(PAM AUTH)

OpenVPN GUI를 이용해 VPN 연결 시 인증은 기본적으로 PKI 인증서 기반 인증이다. 그러나 PKI 인증서 기반 인증은 PC에 저장되어 있는 인증서를 해커에게 탈취당할 경우 해커가 내부망으로 침투할 수 있다.

 

때문에 인증서 인증에 더해 사용자 계정 인증(ID/PASSWORD)를 추가하는 것이 좋다. 여기서는 리눅스 서버에 설치된 OpenVPN이므로 리눅스 운영체제 인증을 추가해본다.

 

먼저 OpenVPN의 서버 설정파일인 server.conf 파일 (위치는 /etc/openvpn)에 다음의 라인을 추가한다.

server.conf 파일에 pam 인증모듈 추가

만약 위의 경로에 openvpn-plugin-auth-pam.so 파일이 없다면 find 명령을 통해 해당 파일을 찾아 해당 경로로 지정해주면 된다. 

그리고 PC에 설치된 OpenVPN GUI의 설정파일에도 다음의 라인을 추가한다.

.ovpn 파일에 ID/PASSWORD 인증 옵션 추가

이제 OpenVPN 서버와 OpenVPN GUI를 모두 재시작한 뒤 VPN 연결을 시도하면 다음과 같이 ID/비밀번호 로그인 창이 추가로 실행된다.

인증서 인증에 추가 된 ID/비밀번호 인증

여기에 입력하는 ID/비밀번호는 운영체제 계정임을 명심하자.

 

#openvpn #vpn #ip세탁 

댓글(0)

Designed by JB FACTORY