- Wireproxy는 WireGuard 피어에 연결한 뒤 로컬 머신에서 SOCKS5/HTTP 프록시나 터널로 노출되는 완전한 사용자 공간 WireGuard 클라이언트임
- 새 네트워크 인터페이스를 설정하지 않고 특정 사이트 트래픽만 WireGuard 피어로 보내고 싶거나, WireGuard 설정 변경에 root 권한을 쓰고 싶지 않은 경우를 겨냥함
- 기능은 TCP 정적 라우팅, SOCKS5/HTTP 프록시, TLS SNI 기반 투명 프록시를 포함하며, HTTP 프록시는 현재 CONNECT만 지원함
- 설정은
wg-quick의[Interface],[Peer]의미를 따르고, 기존 WireGuard 설정 파일을WGConfig로 가져오거나 여러 피어를AllowedIPs로 라우팅할 수 있음 - 운영용으로
--info/-i기반 health endpoint를 제공하며/metrics와/readyz로 WireGuard 상태와CheckAlive기반 준비 상태를 확인할 수 있음
Wireproxy가 하는 일
wireproxy는 WireGuard 피어에 연결하고, 로컬 머신에 SOCKS5/HTTP 프록시 또는 터널을 노출하는 사용자 공간 애플리케이션임- 특정 사이트만 WireGuard 피어를 통해 접속하고 싶지만 새 네트워크 인터페이스를 만들고 싶지 않을 때 사용할 수 있음
- 네트워크 인터페이스와 완전히 분리되어 동작하며, 설정을 위해 root 권한이 필요하지 않음
- Amnezia VPN과 유사한 용도가 필요한 사용자는 wireproxy-awg 포크를 사용할 수 있음
지원 기능과 아직 없는 기능
- 지원 기능
- 클라이언트와 서버용 TCP 정적 라우팅
- SOCKS5/HTTP 프록시
- HTTP는 현재 CONNECT만 지원함
- Server Name Indication을 사용하는 투명 TLS 프록시
- TODO로 남은 기능
- SOCKS5의 UDP 지원
- UDP 정적 라우팅
실행과 설치
- 기본 실행 형식은
./wireproxy [-c path to config]임 - 주요 옵션
-c,--config: 설정 파일 경로 지정- 기본 경로는
/etc/wireproxy/wireproxy.conf,$HOME/.config/wireproxy.conf
- 기본 경로는
-s,--silent: silent mode-d,--daemon: 백그라운드 실행-i,--info: health status 노출용 주소와 포트 지정-v,--version: 버전 출력-n,--configtest: 설정 파일 유효성만 확인
- 빌드는 저장소를 클론한 뒤
make로 수행함 - 설치 예시는
go install github.com/windtf/wireproxy/cmd/wireproxy@v1.1.2또는@latest를 사용함
설정 모델
[Interface]와[Peer]설정은wg-quick설정과 같은 의미를 따름Address는 IPv4의 경우/32, IPv6의 경우/128서브넷을 사용해야 함PrivateKey는 환경 변수 참조도 가능함- 기존 WireGuard 설정이 있다면
WGConfig = <path to the wireguard config>로 가져올 수 있음
터널과 프록시 설정
TCPClientTunnel- 로컬 머신에서 수신한 TCP 트래픽을 WireGuard를 통해 지정 대상에 전달함
- 예시 흐름은
<LAN 앱> → localhost:25565 → WireGuard → play.cubecraft.net:25565임
TCPServerTunnel- WireGuard 네트워크에서 수신한 TCP 트래픽을 로컬 네트워크의 지정 대상으로 전달함
- 예시 흐름은
<WireGuard 네트워크 앱> → WireGuard → 172.16.31.2:3422 → localhost:25545임
STDIOTunnel- wireproxy 프로세스의 표준 입력과 출력을 WireGuard 경유 TCP 대상에 연결함
openssh의ProxyCommand파라미터로 쓰기 유용함
Socks5- 로컬 LAN에 SOCKS5 프록시를 만들고 모든 트래픽을 WireGuard로 라우팅함
- 사용자 이름과 비밀번호를 지정하면 프록시 인증을 활성화함
http- 로컬 LAN에 HTTP 프록시를 만들고 모든 트래픽을 WireGuard로 라우팅함
- 사용자 이름과 비밀번호를 지정하면 인증을 활성화함
CertFile과KeyFile을 지정하면 HTTPS를 활성화함
SNI- 로컬 LAN에 투명 TLS 프록시를 만들고, SNI를 라우팅 목적지로 사용해 WireGuard를 통해 트래픽을 보냄
여러 피어와 라우팅
- 여러 WireGuard 피어를 사용할 수 있음
- 여러 피어를 쓸 때는 wireproxy가 어느 피어로 전달할지 알 수 있도록 AllowedIPs를 지정해야 함
- 설정 예시는 서로 다른
AllowedIPs를 가진 여러[Peer]와 여러TCPServerTunnel을 함께 사용함 UDPProxyTunnel예시도 포함됨BindAddress로 로컬 바인드 주소를 지정함Target으로 대상 주소를 지정함InactivityTimeout이0이면 타임아웃하지 않음
[Resolve]는 DNS 해석 전략을 설정함ipv4: A 레코드를 우선함ipv6: AAAA 레코드를 우선함auto: 기본값이며, WireGuard 인터페이스가 IPv4 주소만 가지면ipv4와 같고 그렇지 않으면ipv6와 같음
- Endpoint가 없는
[Peer]설정으로 피어가 wireproxy에 연결하도록 허용할 수 있음
Health endpoint
--info/-i는 예를 들어localhost:9080같은 주소와 포트를 받아 health status metric을 제공하는 HTTP 서버를 노출함- 현재 두 endpoint가 구현되어 있음
/metrics: WireGuard 데몬 정보를 노출하며wg show와 같은 정보를 제공함/readyz:CheckAlive에 지정된 IP에서 마지막으로 pong을 받은 시간을 JSON으로 반환함
CheckAlive가 설정되면 지정된 주소로CheckAliveInterval초마다 WireGuard를 통해 ping을 보냄- 기본
CheckAliveInterval은 5초임 - 마지막
CheckAliveInterval초에 지연 여유 2초를 더한 시간 안에 pong을 받지 못하면 503을 반환함 - 조건을 만족하면 200을 반환함
- 기본
CheckAlive가 설정되지 않은 경우/readyz는 빈 JSON 객체와 200을 반환함- ICMP ping 패킷이 라우팅되는 피어는 각 피어의 AllowedIPs 설정에 따라 달라짐