network / knowledge

WireGuard의 PostUp으로 터널 밖 포워딩 막기

paul 2026.01.18 245words (1m)

VPN 서버는 패킷을 대신 전달하는 기계다. 규칙을 느슨하게 두면 터널에 들어온 쪽이 서버를 발판 삼아 집 안 어디로든 나갈 수 있다. peer끼리만 통하고 밖으로는 못 나가게 막았다.

터널이 올라올 때 규칙을 넣고 내려갈 때 지우는 게 깔끔하다. WireGuard의 PostUp / PostDown 이 그 자리다.

ini
[Interface]
PostUp = /etc/wireguard/postup.sh "%i"
PostDown = /etc/wireguard/postdown.sh "%i"

%i 는 인터페이스 이름으로 치환된다. wg0 을 하드코딩하지 않으면 스크립트를 그대로 다른 인터페이스에도 쓸 수 있다.

postup.sh

bash
#!/bin/bash

iptables -A FORWARD -i $1 -o $1 -j ACCEPT
iptables -A FORWARD -i $1 ! -o $1 -j DROP
iptables -A FORWARD ! -i $1 -o $1 -j DROP

세 줄이 각각 하나씩 담당한다.

  • -i $1 -o $1 — 터널로 들어와서 터널로 나간다. peer끼리 주고받는 트래픽이라 허용한다.
  • -i $1 ! -o $1 — 터널로 들어와서 터널이 아닌 곳으로 나간다. 밖으로 나가려는 것이라 막는다.
  • ! -i $1 -o $1 — 밖에서 들어와서 터널로 나간다. 반대 방향도 막는다.

! 가 부정이다. 순서도 의미가 있다. 허용할 것을 먼저 걸고 그 다음에 막아야 한다. DROP이 먼저 오면 peer끼리도 못 통한다.

postdown.sh

bash
#!/bin/bash

iptables -D FORWARD -i $1 -o $1 -j ACCEPT
iptables -D FORWARD -i $1 ! -o $1 -j DROP
iptables -D FORWARD ! -i $1 -o $1 -j DROP

-A-D 로 바꾼 것 말고는 같다. 나머지 인자가 정확히 일치해야 그 규칙이 지워진다. 하나라도 다르면 안 지워지고, 터널을 올렸다 내렸다 할 때마다 규칙이 쌓인다.

console
$ chmod +x /etc/wireguard/postup.sh
$ chmod +x /etc/wireguard/postdown.sh

실행 권한을 주지 않으면 wg-quick up 이 조용히 넘어가고 규칙이 안 걸린다.

이 구성은 서버끼리 묶는 용도라 이렇게 잠갔다. 클라이언트의 인터넷 트래픽까지 VPN으로 태우려는 구성이라면 반대로 밖으로 나가는 것을 열고 MASQUERADE를 걸어야 한다.