基于Docker Compose部署Rails应用+WireGuard VPN的连接问题咨询
问题:Docker Compose下WireGuard VPN转发Rails API请求至AWS RDS失败
我们通过WireGuard VPN让Rails API连接AWS RDS数据库,本地环境下配置好数据库环境变量并开启VPN后,运行Rails控制台就能正常访问数据库。现在尝试用Docker Compose实现该功能,配置如下:
Docker Compose配置
version: '2' services: app: build: . command: make run depends_on: - wireguard network_mode: "service:wireguard" volumes: - .:/usr/src/app - bundle-data:/usr/src/bundle wireguard: image: lscr.io/linuxserver/wireguard:latest container_name: wireguard cap_add: - NET_ADMIN environment: - PUID=1000 - PGID=1000 - TZ=Etc/UTC - WEBUI_PORT=3000 volumes: - /etc/wireguard ports: - 51820:51820/udp sysctls: - net.ipv4.conf.all.src_valid_mark=1 restart: unless-stopped volumes: bundle-data: driver: local
WireGuard配置(/etc/wireguard/wg.0.conf)
PrivateKey = <I think this is confidential info> Address = <I think this is confidential info> DNS = <I think this is confidential info> PostUp = DROUTE=$(ip route | grep default | awk '{print $3}'); HOMENET=192.168.0.0/16; HOMENET2=10.0.0.0/8; HOMENET3=172.16.0.0/12; ip route add $HOMENET3 via $DROUTE;ip route add $HOMENET2 via $DROUTE; ip route add $HOMENET via $DROUTE;iptables -I OUTPUT -d $HOMENET -j ACCEPT;iptables -A OUTPUT -d $HOMENET2 -j ACCEPT; iptables -A OUTPUT -d $HOMENET3 -j ACCEPT; iptables -A OUTPUT ! -o %i -m mark ! --mark $(wg show %i fwmark) -m addrtype ! --dst-type LOCAL -j REJECT PreDown = DROUTE=$(ip route | grep default | awk '{print $3}'); HOMENET=192.168.0.0/16; HOMENET2=10.0.0.0/8; HOMENET3=172.16.0.0/12; ip route del $HOMENET3 via $DROUTE;ip route del $HOMENET2 via $DROUTE; ip route del $HOMENET via $DROUTE; iptables -D OUTPUT ! -o %i -m mark ! --mark $(wg show %i fwmark) -m addrtype ! --dst-type LOCAL -j REJECT; iptables -D OUTPUT -d $HOMENET -j ACCEPT; iptables -D OUTPUT -d $HOMENET2 -j ACCEPT; iptables -D OUTPUT -d $HOMENET3 -j ACCEPT [Peer] PublicKey = <I think this is confidential info> PresharedKey = <I think this is confidential info> Endpoint = <I think this is confidential info> AllowedIPs = 0.0.0.0/0,::/0
尽管Docker Compose构建正常,但应用无法通过配置的DB Host URL连接数据库,需要确保容器网络请求通过VPN转发,现咨询两个问题:
- 是否需要本地开启VPN?这与容器内的VPN配置是否相关?
- 如何验证容器内的VPN是否正常工作?
回答
问题1:是否需要本地开启VPN?
不需要本地开启VPN。容器内的WireGuard是独立的VPN客户端,和本地VPN配置完全隔离。只要容器内的WireGuard配置正确并成功建立连接,应用容器(通过network_mode: service:wireguard共享网络空间)的所有网络请求都会走容器内的VPN通道,与本地网络状态无关。
问题2:如何验证容器内的VPN是否正常工作?
可以通过以下几种方式逐步验证:
- 检查WireGuard连接状态:进入wireguard容器执行
wg show命令,查看Peer的连接状态,确认latest handshake字段有更新(表示连接处于活跃状态)。docker exec -it wireguard wg show - 验证出口IP:在应用容器或wireguard容器内执行curl请求查看当前出口IP,对比VPN服务器的IP(或确认是否为预期的VPN出口地址)。
如果返回的IP是VPN服务器的IP,说明流量已通过VPN转发。# 进入应用容器(共享wireguard网络) docker exec -it <app-container-name> curl ifconfig.me # 或直接在wireguard容器内执行 docker exec -it wireguard curl ifconfig.me - 测试RDS连通性:在应用容器内使用
telnet或nc工具测试RDS地址和端口的可达性:
若能成功建立连接,说明VPN通道已正确转发数据库请求。docker exec -it <app-container-name> telnet <your-rds-host> 5432 # 或使用nc docker exec -it <app-container-name> nc -zv <your-rds-host> 5432 - 检查路由表:在wireguard容器内查看系统路由表,确认默认路由(
0.0.0.0/0)是否指向WireGuard接口(通常为wg0):
正常情况下会存在一条docker exec -it wireguard ip routedefault via <vpn-gateway> dev wg0的路由记录。
内容的提问来源于stack exchange,提问作者Roger Peixoto
相关产品推荐
相关产品推荐

