network / knowledge
WireGuard의 PostUp으로 터널 밖 포워딩 막기
VPN 서버는 패킷을 대신 전달하는 기계다. 규칙을 느슨하게 두면 터널에 들어온 쪽이 서버를 발판 삼아 집 안 어디로든 나갈 수 있다. peer끼리만 통하고 밖으로는 못 나가게 막았다.
터널이 올라올 때 규칙을 넣고 내려갈 때 지우는 게 깔끔하다. WireGuard의 PostUp / PostDown 이 그 자리다.
[Interface]
PostUp = /etc/wireguard/postup.sh "%i"
PostDown = /etc/wireguard/postdown.sh "%i"
%i 는 인터페이스 이름으로 치환된다. wg0 을 하드코딩하지 않으면 스크립트를 그대로 다른 인터페이스에도 쓸 수 있다.
postup.sh
#!/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
#!/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 로 바꾼 것 말고는 같다. 나머지 인자가 정확히 일치해야 그 규칙이 지워진다. 하나라도 다르면 안 지워지고, 터널을 올렸다 내렸다 할 때마다 규칙이 쌓인다.
$ chmod +x /etc/wireguard/postup.sh
$ chmod +x /etc/wireguard/postdown.sh
실행 권한을 주지 않으면 wg-quick up 이 조용히 넘어가고 규칙이 안 걸린다.
이 구성은 서버끼리 묶는 용도라 이렇게 잠갔다. 클라이언트의 인터넷 트래픽까지 VPN으로 태우려는 구성이라면 반대로 밖으로 나가는 것을 열고 MASQUERADE를 걸어야 한다.