Systemd Wireguard 인터페이스를 통해 특정 Docker 네트워크 라우팅

Systemd Wireguard 인터페이스를 통해 특정 Docker 네트워크 라우팅

wg0 systemd 네트워크 인터페이스 config를 통해 특정 Docker 네트워크(10.222.111.0/24)의 모든 트래픽을 라우팅하려고 합니다.

/etc/systemd/network/30-wg0.netdev

[NetDev]
Name = wg0
Kind = wireguard
Description = Wireguard

[WireGuard]
PrivateKey = XXXX

[WireGuardPeer]
PublicKey = XXXX
AllowedIPs = 10.222.111.0/24
Endpoint = XXXX:51820
PersistentKeepalive = 25

/etc/systemd/network/30-wg0.network

[Match]
Name=wg0

[Network]
Address = 10.0.3.227/19
DNS = X.X.X.X

[Route]
Gateway = 10.0.3.227
Destination = 10.222.111.0/24

이제 인터페이스가 작동 중이고 라우팅 테이블에 올바른 경로가 있음을 알 수 있습니다.

# ip route show
...
10.222.111.0/24 via 10.0.3.227 dev wg0 proto static
...

인터페이스가 실행 중입니다.

# networkctl status wg0
● 251: wg0
       Link File: /lib/systemd/network/99-default.link
    Network File: /etc/systemd/network/30-wg0.network
            Type: none
           State: routable (configured)
         Address: 10.0.3.227
         DNS: X.X.X.X

그러나 이를 테스트하려고 하면 실패합니다.

# curl --interface wg0 https://ifconfig.me 
# public ip of remote server

# docker network create vpn --subnet 10.222.111.0/24
# docker run --rm --dns X.X.X.X --network vpn --ip 10.222.111.110 appropriate/curl -s https://ifconfig.me
# no output

docker run 명령을 실행할 때 tcpdump의 출력은 다음과 같습니다.

# tcpdump -nn -i wg0 host ifconfig.me
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on wg0, link-type RAW (Raw IP), capture size 262144 bytes
08:36:16.127461 IP 10.0.3.227.33182 > 216.239.38.21.443: Flags [S], seq 1530371569, win 27600, options [mss 1380,sackOK,TS val 3454949182 ecr 0,nop,wscale 7], length 0
08:36:17.152770 IP 10.0.3.227.33182 > 216.239.38.21.443: Flags [S], seq 1530371569, win 27600, options [mss 1380,sackOK,TS val 3454950207 ecr 0,nop,wscale 7], length 0
08:36:17.152830 IP 10.0.3.227.33182 > 216.239.38.21.443: Flags [S], seq 1530371569, win 27600, options [mss 1380,sackOK,TS val 3454950207 ecr 0,nop,wscale 7], length 0
08:36:17.153083 IP 10.0.3.227.48686 > 216.239.36.21.443: Flags [S], seq 1139719299, win 27600, options [mss 1380,sackOK,TS val 3564689990 ecr 0,nop,wscale 7], length 0
08:36:18.176752 IP 10.0.3.227.48686 > 216.239.36.21.443: Flags [S], seq 1139719299, win 27600, options [mss 1380,sackOK,TS val 3564691014 ecr 0,nop,wscale 7], length 0
08:36:18.176798 IP 10.0.3.227.48686 > 216.239.36.21.443: Flags [S], seq 1139719299, win 27600, options [mss 1380,sackOK,TS val 3564691014 ecr 0,nop,wscale 7], length 0
08:36:18.176891 IP 10.0.3.227.59316 > 216.239.34.21.443: Flags [S], seq 3848190866, win 27600, options [mss 1380,sackOK,TS val 3672200215 ecr 0,nop,wscale 7], length 0
08:36:19.200840 IP 10.0.3.227.59316 > 216.239.34.21.443: Flags [S], seq 3848190866, win 27600, options [mss 1380,sackOK,TS val 3672201239 ecr 0,nop,wscale 7], length 0
08:36:19.200938 IP 10.0.3.227.59316 > 216.239.34.21.443: Flags [S], seq 3848190866, win 27600, options [mss 1380,sackOK,TS val 3672201239 ecr 0,nop,wscale 7], length 0
08:36:19.201089 IP 10.0.3.227.39842 > 216.239.32.21.443: Flags [S], seq 4281397520, win 27600, options [mss 1380,sackOK,TS val 1995655620 ecr 0,nop,wscale 7], length 0
08:36:20.224781 IP 10.0.3.227.39842 > 216.239.32.21.443: Flags [S], seq 4281397520, win 27600, options [mss 1380,sackOK,TS val 1995656643 ecr 0,nop,wscale 7], length 0
08:36:20.224894 IP 10.0.3.227.39842 > 216.239.32.21.443: Flags [S], seq 4281397520, win 27600, options [mss 1380,sackOK,TS val 1995656643 ecr 0,nop,wscale 7], length 0
^C
12 packets captured
12 packets received by filter
0 packets dropped by kernel

나는 뭔가를 놓치고 있다고 확신하지만 무엇을 볼 수 없습니다. 부분적으로 기반https://nbsoftsolutions.com/blog/leaning-on-algo-to-route-docker-traffic-through-wireguard

답변1

나는 같은 문제가 있었고 이것이 내가 작동시킨 방법입니다.

가장 큰 실수는 AllowedIPs네트워크 장치에서 이를 사용하는 방식입니다. AllowedIPs허용 지정표적IP, 트래픽 터널링을 원할 수도 있으므로도착하다모든 IP를 지정해야 합니다 0.0.0.0/0.

Destination이 구간의 노선과 [Route]생성된 경로( 10.222.111.0/24 via 10.0.3.227 dev wg0 proto static)도 잘못된 우회 경로입니다. 이 경로의 교통 상황목표 10.222.111.0/24원래 트래픽 대신 WireGuard 인터페이스로~에서서브넷.

필터링 기준원천Docker 서브넷의 모든 트래픽이 VPN을 통과하도록 네트워크 파일에서 [RoutingPolicyRule](와 동일 ip rule) 및 [Route](와 동일 ) 섹션을 사용할 수 있으므로 ip route네트워크 파일은 다음과 같습니다.

etc/systemd/network/30-wg0.netdev:

[NetDev]
Name = wg0
Kind = wireguard
Description = Wireguard

[WireGuard]
PrivateKey = XXXX

[WireGuardPeer]
PublicKey = XXXX
AllowedIPs = 0.0.0.0/0
Endpoint = XXXX:51820
PersistentKeepalive = 25

/etc/systemd/network/30-wg0.network:

[Match]
Name=wg0

[Network]
Address = 10.0.3.227/19
DNS = X.X.X.X

[RoutingPolicyRule]
From = 10.222.111.0/24
# Or any other unused table number
Table = 242

[Route]
# The address of the interface, same as in Address line
Gateway = 10.0.3.227
# Same table number as above
Table = 242

curl --interface wg0이 구성 을 통해

# docker network create vpn --subnet 10.222.111.0/24
# docker run --rm --dns X.X.X.X --network vpn appropriate/curl -s https://ifconfig.me

잘 작동할 것입니다( 필수는 아니기 때문에 해당 --ip옵션을 제거했습니다 ).docker run

실제로 자세한 지침이 포함된 내 솔루션에 대한 블로그 게시물을 작성했습니다. 원하시면 살펴보시면 도움이 될 것입니다.https://www.eisfunke.com/article/docker-wireguard-systemd.html.

도움이 되었기를 바랍니다!

관련 정보