思路是创建两个 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 后面就可以了…
|