DPI(심층 패킷 분석) 차단을 우회하기: Zapret 설치 및 서비스 설정 가이드 (Fedora Linux 기준)

Zapret 설치 및 서비스 설정 가이드 (Fedora Linux 기준)#

본 문서는 Fedora Linux 환경에서 DPI(심층 패킷 분석) 차단을 우회하기 위한 zapret의 설치 방법, 대화형 설치 스크립트(install_easy.sh)의 질문별 권장 입력값, 삭제(Uninstall) 방법, 설정 파일(/opt/zapret/config) 핵심 주의사항, 그리고 시스템 서비스 동작 원리와 초경량 YAD 기반 ON/OFF 미니 위젯 구성법을 정리한 가이드입니다.


1. 동작 원리 및 아키텍처 요약#

[로컬 트래픽 (HTTP / HTTPS / QUIC)]
              │
              ▼
    [nftables 방화벽 규칙]  (inet zapret 테이블 / 포트 80, 443 감지)
              │
              ▼  (NFQUEUE qnum 200)
       [nfqws 데몬]         (TCP Split, badseq, md5sig, fake 패킷 조작)
              │
              ▼  (fwmark 0x40000000 마킹으로 루프 방지)
      [외부 인터넷 (WAN)]
  • VPN/프록시와의 차이점: 트래픽 전체를 외부 서버로 우회하지 않고, **초기 연결 핸드셰이크 패킷만 로컬에서 살짝 변조(분할/헤더 속임)**하여 통신사 DPI 검사기를 무력화합니다. 따라서 원래 인터넷 회선 속도(100%)와 지연시간이 그대로 유지됩니다.
  • 서비스 등록: systemd 서비스(zapret.service)로 등록되어 부팅 시 자동 시작되거나 백그라운드에서 동작합니다.

2. 1단계: 사전 필수 패키지 설치 (Fedora 기준)#

install_easy.sh는 내부적으로 C 소스코드를 컴파일하므로, 빌드에 필요한 헤더 라이브러리와 방화벽 유틸리티를 먼저 설치해야 합니다.

⚠️ 주의: 아래 개발 라이브러리가 누락되면 컴파일이 실패하여 Unit zapret.service not found 에러가 발생하고 서비스 등록이 되지 않습니다.

sudo dnf install -y git make gcc \
    zlib-devel libcap-devel libnetfilter_queue-devel libmnl-devel systemd-devel \
    nftables curl iptables ipset yad

3. 2단계: zapret 설치 및 대화형 질의응답 가이드#

3.1 소스코드 클론 및 설치 스크립트 실행#

sudo git clone https://github.com/bol-van/zapret.git /opt/zapret
cd /opt/zapret
sudo ./install_easy.sh

3.2 대화형 질문별 입력값 및 핵심 주의사항#

설치 스크립트가 순서대로 여러 질문을 던집니다. 아래 가이드를 보고 입력하세요:

질문 항목 (프롬프트) 권장 입력값 설명 및 주의사항
select firewall type : iptables, nftables… nftables Fedora 최신 버전 기본 방화벽인 nftables를 선택합니다.
enable ipv6 (Y/N) Y IPv6 트래픽도 함께 우회 처리하려면 Y를 입력합니다.
select filtering : none, ipset, hostlist, autohostlist none ★ 가장 중요!
ipset이나 hostlist를 선택하면 러시아/특정 차단 목록에 있는 사이트만 처리되어 한국 사이트나 일반 차단 사이트는 우회가 전혀 안 됩니다. 국내 환경에서는 모든 80/443 패킷을 처리하는 **none**을 선택해야 합니다.
enable tpws socks mode … ? (Y/N) N SOCKS 프록시 모드는 일반적으로 사용하지 않으므로 N.
enable tpws transparent mode ? (Y/N) N 투명 프록시 모드도 기본적으로 N.
enable nfqws ? (Y/N) Y ★ 필수!
DPI 패킷 변조의 핵심인 nfqws 데몬을 활성화합니다. 여기서 실수로 N을 누르면 NFQWS_ENABLE=0이 되어 서비스가 켜지자마자 즉시 꺼집니다.
do you want to edit the options (Y/N) N 기본 제공되는 최적 옵션을 사용하므로 N 입력.
CHOOSE LAN NETWORK INTERFACES 본인 인터페이스 (예: wlp2s0) ip route get 8.8.8.8로 확인되는 무선(예: wlp2s0) 또는 유선(예: enp3s0, eth0) 인터페이스명을 입력합니다.
CHOOSE WAN NETWORK INTERFACES 본인 인터페이스 (예: wlp2s0) LAN과 동일한 인터페이스명을 입력합니다.
auto start / systemd service Y 부팅 시 자동 시작 및 systemd 서비스 등록을 위해 Y를 선택합니다.

4. 3단계: 완전 제거 (Uninstall) 방법#

zapret을 완전히 제거하고 시스템 서비스 및 방화벽 설정을 원래대로 되돌릴 때는 아래 명령어를 실행합니다:

cd /opt/zapret
sudo ./uninstall_easy.sh

(또는 수동 제거 시)

sudo systemctl disable --now zapret zapret-list-update.timer
sudo rm -f /etc/systemd/system/zapret* /usr/lib/systemd/system/zapret*
sudo systemctl daemon-reload
sudo rm -rf /opt/zapret

5. 4단계: 설정 파일(/opt/zapret/config) 확인 및 트러블슈팅#

설치 후 서비스가 켜지지 않거나 즉시 꺼지는 경우 설정 파일을 열어 점검합니다.

sudo nano /opt/zapret/config

필수 확인 항목 3가지:#

# 1. 방화벽 타입 확인
FWTYPE=nftables

# 2. 필터 모드 (반드시 none 이어야 함)
# ipset으로 되어 있으면 차단 사이트 우회가 안 됨
MODE_FILTER=none

# 3. nfqws 활성화 (반드시 1 이어야 함)
# 0으로 되어 있으면 서비스 시작 직후 바로 종료(inactive dead)됨
NFQWS_ENABLE=1

# 4. 네트워크 인터페이스 지정
IFACE_LAN=wlp2s0
IFACE_WAN=wlp2s0

# 5. DPI 우회 기본 전략 옵션
NFQWS_OPT="
--filter-tcp=80 --dpi-desync=fake,multisplit --dpi-desync-split-pos=method+2 --dpi-desync-fooling=md5sig <HOSTLIST> --new
--filter-tcp=443 --dpi-desync=fake,multidisorder --dpi-desync-split-pos=1,midsld --dpi-desync-fooling=badseq,md5sig <HOSTLIST> --new
--filter-udp=443 --dpi-desync=fake --dpi-desync-repeats=6 <HOSTLIST_NOAUTO>
"

설정 수정 후 서비스 재시작:

sudo systemctl restart zapret
sudo systemctl status zapret

Active: active (running) 상태이고 nfqws 프로세스가 떠 있으면 정상 작동 중입니다.


6. 5단계: 서비스 관리 및 진단 명령어#

작업 명령어
서비스 상태 확인 systemctl status zapret
서비스 시작 / 중지 sudo systemctl start zapret
sudo systemctl stop zapret
방화벽 룰 적용 상태 확인 sudo /opt/zapret/init.d/sysv/zapret list-table
또는 sudo nft list table inet zapret
실시간 서비스 로그 확인 sudo journalctl -u zapret -f
통신사별 최적 DPI 우회 옵션 진단 sudo /opt/zapret/blockcheck.sh

7. 6단계: 초경량 YAD 기반 ON/OFF 미니 위젯 구성 (선택)#

터미널에 명령어를 입력하지 않고, 안드로이드 유니콘 HTTPS처럼 화면에 작은 위젯 창을 띄워 현재 상태를 확인하고 클릭 한 번으로 켜고 끄는 초경량 구성법입니다.

7.1 Polkit 권한 설정 (비밀번호 팝업 없이 즉시 제어)#

GUI 위젯에서 버튼을 누를 때마다 관리자 비밀번호를 묻지 않고 즉시 켜고 끌 수 있도록 1회 설정합니다:

sudo nano /etc/polkit-1/rules.d/50-zapret.rules

아래 내용 저장:

polkit.addRule(function(action, subject) {
    if (action.id == "org.freedesktop.systemd1.manage-units" &&
        action.lookup("unit") == "zapret.service" &&
        subject.isInGroup("wheel")) {
        return polkit.Result.YES;
    }
});

7.2 위젯 스크립트 작성 (zapret-widget.sh)#

nano ~/zapret-widget.sh
#!/bin/bash

while true; do
    # 현재 zapret 서비스 상태 확인
    if systemctl is-active --quiet zapret; then
        STATE_IMG="security-high"
        TITLE_TXT="<span size='xx-large' foreground='#2ecc71'><b>● ON (보호 중)</b></span>"
        SUB_TXT="<span size='small' foreground='#888888'>인터넷 DPI 우회가 활성화되어 있습니다.</span>"
        BTN_TXT="⛔  끄기 (OFF)"
        ACTION="stop"
    else
        STATE_IMG="security-low"
        TITLE_TXT="<span size='xx-large' foreground='#95a5a6'><b>○ OFF (꺼짐)</b></span>"
        SUB_TXT="<span size='small' foreground='#888888'>인터넷 DPI 우회가 비활성화되어 있습니다.</span>"
        BTN_TXT="🛡️  켜기 (ON)"
        ACTION="start"
    fi

    # yad 미니 위젯 창 띄우기
    yad --title="Zapret Switch" \
        --window-icon="network-vpn" \
        --image="$STATE_IMG" \
        --image-on-top \
        --text="\n$TITLE_TXT\n$SUB_TXT\n" \
        --text-align=center \
        --button="$BTN_TXT":0 \
        --button="닫기":1 \
        --width=300 \
        --height=180 \
        --borders=15 \
        --center \
        --fixed

    EXIT_CODE=$?

    # 버튼 클릭에 따른 동작
    if [ $EXIT_CODE -eq 0 ]; then
        # 켜기/끄기 버튼 클릭 시 서비스 제어
        pkexec systemctl $ACTION zapret
        sleep 0.5
    else
        # 닫기 버튼이나 창 닫기(X)를 누르면 종료
        break
    fi
done
chmod +x ~/zapret-widget.sh

7.3 애플리케이션 메뉴(Launcher) 등록#

mkdir -p ~/.local/share/applications
nano ~/.local/share/applications/zapret-widget.desktop

아래 내용 저장:

[Desktop Entry]
Type=Application
Name=Zapret Switch
Comment=Zapret DPI Bypass ON/OFF Widget
Exec=/home/heebong/_dev/gemini_cli_run/zapret-widget.sh
Icon=network-vpn
Terminal=false
Categories=Network;