#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