You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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转发,现咨询两个问题:

  1. 是否需要本地开启VPN?这与容器内的VPN配置是否相关?
  2. 如何验证容器内的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出口地址)。
    # 进入应用容器(共享wireguard网络)
    docker exec -it <app-container-name> curl ifconfig.me
    # 或直接在wireguard容器内执行
    docker exec -it wireguard curl ifconfig.me
    
    如果返回的IP是VPN服务器的IP,说明流量已通过VPN转发。
  • 测试RDS连通性:在应用容器内使用telnet或nc工具测试RDS地址和端口的可达性:
    docker exec -it <app-container-name> telnet <your-rds-host> 5432
    # 或使用nc
    docker exec -it <app-container-name> nc -zv <your-rds-host> 5432
    
    若能成功建立连接,说明VPN通道已正确转发数据库请求。
  • 检查路由表:在wireguard容器内查看系统路由表,确认默认路由(0.0.0.0/0)是否指向WireGuard接口(通常为wg0):
    docker exec -it wireguard ip route
    
    正常情况下会存在一条default via <vpn-gateway> dev wg0的路由记录。

内容的提问来源于stack exchange,提问作者Roger Peixoto

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 21:10:54