
思路是创建两个 bridge network ,容器 gateway 相当于具备两张网卡,容器 client 只有一张网卡,并且 client 的网关设定为 gateway 同局域网的 IP ,期望 client 通过 gateway 联网,当 gateway 配置好后,client 也就享受到了透明代理。这个思路和 network_mode: "service:gateway" 有区别,没有使用过旁路由,但看描述,似乎和旁路由很相似。
运行起来后在 client 里发出请求,在 host 上看 log ,是有 src 为 gateway wan IP 的日志的:
IN=br-afa9afabafa5 OUT= MAC= SRC=172.30.0.2 DST=114.114.114.114 LEN=79 TOS=0x00 PREC=0x00 TTL=64 ID=43805 PROTO=UDP SPT=36940 DPT=53 LEN=59 MARK=0x1
但是如果在 gateway 运行 wireguard ,gateway 内可以实现全局代理,而 client 里就没法使用网络了,不清楚 docker 中如何调试 iptables 日志 ,如果希望实现我期望的结果,我应该如何配置呢?希望能描述一下原理,谢谢。
docker-compose version 1.25.0
Docker version 20.10.12, build e91ed57
[Interface] PrivateKey = <PrivateKey> Address = 10.101.0.2/32 [Peer] PublicKey = <PublicKey> AllowedIPs = 0.0.0.0/0 Endpoint = <Server>:10000 # docker-compose.yml version: "3" networks: lan: driver: bridge ipam: config: - subnet: 172.28.0.0/16 wan: driver: bridge ipam: config: - subnet: 172.30.0.0/16 services: gateway: container_name: gateway hostname: gateway build: context: . dockerfile: Dockerfile privileged: true sysctls: net.ipv4.ip_forward: 1 cap_add: - NET_ADMIN networks: wan: ipv4_address: 172.30.0.2 lan: ipv4_address: 172.28.0.2 command: >- sh -c 'echo && ip route del default && ip route add default via 172.30.0.1 && echo && ip rule show && route -n && echo && iptables -t nat -I POSTROUTING -j MASQUERADE && iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT && iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT && tail -f /dev/null' client: container_name: client hostname: client build: context: . dockerfile: Dockerfile privileged: true cap_add: - NET_ADMIN networks: lan: ipv4_address: 172.28.0.3 command: >- sh -c 'echo && ip route del default && ip route add default via 172.28.0.2 && echo "nameserver 114.114.114.114" >/etc/resolv.conf && tail -f /dev/null' # Dockerfile FROM ubuntu:focal RUN apt-get update && apt-get install -y \ curl ca-certificates \ iproute2 net-tools iptables \ dnsutils \ inetutils-ping curl host mtr-tiny tcpdump \ rsyslog \ wireguard-tools openresolv kmod --no-install-recommends \ && rm -rf /var/lib/apt/lists/* 1 anubu 2022-04-02 08:59:18 +08:00 似乎使用 macvlan 网络更合适些。 |
2 0o0O0o0O0o OP @anubu 谢谢,由于特殊原因,希望只用 docker bridge network 实现 |
3 0o0O0o0O0o OP 昨晚发现把 iptables 命令移到 wg-quick up 后面就可以了… |