如何使用docker容器作为同一网络中其他容器的路由器

Ton*_*hua 5 networking docker docker-compose

我想使用 docker-compose 设置一个容器(C1)作为路由器/网关,C1 将 tcp 数据从容器(C2)转发到互联网。但是C2根本无法访问互联网,traceroute显示数据包到达C1然后不再采取进一步的行动

使用虚拟机进行类似的设置,效果很好。这是为什么?

C2(设置C1为默认路由器)-> C1 -> 互联网

C1:alpine 镜像,安装了 iptables,ip: 1.1 。ping 或traceroute 在这里起作用

iptables -A FORWARD -o eth0 -j ACCEPT;

C2:alpine镜像,用于ip route 替换默认路由器,ip:1.3

ip route replace default via 172.28.1.1

version: '3'
services:
    C1:
        build: ./projects/C1
        container_name: C1
        privileged: true
        cap_add:
            - NET_ADMIN
            - SYS_MODULE
        sysctls:
            # - net.ipv4.conf.all.src_valid_mark=1
            - net.ipv4.ip_forward=1
        networks:
            testing_net:
                ipv4_address: 172.28.1.1

    C2:
        build: ./projects/C2
        container_name: C2
        cap_add:
            - NET_ADMIN
            - SYS_MODULE
        privileged: true
        # sysctls:
            # - net.ipv4.conf.all.src_valid_mark=1
            # - net.ipv4.ip_forward=1
        networks:
            testing_net:
                ipv4_address: 172.28.1.3
                
networks:
    testing_net:
        ipam:
            driver: default
            config:
                - subnet: 172.28.0.0/16

Run Code Online (Sandbox Code Playgroud)

Ton*_*hua 4

从wireshark中,我可以看到C1/C2正在发送SYN数据包,但网站没有响应。根据此https://serverfault.com/a/496548/565903,我必须设置 tcp 时间戳 0,因此在 docker-compose.yml 文件的 C1 部分中,添加 tcp_timestamps = 0 然后我可以从 C2 访问公共互联网。

        sysctls:
            - net.ipv4.ip_forward=1
            - net.ipv4.tcp_timestamps=0
Run Code Online (Sandbox Code Playgroud)