WireGuard로 IPv4/IPv6 듀얼스택 구성 사례
WireGuard 환경에서 IPv4와 IPv6를 동시에 운영하는 듀얼스택 구성 사례와 설정 흐름, 라우팅 및 방화벽 고려사항에 대한 실무 구성
목차
개요
이 글은 WireGuard 기반의 Dual-stack WireGuard 설정 사례를 다룬다. IPv4와 IPv6를 혼합해 사용하는 환경에서 필요한 설계와 설정, 검증 방법을 단계별로 정리한다. 초보자도 이해하기 쉬운 흐름으로 네트워크 설계, 서버·클라이언트 설정, 라우팅과 방화벽 규칙, 문제점 대응 방법을 제시한다.
사전 요구조건
네트워크 전제
서버는 퍼블릭 IPv4 주소와 퍼블릭 IPv6 주소(또는 /64 프리픽스)를 가지고 있어야 한다. 클라이언트는 IPv4와 IPv6 중 한 쪽만 기본 지원해도 된다. 운영체제는 WireGuard 모듈을 지원해야 한다.
필수 패키지
WireGuard 패키지와 네트워크 도구들이 필요하다. 예: wg, wg-quick, iproute2, iptables 또는 nftables.
네트워크 설계
주소 계획
일반적인 설계는 다음과 같다.
- 서버: 퍼블릭 IPv4, 퍼블릭 IPv6
- WireGuard 인터페이스: 내부 IPv4 네트워크(예: 10.10.0.0/24), 내부 IPv6 네트워크(예: fd42:42::/64)
- 클라이언트: 내부 IPv4 또는 IPv6 주소 할당
라우팅 방향
서버는 양쪽 IP 버전의 포워딩을 허용하고, 클라이언트에서 오는 트래픽을 각각의 인터넷 게이트웨이로 내보내거나 터널 내부로 라우팅한다. 목적에 따라 IPv4만 터널링하거나, IPv6도 함께 터널링하는 혼합 구성이 가능하다(예: WireGuard IPv4 IPv6 혼합).
서버 설정 예시
아래 설정은 wg0 인터페이스에 IPv4와 IPv6 주소를 동시에 부여하는 예시다.
[Interface]
Address = 10.10.0.1/24, fd42:42::1/64
ListenPort = 51820
PrivateKey = SERVER_PRIVATE_KEY
# PostUp과 PostDown은 iptables 또는 nftables 설정에 따라 달라짐
PostUp = sysctl -w net.ipv4.ip_forward=1; sysctl -w net.ipv6.conf.all.forwarding=1
PostDown = sysctl -w net.ipv4.ip_forward=0; sysctl -w net.ipv6.conf.all.forwarding=0
실제 방화벽 규칙과 NAT 구성은 운영 환경에 맞춰 결정한다.
클라이언트 설정 예시
클라이언트는 IPv4와 IPv6 주소를 고정으로 할당하거나 DHCP처럼 사용한다. 아래는 IPv4와 IPv6를 모두 할당한 예시다.
[Interface]
Address = 10.10.0.2/24, fd42:42::2/64
PrivateKey = CLIENT_PRIVATE_KEY
[Peer]
PublicKey = SERVER_PUBLIC_KEY
Endpoint = server.example.com:51820
AllowedIPs = 0.0.0.0/0, ::/0
AllowedIPs에 0.0.0.0/0와 ::/0을 넣으면 클라이언트의 모든 트래픽이 터널을 통해 전달된다. 필요에 따라 더 좁은 범위를 사용한다.
라우팅 및 방화벽 고려사항
IPv4 NAT (옵션)
서버가 IPv4 인터넷을 대신 중계하는 경우 NAT가 필요할 수 있다. 예시는 iptables 명령이다.
# IPv4 NAT 예시
iptables -t nat -A POSTROUTING -s 10.10.0.0/24 -o eth0 -j MASQUERADE
iptables -A FORWARD -i eth0 -o wg0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i wg0 -o eth0 -j ACCEPT
IPv6 라우팅
IPv6는 일반적으로 NAT 없이 라우팅으로 처리한다. 서버에서 다음과 같이 라우팅을 허용한다.
# IPv6 포워딩 허용
sysctl -w net.ipv6.conf.all.forwarding=1
# 라우팅 예: 서버에서 fd42:42::/64를 클라이언트에 전달
# 대개 별도 NAT 불필요
nftables 예시
nftables를 사용하는 환경에서는 다음 규칙으로 기본 포워딩과 NAT을 구성할 수 있다.
table ip nat {
chain postrouting {
type nat hook postrouting priority 100;
oifname "eth0" ip saddr 10.10.0.0/24 counter masquerade
}
}
table inet filter {
chain forward {
type filter hook forward priority 0;
iifname "eth0" oifname "wg0" ct state established,related accept
iifname "wg0" oifname "eth0" accept
}
}
테스트 및 검증
설정 후에는 양쪽 버전의 연결을 확인한다.
- 서버에서 클라이언트로 ping (IPv4): ping 10.10.0.2
- 서버에서 클라이언트로 ping6 (IPv6): ping6 fd42:42::2
- 클라이언트에서 외부 IPv4 확인: curl -4 ifconfig.co
- 클라이언트에서 외부 IPv6 확인: curl -6 ifconfig.co
IPv4 또는 IPv6가 작동하지 않으면 라우팅 테이블, 방화벽 규칙, sysctl 포워딩 설정(net.ipv4.ip_forward, net.ipv6.conf.all.forwarding)을 점검한다.
문제 해결 체크리스트
- WireGuard 인터페이스에 주소가 올바르게 부여되었는지 확인
- 서버에서 포트(예: 51820) 수신 가능 여부 확인
- AllowedIPs가 의도한 트래픽을 포함하는지 확인
- IPv6 프리픽스가 라우터나 ISP에서 할당된 범위와 일치하는지 확인
- 방화벽 정책이 포워딩과 NAT을 차단하지 않는지 확인
운영 팁
로그를 활성화하면 문제 파악이 수월하다. 또한 클라이언트별 AllowedIPs를 세밀히 관리하면 의도치 않은 트래픽 유출을 줄일 수 있다. 네트워크 변경 시에는 순차적으로 적용하고 각 단계마다 연결을 검증하는 절차가 안전하다.
결론
이 사례는 WireGuard 듀얼스택 구성의 기본 흐름을 담고 있다. WireGuard IPv4 IPv6 혼합 환경에서는 주소계획과 라우팅, 방화벽 규칙이 핵심이다. 위 예시를 바탕으로 환경에 맞춘 추가 조정으로 안정적인 듀얼스택 운영이 가능하다.