docker bridge network 如何实现类似旁路由的效果?

2022-04-01 23:09:31 +08:00
 0o0O0o0O0o

思路是创建两个 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 日志 ,如果希望实现我期望的结果,我应该如何配置呢?希望能描述一下原理,谢谢。

[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/*
1211 次点击
所在节点    Docker
3 条回复
anubu
2022-04-02 08:59:18 +08:00
似乎使用 macvlan 网络更合适些。
0o0O0o0O0o
2022-04-02 09:28:27 +08:00
@anubu 谢谢,由于特殊原因,希望只用 docker bridge network 实现
0o0O0o0O0o
2022-04-02 09:29:33 +08:00
昨晚发现把 iptables 命令移到 wg-quick up 后面就可以了…

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/844426

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX