
안녕하세요! 이번 글에서는 라즈베리 파이(Raspberry Pi)에 OpenVPN을 활용해 자신만의 VPN(가상 사설망) 서버를 구축하는 방법을 단계별로 소개하겠습니다. 서버 구축이 끝나면, VPN 사용 사실을 숨겨 검열을 우회할 수 있도록 트래픽을 위장하는 난독화(obfuscation) 서버까지 함께 설정해 보겠습니다.
왜 VPN을 사용해야 할까요?
본격적인 설정에 앞서, VPN 서버가 필요한 이유부터 살펴보겠습니다.
- 중간자 공격(MITM) 방지 — 같은 로컬 네트워크에 악의적인 사용자가 있다면, 심지어 룸메이트일지라도, 그 사람은 여러분의 암호화되지 않은 트래픽을 엿보거나 조작할 수 있습니다. VPN은 이런 위험으로부터 보호해 줍니다.
- 인터넷 사용 기록 은닉 — 인터넷 제공업체(ISP)나 학교 네트워크로부터 자신의 인터넷 활동을 숨길 수 있습니다. 필자의 경우 대학 네트워크가 해당됩니다.
- 차단된 서비스 우회 — 필자의 대학은 모든 UDP(User Datagram Protocol) 패킷을 차단합니다. 그 결과 메일 클라이언트 사용, 게임, 심지어 Git 사용조차 불가능했죠. VPN을 통해 이런 제약을 벗어날 수 있습니다.
필자는 집에 있는 라즈베리 파이에 VPN을 구축하기로 했습니다. 이렇게 하면 대학에 있을 때도 집 네트워크에 안전하게 접속할 수 있습니다. 만약 다른 국가에 VPN 서버가 필요하다면 DigitalOcean에서 월 5달러짜리 가상 사설 서버(VPS)를 구입하는 것도 좋은 선택입니다.
1단계: OpenVPN 설치
이 단계는 생각보다 훨씬 쉽습니다. 셸 스크립트가 대부분의 작업을 자동으로 처리해 주기 때문입니다. 마치 '다음' 버튼만 누르면 되는 설치 마법사처럼 간단합니다.
다만 설치에는 시간이 꽤 걸릴 수 있습니다. 선택한 키 크기(key-size)에 따라 다른데, 필자의 라즈베리 파이 3 모델 B 기준으로 약 3시간 정도 소요되었습니다.
GitHub의 Angristan/OpenVPN-install 저장소로 이동하여 안내에 따라 진행하세요. Debian, Ubuntu, Fedora, CentOS, Arch Linux 환경에서 OpenVPN 서버를 손쉽게 구축할 수 있는 스크립트입니다.
서버의 IP 주소를 모른다면 0.0.0.0을 입력하면 됩니다. 필자는 포트로 443, 프로토콜로 TCP(Transmission Control Protocol)를 선택했습니다.
참고: 이 부분이 매우 중요합니다. 필자의 대학 네트워크는 TCP/80과 TCP/443 포트만 허용하고 나머지는 대부분 차단하기 때문입니다. 또한 Obfsproxy는 TCP에서만 작동하므로 반드시 TCP를 선택하세요!
스크립트 실행이 완료되면 .ovpn 파일이 생성됩니다. 이 파일을 선호하는 VPN 클라이언트에 가져오기(import)하면 별도 설정 없이 바로 작동합니다.
연결 테스트하기
VPN 클라이언트에 .ovpn 파일을 불러온 뒤, IP 주소 0.0.0.0을 라즈베리 파이의 내부 IP로 변경하세요. 네트워크 설정에 따라 192.168.*.* 형태일 가능성이 높습니다.
참고: 이 방법은 라즈베리 파이와 동일한 Wi-Fi에 연결되어 있을 때만 작동합니다.
팁: 필자는 공유기 설정에서 라즈베리 파이에 항상 고정 IP를 할당하도록 구성했습니다. 비슷한 설정을 원한다면 공유기 관리 페이지에서 DHCP 예약 기능을 확인해 보세요.
연결에 성공했다면 축하합니다! 이제 여러분만의 VPN 서버가 생겼습니다. 하지만 아직 외부에서는 접속할 수 없습니다. 난독화 프록시 없이 OpenVPN 서버만 필요하다면 아래의 포트 포워딩 섹션으로 건너뛰셔도 됩니다.
2단계: 난독화(Obfuscation) 프록시 설치
Obfs4는 트래픽을 스크램블링(scrambling)하는 프록시입니다. 인터넷 트래픽을 무작위 노이즈처럼 위장해 주기 때문에, 트래픽을 감청하는 사람은 실제로 무엇을 하는지 알 수 없습니다. 특히 능동적 탐지(active probing) 공격으로 유명한 중국의 만리방화벽(Great Firewall)으로부터도 보호받을 수 있습니다.
주의: 상대방이 화이트리스트 방식으로 허용된 트래픽만 통과시킨다면 이 방법은 작동하지 않습니다.
프록시 서버 설치 절차
① 필수 패키지 설치
apt-get update && apt-get install obfs4proxy② 설정 디렉터리 생성
sudo mkdir -p /var/lib/tor/pt_state/obfs4③ 설정 파일 생성
sudo nano /var/lib/tor/pt_state/obfs4/obfs4.config설정 파일에 아래 내용을 붙여넣습니다.
TOR_PT_MANAGED_TRANSPORT_VER=1
TOR_PT_STATE_LOCATION=/var/lib/tor/pt_state/obfs4
TOR_PT_SERVER_TRANSPORTS=obfs4
TOR_PT_SERVER_BINDADDR=obfs4-0.0.0.0:444
TOR_PT_ORPORT=127.0.0.1:443TOR_PT_SERVER_BINDADDR는 프록시가 새 연결을 수신할 주소입니다. 필자의 경우 0.0.0.0:444로 지정했습니다. 왜 443이 아닌 444일까요? 현재 443 포트에서 수신 중인 OpenVPN 서버 설정을 변경하고 싶지 않았기 때문입니다. 이 주소는 나중에 포트 포워딩을 통해 443으로 매핑할 예정입니다.
TOR_PT_ORPORT는 OpenVPN 서버를 가리켜야 합니다. 필자의 경우 서버가 127.0.0.1:443에서 실행 중입니다.
④ SystemD 서비스 파일 생성
sudo nano /etc/systemd/system/obfs4proxy.service파일에 아래 내용을 붙여넣습니다.
[Unit]
Description=Obfsproxy Server
[Service]
EnvironmentFile=/var/lib/tor/pt_state/obfs4/obfs4.config
ExecStart=/usr/bin/obfs4proxy -enableLogging true -logLevelStr INFO
[Install]
WantedBy=multi-user.target⑤ 난독화 프록시 시작
OpenVPN이 실행 중인지 확인한 후, 아래 명령어로 프록시를 시작하고 부팅 시 자동 실행되도록 등록합니다.
sudo systemctl start obfs4proxy
sudo systemctl enable obfs4proxy⑥ 인증서 KEY 저장
서비스가 시작되면 아래 명령어를 실행하여 cert KEY를 저장해 두세요.
cat /var/lib/tor/pt_state/obfs4/obfs4_bridgeline.txt키는 Bridge obfs4 <IP ADDRESS>:<PORT> <FINGERPRINT> cert=KEY iat-mode=0 형태입니다. VPN에 연결할 때 이 키가 필요합니다.
⑦ 연결 테스트
VPN 클라이언트를 열고 포트를 443에서 444로 변경하여 OpenVPN 서버 대신 프록시에 연결되도록 합니다. 그다음 VPN 클라이언트에서 Pluggable Transport 옵션을 찾아 obfs4를 지원하는지 확인하세요.

Viscosity는 obfs2, obfs3, obfs4, ScrambleSuit 등 다양한 난독화 방식을 지원합니다.
모든 것이 정상적으로 작동한다면 준비 완료입니다! 축하합니다! 외부에서 VPN을 사용하기 전에 몇 가지만 더 설정하면 됩니다.
3단계: 포트 포워딩(Port Forwarding)
외부에서 OpenVPN 서버에 접속하려면 포트를 개방해야 합니다. 대부분의 공유기에서 해당 포트들이 차단되어 있기 때문입니다. 앞서 언급했듯이 필자는 공유기에서 라즈베리 파이의 IP를 항상 192.168.1.125로 예약해 두었기 때문에, 파이가 재접속하거나 공유기가 재부팅되더라도 IP가 바뀌지 않습니다.
이를 바탕으로 포트 포워딩 테이블에 다음 규칙들을 정의했습니다.

TL-WR841N 공유기의 포트 포워딩 설정 화면.
- 외부 포트 443 → 난독화 서버 포트 444: 난독화 서버가 없다면 443 → 443으로 설정하세요.
- 외부 포트 25 → 파이의 SSH 포트 22: 편의상 추가한 규칙입니다.
- 외부 포트 444 → 443: 난독화 프록시를 거치지 않고 OpenVPN 서버에 직접 접속하고 싶을 때 사용합니다.
여기서 서비스 포트(service port)는 공인(PUBLIC) IP와 함께 사용되는 외부(OUTSIDE) 포트입니다. 자신의 공인 IP는 whatsmyip.com 같은 서비스로 확인할 수 있습니다. 내부 포트(internal port)는 내부(INSIDE) 포트로, 동일 네트워크에 연결되어 있을 때만 사용됩니다.
참고: 첫 번째 규칙은 PUBLIC_IP:443으로 들어오는 모든 연결을 192.168.1.125:444로 리디렉션하라는 의미입니다.
외부 연결 테스트
- 공인 IP를 확인한 후, .ovpn 파일이나 VPN 클라이언트의 기존 IP를 공인 IP로 교체합니다.
- VPN에 연결합니다.
이것으로 끝입니다!
4단계: 다이내믹 DNS(Dynamic DNS)
대부분의 가정용 인터넷은 동적 IP를 사용하기 때문에 IP 주소가 주기적으로 변경됩니다. 이 문제를 해결하는 한 가지 방법은 라즈베리 파이에 작은 프로그램을 만들어 IP를 저장하고 하루에 한 번 정도 이메일로 알려주는 것입니다. Firebase 같은 온라인 데이터베이스에 IP를 저장하는 방법도 있습니다.
필자의 공유기에는 다이내믹 DNS(DDNS) 설정 기능이 있습니다. 이를 활용하면 NoIP 같은 서비스 제공업체를 통해 example.no-ip.com과 같은 도메인을 받을 수 있고, 이 도메인은 항상 현재 공인 IP를 가리키게 됩니다.

TL-WR841N 공유기의 DDNS 설정 화면.
추가 참고 자료
- A Child's Garden of Pluggable Transports
- Viscosity — Obscuration 가이드
- https://www.pluggabletransports.info/transports/
궁금한 점이 있다면 Twitter로 문의해 주세요.
무료로 코딩을 배워보세요. freeCodeCamp의 오픈소스 커리큘럼은 이미 4만 명 이상의 사람들이 개발자로 취업하는 데 도움을 주었습니다. 지금 바로 시작해 보세요!