본문 바로가기
Network/VPN

[VPN] VPN 종류 및 구축 방법 PART2[완결] (구축 방법)

by EverChain 2026. 7. 19.

⚠️ **블로그 컨셉상 반어체가 들어가니 양해바랍니다
**

VPN은 그냥 내가 만들어서 쓰는게 채고시다...

 

🔒 VPN 종류 및 구축 방법 PART2[완결] (구축 방법)

VPN 포스팅이 상당한 인기를 끌고 있다.
물 들어올 때 노 저으라고, 바로 PART2를 포스팅한다. 🚣‍♂️
 
이번 편에서는 클라우드 환경에서 OpenVPN 구축과 최근 대세인 WireGuard 구축, 그리고 PowerDNS를 이용한 Private DNS 세팅이다.

사실 대 AI 시대에 구축 방법 정도야 그냥 AI에게 물어서 딸깍 하면 되는 세상이지만, 꿋꿋이(?) 이런 강의류의 글을 쓰는 이유는 딸깍 하더라도 원리를 알고 해야 하기 때문이다.

왜 그렇게 코드를 짜주고, 어떤 코드에선 왜 안 되며, 궁극적으로 내가 원하는 방식의 산출물을 얻으려면
항상 Principle(원리)과 Why(이유)를 잊지 말아야 한다(틀내).... 😉


🛠️ 클라우드 내 서버에 직접 올리는 OpenVPN

서버맨이 이번 포스팅에선, 우분투 서버에서 터미널 열고 슥슥 복붙만 하면 한 방에 완성되는 100% 복붙형 매뉴얼을 준비했다.
서버 셋업은 총 5단계로 진행된다. 패키지 설치부터 CA 인증서 발급, 그리고 라우팅(NAT) 설정까지 순서대로 꼼꼼히 따라오길 바란다. 각 단계별로 무엇을 처리하는지 설명과 코드를 나누어 두었으니 꼼꼼히 이해하자.


1. OpenVPN 패키지 및 Easy-RSA 툴킷 다운로드

이렇게 받아짐

 
가장 먼저 우분투 시스템의 패키지 저장소 목록을 최신화하고, 실질적으로 터널링을 생성할 OpenVPN 엔진과 사설 인증기관(CA) 구축에 필요한 스크립트 모음인 Easy-RSA를 다운로드한 후 압축을 해제한다. 버전은 서버맨이 써보기에 가장 버그가 없고 검증된 3.0.4 버전을 사용하도록 한다.

💻 패키지 다운로드 및 압축 해제 코드
# apt 업데이트 및 필수 패키지 설치
sudo apt update && sudo apt install -y openvpn wget

# Easy-RSA 최신 릴리즈 다운로드 및 압축 해제
cd ~
wget https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.4/EasyRSA-3.0.4.tgz
tar xvf EasyRSA-3.0.4.tgz
cd EasyRSA-3.0.4

2. 사설 CA(인증기관) 수립 및 서버용 키쌍 발급

ca.crt


OpenVPN은 접속의 보안을 강화하기 위해 사설 CA에서 서명한 인증서 기반 통신을 한다. vars 설정을 복사해 기본 정보를 기입하고, 패스워드가 없는 nopass 모드로 루트 CA를 빌드한 다음, 서버 인증서를 발급한다. 그 후 대칭키를 유도하기 위한 Diffie-Hellman 파라미터(dh.pem)와 포트 스캔/DDoS 방어용 TLS 서명 키(ta.key)를 연달아 생성하여 OpenVPN 기본 설정 디렉토리로 복사한다(디피헬만 생성 시에는 CPU 스펙에 따라 다소 시간이 발생한다). 

🔑 CA 및 서버 인증서 발급 스크립트
# 1. Easy-RSA 설정(vars) 복사 및 기본값 주입
cp vars.example vars

cat << 'EOF' >> vars
set_var EASYRSA_REQ_COUNTRY    "KR"
set_var EASYRSA_REQ_PROVINCE   "Gyeonggi-do"
set_var EASYRSA_REQ_CITY       "Seongnam"
set_var EASYRSA_REQ_ORG        "nSR"
set_var EASYRSA_REQ_EMAIL      "SR@sr.co.kr"
set_var EASYRSA_REQ_OU         "SR"
EOF

# 2. PKI 환경 초기화 및 루트 CA 생성 (비밀번호 없는 nopass로 진행)
./easyrsa init-pki
EASYRSA_BATCH=1 EASYRSA_REQ_CN="OpenVPN-CA" ./easyrsa build-ca nopass

# 3. VPN 서버용 개인키 및 인증서 요청서(CSR) 생성
EASYRSA_BATCH=1 EASYRSA_REQ_CN="vpn-server" ./easyrsa gen-req server nopass

# 4. 서버 인증서 최종 승인 및 서명(Sign)
EASYRSA_BATCH=1 ./easyrsa sign-req server server

# 5. 생성된 인증서 파일들을 OpenVPN 기본 디렉토리로 이사시키기
sudo cp pki/issued/server.crt /etc/openvpn/
sudo cp pki/ca.crt /etc/openvpn/
sudo cp pki/private/server.key /etc/openvpn/

# 6. Diffie-Hellman 파라미터 생성 및 복사
EASYRSA_BATCH=1 ./easyrsa gen-dh
sudo cp pki/dh.pem /etc/openvpn/

# 7. TLS Auth용 ta.key 생성
sudo openvpn --genkey --secret /etc/openvpn/ta.key

💡 왜 nopass로 생성하나?


nopass 옵션을 뺐다간 클라우드 서버가 재기동될 때마다 VPN 데몬이 안 뜨고 멈춰 서서 패스워드를 요구하는 참사가 일어난다. 집 나간 서버를 찾아서 수동으로 비번 쳐주고 싶지 않다면 얌전히 nopass로 가자.


3. 접속 단말용 개별 인증서 발급

그냥 silverpencil 따라 만들고 나중에 ovpn 파일명만 바꿔서 써도 문제없음


VPN 서버에 실제로 접속하여 연결을 구성할 내 스마트폰이나 노트북 등 클라이언트 단말용 키쌍을 발급해 주는 과정이다. 이 가이드에서는 사용자의 구별자명을 silverpencil로 통일하여 발급하겠다(파일명은 생성 후에도 수정 가능). 키 관리를 편하게 하기 위해 별도의 디렉토리를 생성하여 필요한 키들을 모아둔다.

📲 silverpencil 기기용 인증서 발급 코드
# 클라이언트 인증서를 따로 보관할 폴더 생성
mkdir -p ~/client-configs/keys
chmod 700 ~/client-configs/keys

# 클라이언트 개인키 및 CSR 생성
EASYRSA_BATCH=1 EASYRSA_REQ_CN="silverpencil" ./easyrsa gen-req silverpencil nopass

# 클라이언트 인증서 서명(Sign)
EASYRSA_BATCH=1 ./easyrsa sign-req client silverpencil

# 생성된 키들을 한곳으로 모아주기
cp pki/private/silverpencil.key ~/client-configs/keys/
cp pki/issued/silverpencil.crt ~/client-configs/keys/
sudo cp /etc/openvpn/ca.crt ~/client-configs/keys/
sudo cp /etc/openvpn/ta.key ~/client-configs/keys/

4. 서버 구성 파일() 생성 및 설정값 최적화

내용은 많지만 / 위주로 찾아서 바꾸거나 걍 내꺼 복붙..

 

OpenVPN 서비스의 대문 포트, 사용 프로콜, 가상 네트워크 대역 및 패킷 필터링 정책을 총괄 결정하는 server.conf 구성 파일을 정의하는 단계다. 기본 UDP/1194 포트는 통신사의 백본 필터에서 스캔되거나 차단당할 위험성이 매우 높으므로, TCP 우회 안정성이 뛰어난 2294번 포트와 TCP 프로토콜로 세팅한다.

⚙️ server.conf 복사 및 덮어쓰기 코드
sudo tee /etc/openvpn/server.conf << 'EOF'
# OpenVPN 구동 포트 및 프로토콜
port 2294
proto tcp
dev tun

# 인증서 경로 지정
ca /etc/openvpn/ca.crt
cert /etc/openvpn/server.crt
key /etc/openvpn/server.key
dh /etc/openvpn/dh.pem

# VPN 내부 IP 대역
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt

# 모든 클라이언트 트래픽을 VPN 터널로 가로채기 (디폴트 게이트웨이 리다이렉션)
push "redirect-gateway def1 bypass-dhcp"

# DNS 강제 주입 (방통위 SNI 차단 회피용 구글 DNS)
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"

# 클라이언트끼리 서로 내부 통신 허용 및 동일 인증서 중복 로그인 허용
client-to-client
duplicate-cn

# 연결 확인 주기
keepalive 10 120

# TLS 패킷 서명 검증 및 방향 지정
tls-auth /etc/openvpn/ta.key 0
key-direction 0

# 대칭키 암호화 알고리즘 지정 (군용급 AES-256-CBC)
cipher AES-256-CBC
auth SHA256

# 데몬의 실행 권한을 낮춰 보안성 향상
user nobody
group nogroup
persist-key
persist-tun

# 로그 설정
status openvpn-status.log
verb 3
explicit-exit-notify 0
EOF

5. 우분투 IP 포워딩 활성화 및 UFW 방화벽 NAT 구성

서비스 도는 상태


클라이언트의 트래픽이 VPN 서버로 유입되어 외부 공인 망으로 나갈 때, IP를 서버의 공인 외부 IP로 둔갑시켜 통과시키는 주소 변환(MASQUERADE) 룰을 우분투 UFW 방화벽에 세팅하는 과정이다. 이를 생략하면 터널은 붙는데 패킷이 외부로 나가지 못해 브라우저 먹통 현상이 발생한다.

🛡️ IP Forwarding 및 NAT 룰 삽입 스크립트
# 1. 커널 레벨에서 IP 포워딩(패킷 라우팅) 활성화
sudo sysctl -w net.ipv4.ip_forward=1
echo "net.ipv4.ip_forward = 1" | sudo tee -a /etc/sysctl.conf

# 2. 네트워크 인터페이스 찾기 및 방화벽 룰 삽입
NET_INTF=$(ip route show | grep default | awk '{print $5}')
sudo sed -i "1s/^/*nat\n:POSTROUTING ACCEPT [0:0]\n-A POSTROUTING -s 10.8.0.0\/16 -o $NET_INTF -j MASQUERADE\nCOMMIT\n\n/" /etc/ufw/before.rules

# 3. UFW 포워딩 허용 및 포트 오픈
sudo sed -i 's/DEFAULT_FORWARD_POLICY="DROP"/DEFAULT_FORWARD_POLICY="ACCEPT"/' /etc/default/ufw
sudo ufw allow 2294/tcp
sudo ufw allow OpenSSH
sudo ufw --force disable
sudo ufw --force enable

# 4. OpenVPN 서비스 시작
sudo systemctl start openvpn@server
sudo systemctl enable openvpn@server

CLIENT 셋업 파트: 클라이언트용.ovpn 프로필 빌드

개별 기기에 여러 개의 인증서 파일(ca.crt, client.crt 등)을 하나하나 넘기는 건 보안상 관리도 어렵고 파일 경로 세팅이 번거롭다. 베이스 템플릿을 수정하고, 단 하나의 .ovpn 텍스트 파일 내에 모든 인증 기관 인증서와 개인 비밀키를 통째로 인라인 태그(<ca>, <cert>)로 때려 박는 통합 프로필 결합 스크립트를 가동한다(하지만 ta.key는 별도).

📲 silverpencil.ovpn 통합 프로필 자동 조립 코드
# 1. base.conf 생성 및 커스텀 튜닝
mkdir -p ~/client-configs/files
cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf ~/client-configs/base.conf
SERVER_IP=$(curl -s ifconfig.me)

sed -i "s/^remote my-server-1 2294/remote $SERVER_IP 2294/" ~/client-configs/base.conf
sed -i "s/^proto udp/;proto udp/" ~/client-configs/base.conf
sed -i "s/^;proto tcp/proto tcp/" ~/client-configs/base.conf
sed -i "s/^cipher AES-256-CBC/cipher AES-256-CBC\nauth SHA256/" ~/client-configs/base.conf
sed -i "s/^ca ca.crt/#ca ca.crt/" ~/client-configs/base.conf
sed -i "s/^cert client.crt/#cert client.crt/" ~/client-configs/base.conf
sed -i "s/^key client.key/#key client.key/" ~/client-configs/base.conf
sed -i "s/^tls-auth ta.key 1/#tls-auth ta.key 1/" ~/client-configs/base.conf
echo "key-direction 1" >> ~/client-configs/base.conf

# 2. 매직 스크립트 작성 및 실행
cat << 'EOF' > ~/client-configs/make_config.sh
#!/bin/bash
KEY_DIR=~/client-configs/keys
OUTPUT_DIR=~/client-configs/files
BASE_CONFIG=~/client-configs/base.conf

cat ${BASE_CONFIG} \
    <(echo -e '<ca>') \
    ${KEY_DIR}/ca.crt \
    <(echo -e '</ca>\n<cert>') \
    ${KEY_DIR}/${1}.crt \
    <(echo -e '</cert>\n<key>') \
    ${KEY_DIR}/${1}.key \
    <(echo -e '</key>\n<tls-auth>') \
    ${KEY_DIR}/ta.key \
    <(echo -e '</tls-auth>') \
    > ${OUTPUT_DIR}/${1}.ovpn
EOF

# 스크립트 권한 변경 후 silverpencil 클라이언트 파일 생성
chmod 700 ~/client-configs/make_config.sh
cd ~/client-configs
./make_config.sh silverpencil

 

 

 

 

 
모든 스크립트 실행이 끝났다면 ~/client-configs/files/silverpencil.ovpn 파일과 ta.key 파일 단 두개만 빼내서 폰이나 PC의 OpenVPN 앱에 집어넣으면 된다. 👌
(그러니까 원래는 ovpn파일, ta.key 파일 말고도 ca 파일들 3개가 더 있어야하는데 나혼자(?) 쓸거라 합병시킨 것이다)


⚡ 요즘 대세, 초경량 WireGuard 구축 방법

엔진이름이자 앱이름

 
다음은 WireGuard(와이어가드) 구축 방법이다.

WireGuard에 대해 먼저 설명하자면, OpenVPN보다 훠어어얼씬 가볍고 빠르다. 🚀
OpenVPN이 낡고 방대한 코드(수십만 줄)로 이루어진 무거운 에어컨이라면, WireGuard는 단 4천 줄 남짓의 최신식 초절전 선풍기 같은 놈이다.
 

커널 공간(Kernel Space)에서 다이렉트로 동작하기 때문에 CPU 오버헤드가 극도로 적고, Curve25519, ChaCha20 같은 최신예 암호화 알고리즘만 채택해서 보안성도 짱짱하다.

게다가 모바일 환경에서 네트워크가 LTE에서 Wi-Fi로 바뀌어도 연결이 끊어지지 않고 스무스하게 넘어가는(Roaming) 사기적인 기능까지 갖췄다.
 

다만, WireGuard는 OpenVPN처럼 1개의 .conf 파일로 여러 명이 동시에 접속하는 형태(duplicate-cn)가 아예 설계상 불가능하다. 완벽한 1:1 Peer-to-Peer 구조이기 때문에 여러 명이 접속하려면 클라이언트(Peer) 설정 파일을 각각 기기별로 따로 만들어 등록해야 한다.


그러므로 이번 포스팅에서는 서버 구축부터 총 10개의 다중 접속자 클라이언트 설정 파일까지 싹 다 자동으로 찍어내는 단계별 구축 방법을 설명하겠다.


STEP 1. WireGuard 패키지 설치

우분투 커널 내부로 WireGuard 모듈을 로드시키고, 터널 인터페이스를 조작할 수 있는 유틸리티(wireguard-tools)를 리포지토리에서 땡겨와서 설치해 준다.

💻 WireGuard 패키지 설치 명령어
sudo apt update && sudo apt install -y wireguard curl

STEP 2. 서버 프라이빗/퍼블릭 키쌍 생성 및 라우팅 설정

WireGuard는 기본적으로 암호화 통신을 위해 비대칭 키쌍 방식을 사용한다. 서버의 고유 키쌍을 만들고 가상 내부 IP 대역(10.0.0.1/24)과 리슨 포트(51820), 그리고 인터페이스가 구동되고 죽을 때 방화벽 룰을 갈아 끼울 PostUp / PostDown 구성을 적어 넣는다.

💡 PostUp & PostDown을 넣는 이유?


터널링이 가동될 때 가상 인터페이스 wg0에 설정된 사설 대역 패킷들을 실제 인터넷망이 있는 하드웨어 이더넷 인터페이스(eth 등)로 우회(MASQUERADE)시키고, 꼬임 방지를 위해 전용 라우팅 테이블(table 123)로 패킷 경로 규칙을 격리·제어하기 위해서다.

⚙️ 서버 키 및 wg0.conf 초기 생성 (코드 보기)
# 1. 서버 비대칭 키쌍 생성
WG_PRIV=$(wg genkey)
WG_PUB=$(echo $WG_PRIV | wg pubkey)

# 2. 내 네트워크의 기본 인터페이스 및 게이트웨이 IP 동적 감지
default_route=$(ip -4 route show default | grep -v 'tun' | grep -v 'wg' | head -n 1)
NET_ETH=$(echo "$default_route" | awk '{print $5}')
# 만약 위의 eth 인식이 불안정하면 직접 인터페이스 이름을 따와도 무방하다.
NET_GW=$(echo $default_route | awk '{print $3}')

# 3. wg0.conf 구성 파일 생성
sudo tee /etc/wireguard/wg0.conf << EOF
[Interface]
Address = 10.0.0.1/24
ListenPort = 51820
PrivateKey = $WG_PRIV
PostUp = ip route flush table 123 || true; while ip rule del from 10.0.0.0/24 table 123 2>/dev/null; do :; done; ip rule add from 10.0.0.0/24 table 123; ip route add default via $NET_GW dev $NET_ETH table 123; iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o $NET_ETH -j MASQUERADE
PostDown = ip rule del from 10.0.0.0/24 table 123; iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o $NET_ETH -j MASQUERADE
EOF

STEP 3. 커널 포워딩 활성화 및 방화벽 규칙 지정

간단해서 스샷 올릴 것도 없음

 

OpenVPN과 마찬가지로 우분투 OS 자체가 네트워크 라우터 역할을 대행할 수 있도록 IPv4 포워딩 플래그를 커널에 주입하고 갱신시킨 후, UFW 단에서 Wireguard 기본 전송 규격인 51820/udp 포트를 열어준다.

🛡️ sysctl 튜닝 및 방화벽 UFW 포트 오픈
# 커널 포워딩 설정 적용
echo 'net.ipv4.ip_forward=1' | sudo tee /etc/sysctl.d/99-wg.conf
sudo sysctl -p /etc/sysctl.d/99-wg.conf

# 51820 UDP 포트 개방 및 활성화
sudo ufw allow 51820/udp
sudo wg-quick up wg0
sudo systemctl enable wg-quick@wg0

STEP 4. 10명의 다중 클라이언트(Peer) 설정 파일 일괄 생성

1개의 conf를 중복해서 쓰면 기존 접속이 끊김

 
WireGuard는 접속하려는 모든 Peer의 공인 키를 서버가 수동으로 가지고 있어야 통신이 매칭된다. 하나하나 손으로 키를 뽑다간 집나간 멘탈을 찾게 되므로, 10개의 클라이언트 프로필을 반복 루프를 통해 단숨에 뽑아내고 서버 설정에 Peers 정보를 덧붙이는 구조화 스크립트를 작성하여 가동한다.

💡 PersistentKeepalive = 25 는 왜 필요한가?


공유기 내부 사설망(NAT) 하위에 위치한 모바일/PC 클라이언트가 서버로 주기적인 핑 패킷(Keepalive)을 쏘게 하여, 공유기가 커넥션 정보를 끊지 못하게 유지하는 역할을 한다. 이게 없으면 유휴 상태에서 서버가 클라이언트를 먼저 찾아서 패킷을 보낼 때 접속 불가 현상이 발생할 수 있다.

📁 10인분 대량 Peer 자동 빌더 파이썬 스크립트 작성 및 가동
# 1. 10개 Peer를 자동으로 서버에 등록하고 로컬에 conf 파일을 뿌려주는 툴킷 제작
cat << 'EOF' > generate_peers.py
import os, subprocess, re, sys, time

def run_cmd(cmd):
    return subprocess.check_output(cmd, shell=True).decode('utf-8').strip()

# 서버 키 및 공인 IP 정보 땡겨오기
s_pub = run_cmd("wg show wg0 public-key")
pub_ip = run_cmd("curl -s ifconfig.me")
os.makedirs("./configs", exist_ok=True)

print("🚀 10개의 클라이언트 설정 생성 및 wg0.conf Peer 정보 주입 중...")
for i in range(1, 11):
    new_tail = 1 + i
    new_ip = f"10.0.0.{new_tail}"
    c_priv = run_cmd("wg genkey")
    c_pub = run_cmd(f"echo {c_priv} | wg pubkey")

    # 1. 작동 중인 커널 인터페이스에 Peer 실시간 등록
    run_cmd(f"wg set wg0 peer {c_pub} allowed-ips {new_ip}/32")

    # 2. 서버 설정 파일(/etc/wireguard/wg0.conf) 영구히 저장될 블록 추가
    with open("/etc/wireguard/wg0.conf", "a") as f:
        f.write(f"\n[Peer]\nPublicKey = {c_pub}\nAllowedIPs = {new_ip}/32\n")

    # 3. 개별 접속자가 소유할 클라이언트 전용 설정파일 빌드
    client_conf = f"""[Interface]
PrivateKey = {c_priv}
Address = {new_ip}/32
DNS = 1.1.1.1

[Peer]
PublicKey = {s_pub}
Endpoint = {pub_ip}:51820
AllowedIPs = 0.0.0.0/0, 10.0.0.0/24, 192.168.1.0/24
PersistentKeepalive = 25
"""
    with open(f"./configs/user_{new_tail}.conf", "w") as f:
        f.write(client_conf)

print("✨ 완료! configs 폴더 내부에 각각의 user_*.conf 파일이 생성되었습니다.")
EOF

# 2. 툴킷 실행
sudo python3 generate_peers.py

 

실행 후 생성된 ./configs/user_*.conf 파일 중 마음에 드는 거 하나 집어다가 단말기에서 사용하면 깔끔하게 구축 완료다!


🛡️ PowerDNS(PDNS)를 이용한 Private DNS 설정

설정에서 프라이빗 DNS 검색 ㄱㄱ

 
마지막으로 PowerDNS(PDNS)를 이용한 Private DNS 설정 방법이다.

일단 이 포스팅에서 PowerDNS 서버 설치부터 설명하면 포스트가 너무 길어져서 그건 생략하겠다. (도메인도 사고 A레코드도 등록하는 절차가 필요하므로, 다른 포스팅에서 도메인 구입 + 레코드 생성 + PDNS 구축을 한 번에 다루도록 하겠다.)
 

그래도 일단 알아서(?) PDNS를 구축했다는 가정하에, Private DNS에서 실제로 구동될 광고 차단용 dnsdist.conf 핵심 파일을 공유한다.


도메인 매칭 시 블랙리스트 목록을 긁어와 NXDOMAIN 혹은 0.0.0.0으로 인위적으로 바보(블락) 응답을 유도해 불필요한 트래픽을 원천 봉쇄하는 매커니즘이다.

 

🔥 광고 차단 특화 dnsdist.conf (코드 보기)
-- /etc/dnsdist/dnsdist.conf
-- [1] 네트워크 및 보안 설정
addACL('0.0.0.0/0')
addTLSLocal("0.0.0.0:853", "/etc/dnsdist/certs/fullchain.pem", "/etc/dnsdist/certs/privkey.pem")

-- [2] 캐시 설정
pc = newPacketCache(10000, {maxTTL=86400, minTTL=0, temporaryFailureTTL=60, staleTTL=60, dontAge=false})
getPool(""):setCache(pc)

-- [3] 백엔드 설정 (모든 주소에 :53 포트 명시 완료)
newServer({address="127.0.0.1:53", pool="auth", name="local-pdns"})
newServer({address="1.1.1.1:53", pool="recursor", checkName="google.com"})
newServer({address="8.8.8.8:53", pool="recursor", checkName="google.com"})

-- [4] 화이트리스트 (차단 제외 목록)
local whitelist = newSuffixMatchNode()
whitelist:add(newDNSName("kakao.com"))
whitelist:add(newDNSName("kakaocdn.net"))
whitelist:add(newDNSName("daum.net"))
whitelist:add(newDNSName("daumcdn.net"))
whitelist:add(newDNSName("naver.com"))
whitelist:add(newDNSName("navercorp.com"))
whitelist:add(newDNSName("nstatic.net"))

-- [5] 블랙리스트 (광고 차단)
local ads = newSuffixMatchNode()
local f = io.open("/etc/dnsdist/ad-list.txt", "r")
if f then
    for line in f:lines() do
        if line ~= "" and not line:match("^#") then
            ads:add(newDNSName(line))
        end
    end
    f:close()
end

-- [6] 라우팅 정책
addAction(SuffixMatchNodeRule(whitelist), PoolAction("recursor"))
addAction(SuffixMatchNodeRule(ads), RCodeAction(DNSRCode.NXDOMAIN))
addAction(newDNSName("bitevernode.ever-chain.xyz"), PoolAction("auth"))
addAction(newDNSName("seed.bevet.com"), PoolAction("auth"))
addAction(newDNSName("ever-chain.xyz"), PoolAction("recursor"))
addAction(AllRule(), PoolAction("recursor"))

-- [고급 차단 전략: NXDOMAIN 대신 0.0.0.0 응답]
local redirectors = newSuffixMatchNode()
redirectors:add(newDNSName("profitabledisplaycontent.com"))
redirectors:add(newDNSName("tuckerclassesjackal.com"))
redirectors:add(newDNSName("msdirectsa.com"))
redirectors:add(newDNSName("outlinediabase.com"))
redirectors:add(newDNSName("cdntechone.com"))

addAction(SuffixMatchNodeRule(redirectors), SpoofAction("0.0.0.0"))

-- [1] CHP Adblock 탐지 우회용 화이트리스트
local chp_canaries = newSuffixMatchNode()
chp_canaries:add(newDNSName("outlinediabase.com"))
chp_canaries:add(newDNSName("qpon"))
chp_canaries:add(newDNSName("storageimagedisplay.com"))
chp_canaries:add(newDNSName("cornrowbygone.shop"))
chp_canaries:add(newDNSName("kitabersatu.pro"))
chp_canaries:add(newDNSName("travellermania.com"))
chp_canaries:add(newDNSName("cyou"))

-- [2] 라우팅 규칙 최상단에 배치
addAction(SuffixMatchNodeRule(chp_canaries), PoolAction("recursor"))

 
어차피 여기서 알려주고 싶은 진짜 알맹이는 PDNS 구축 그 자체라기보다는 'Private DNS'라는 기능이다. 🤡
 
일단 초 간단하게 갤럭시 핸드폰 기준으로, 설정 앱 검색창에 Private DNS (프라이빗 DNS) 라고 검색해봐라.
기본적으로는 사용 안 함으로 설정되어 있는데, 여기에 자신이 구축한 Private DNS 호스트네임(A레코드 도메인)을 세팅하면 웬만한 블로그나 해외 사이트에서 광고가 90% 이상 차단되는 마법을 누릴 수 있다.
 
게다가 삼성페이(Samsung Pay)나 금융 앱 같은 경우, VPN이 켜져 있으면 보안 핑계로 냅다 작동을 거부해 버린다.
하지만 Private DNS는 트래픽 전체를 터널링하는 게 아니라 단지 도메인을 물어보는 'DNS 쿼리' 방향만 내 PDNS 서버로 바꾼 것일 뿐이라 삼성페이, 뱅킹 앱 사용에 제약이 전~혀 없다.
 

💻 데스크톱(윈도우)에서 Private DNS (DoT) 쓰기

데스크톱용 Yoga DNS, 무료 라이선스로도 DoT 가능!!

 
핸드폰은 위처럼 OS 자체 설정으로 쉽게 끝나고 바로 광고 차단 효과를 느낄 수 있는데,
데스크톱(윈도우)은 조금 귀찮다.
 
다행히 무료 DNS 라우팅 프로그램 중에 광고도 없고 아주 가볍고 쓸만한 Yoga DNS 라는 툴을 발견했다. 사용법은 아래와 같다.
 
1. Yoga DNS 다운로드 사이트에서 윈도우용을 다운받고 설치 후 실행한다.

2. 상단 메뉴에서 File -> New Configuration으로 새 설정을 깐다.

Configuration -> DNS Servers

 

3. 나오는 창에서 Configuration -> DNS Servers를 클릭한다.

4. Add를 누르면 설정창이 뜨는데 아래와 같이 채워 넣는다:

디테일 파라미터 추천 값

 

 User friendly Name: 자기가 부르고 싶은 이름 아무거나
 Type: DNS over TLS (참고로 안드로이드 폰은 알아서 DoH/DoT로 동작한다)
 IP address and optional port: PDNS가 구동 중인 서버의 IP 주소
 Hostname: PDNS를 설정해 둔 A레코드 도메인

 

나머지 칸들은 건드리지 말고 그냥 디폴트로 두고 OK를 누른다.

 

이렇게 뜨는데 그냥 x 누르고 평소처럼 쓰면 된다

 
설정이 완료되면 로그 창에 DNS 쿼리들이 여러 모로 쭈르륵 뜨기 시작하는데, 그럼 성공한 거다. 이제 실제로 OP.GG나 CurseForge 같이 배너 광고가 덕지덕지 붙어있던 프로그램들을 켜봐라. 광고 칸이 텅 빈칸으로 깔끔하게 비워져 있는 쾌감을 맛볼 수 있을 것이다. 🤣

핸드폰에서도 웬만한건 다 빈칸으로 뚫릴 것이다! 광고 컷!

 


💡 마무리

지금까지 OpenVPN부터 시작해서 최신 유행 엔진인 WireGuard, 그리고 실생활 만족도 300%를 보장하는 Private DNS (PowerDNS + dnsdist)까지 아주 길고 얕게(?) 파헤쳐 보았다.
 
단순히 AI한테 스크립트를 짜달라고 해서 복붙하는 것도 편하지만, 이렇게 각 프로토콜이 어떤 철학(Principle)으로 굴러가고, 라우팅과 DNS 차단이 어떻게 유기적으로 얽히는지 이해하고 쓴다면 장애가 났을 때 대처하는 깊이가 달라진다. 👌
 
질문이나 막히는 에러가 있다면 언제든 댓글로 쏴주시라. 😉
 

질문은 언제나 환영
 🙌


 

🛰️ 서버맨의 공간들

 

  🐱 GitHub      🗂️ 포트폴리오   🔗 에버체인 포털

728x90