【问题标题】:How to use docker container as a router for other containers in the same network如何使用 docker 容器作为同一网络中其他容器的路由器
【发布时间】:2020-09-21 20:53:12
【问题描述】:

我想使用 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

【问题讨论】:

    标签: docker networking docker-compose


    【解决方案1】:

    从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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-22
      • 1970-01-01
      • 2017-01-26
      • 2022-12-01
      • 1970-01-01
      • 2023-03-30
      相关资源
      最近更新 更多