WireGuard · 2026-01-31

WireGuard와 nftables로 안전한 방화벽 만들기

WireGuard와 nftables를 결합해 안전한 방화벽 정책을 설계하고 구현하는 방법을 초보자도 이해할 수 있도록 단계별로 설명하는 네트워크 보안 지침

작성일 : 2026-01-31 ㆍ 작성자 : 관리자
post
목차

소개

이 글에서는 WireGuard와 nftables를 함께 사용해 안전한 방화벽 규칙을 만드는 방법을 설명한다. 개념부터 설정, 규칙 설계, 테스트까지 차근차근 다룬다. 네트워크 보안이 처음인 사람도 따라할 수 있도록 예제와 이유를 함께 제시한다.

왜 WireGuard와 nftables를 함께 쓰는가

WireGuard는 가볍고 빠른 VPN이다. nftables는 modern한 패킷 필터링 툴이다. 두 가지를 결합하면 VPN 트래픽을 명확히 구분하고, 포워딩과 NAT을 안전하게 제어할 수 있다. 결과적으로 내부 네트워크 노출을 최소화하면서 원격 접속을 허용하는 방화벽을 만들 수 있다.

목표

  • WireGuard 인터페이스로 들어오고 나가는 트래픽을 제한
  • 기본 정책을 거부(DROP)로 설정
  • established 연결을 허용해 정상적인 통신 유지
  • NAT과 포워딩을 안전하게 구성

기본 개념 정리

WireGuard 작동 원리

WireGuard는 키 기반의 터널링을 제공한다. 각 피어는 공개키/비공개키 쌍을 사용한다. 인터페이스를 통해 암호화된 패킷이 전송된다. 로컬 인터페이스 이름은 보통 wg0 같은 형식을 쓴다.

nftables 작동 원리

nftables는 테이블(table)과 체인(chain)을 정의해 패킷을 필터링한다. 정책은 순차적으로 적용된다. 기존 iptables보다 규칙 작성이 간결하고 효율적이다. 기본적인 흐름을 이해하면 규칙을 설계하기 쉽다.

환경 준비

먼저 패키지 설치부터 한다. 배포판에 따라 명령이 다르다. Ubuntu/Debian에서는 다음과 같이 설치한다.

sudo apt update
sudo apt install wireguard nftables qrencode

설치 후 WireGuard 인터페이스 구성 파일과 nftables 규칙 파일을 준비한다.

WireGuard 기본 설정 예제

간단한 서버 쪽 wg0 설정 예제이다. 포트와 키는 예시이므로 실제 환경에 맞게 변경한다.

[Interface]
Address = 10.10.10.1/24
ListenPort = 51820
PrivateKey = SERVER_PRIVATE_KEY

[Peer]
PublicKey = CLIENT_PUBLIC_KEY
AllowedIPs = 10.10.10.2/32

이 설정은 10.10.10.0/24 네트워크를 WireGuard 내부 네트워크로 사용한다.

nftables 기본 테이블과 체인

먼저 기본 정책을 DROP으로 설정한다. 다음은 간단한 nftables 시작 템플릿이다.

#!/usr/sbin/nft -f

flush ruleset

table inet filter {
    chain input {
        type filter hook input priority 0;
        policy drop;

        ct state established,related accept
        iifname "lo" accept
        ip protocol icmp accept
        tcp dport { 22 } ct state new,established accept
        udp dport { 51820 } ct state new,established accept
    }

    chain forward {
        type filter hook forward priority 0;
        policy drop;

        ct state established,related accept
        iifname "wg0" oifname "eth0" accept
        iifname "eth0" oifname "wg0" ct state new,established accept
    }

    chain output {
        type filter hook output priority 0;
        policy accept;
    }
}

위 규칙에서 핵심은 WireGuard 포트(51820)를 허용하고, 내부 인터페이스(wg0)와 외부(eth0) 간 포워딩을 안전하게 제한하는 것이다.

NAT 구성(인터넷 공유)

WireGuard 클라이언트가 서버를 통해 인터넷을 사용하도록 NAT를 설정할 수 있다. 다음은 nftables NAT 예제이다.

table ip nat {
    chain postrouting {
        type nat hook postrouting priority 100;
        oifname "eth0" masquerade
    }
}

이 규칙은 wg0 네트워크에서 나가는 패킷에 대해 소스 주소를 외부 인터페이스 주소로 변환한다.

방화벽 설계 원칙

  • 기본 정책을 거부로 설정해 불필요한 접근 차단
  • 연결 추적(ct state)을 활용해 기존 연결 유지
  • 인터페이스 기반 규칙으로 VPN 트래픽 분리
  • 최소 권한 원칙으로 포트와 IP 범위 제한
  • 로그는 필요 시에만 제한적으로 활성화

적용 순서와 테스트

규칙 적용과 테스트는 신중하게 진행한다. 먼저 nft 파일을 저장한 뒤 적용한다.

sudo nft -f /etc/nftables.conf
sudo systemctl enable --now nftables
sudo systemctl enable --now wg-quick@wg0

테스트 항목:

  • WireGuard 인터페이스 상태 확인: sudo wg
  • 포트 열림 확인: sudo ss -ulpn | grep 51820
  • 포워딩 동작 확인: ping 또는 traceroute로 내부-외부 통신 검사
  • 로그 확인: dmesg 또는 nftables 로그 설정 시 syslog 확인

문제 발생 시 확인 포인트

  • WireGuard 키와 AllowedIPs가 맞는지 확인
  • nftables의 iifname/oifname이 실제 인터페이스 이름과 일치하는지 확인
  • 포트 차단 여부 확인(중복 방화벽 또는 호스팅 업체의 필터)
  • 커널의 forwarding 설정(net.ipv4.ip_forward)이 활성화되어 있는지 확인

보안 강화 권장사항

  • 관리 포트(SSH)는 신뢰 가능한 IP로 제한
  • WireGuard 키는 안전하게 보관하고 주기적으로 교체
  • 불필요한 서비스는 비활성화
  • 로그와 모니터링을 통해 비정상 트래픽 탐지

요약

WireGuard와 nftables를 결합하면 가볍고 안전한 VPN 기반 방화벽을 구성할 수 있다. 핵심은 기본 정책을 거부로 두고 필요한 트래픽만 허용하는 것이다. 인터페이스 기반 규칙과 연결 추적을 활용하면 안정적인 통신을 유지하면서 공격 표면을 줄일 수 있다. 예제 규칙을 환경에 맞게 조정해 실무에 적용하면 효과적인 네트워크 보안 구성이 가능하다.

WireGuard nftables 설정 nftables WireGuard 방화벽 WireGuard 방화벽 규칙 WireGuard 설정 nftables 예제 Linux 방화벽 VPN 방화벽 네트워크 보안