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 yad3. 2단계: zapret 설치 및 대화형 질의응답 가이드#
3.1 소스코드 클론 및 설치 스크립트 실행#
sudo git clone https://github.com/bol-van/zapret.git /opt/zapret
cd /opt/zapret
sudo ./install_easy.sh3.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/zapret5. 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
donechmod +x ~/zapret-widget.sh7.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;