Как использовать контейнер docker в качестве маршрутизатора для других контейнеров в той же сети

#docker #networking #docker-compose

#docker #сеть #docker-compose

Вопрос:

Я хочу использовать docker-compose для настройки один контейнер (C1) работает как маршрутизатор / шлюз, C1 пересылает данные tcp из контейнера (C2) в Интернет. Но C2 вообще не может получить доступ к Интернету, traceroute показывает, что пакеты достигли C1, после чего больше никаких дальнейших действий

при аналогичной настройке с использованием виртуальных машин все работает нормально. Почему это так?

C2 (установите C1 в качестве маршрутизатора по умолчанию) -> C1 -> интернет

C1: alpine image, с установленными iptables, ip: 1.1 . здесь работает ping или traceroute

iptables -A FORWARD -o eth0 -j ACCEPT;

C2: alpine image, используется 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

  

Ответ №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