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)
从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)
| 归档时间: |
|
| 查看次数: |
6496 次 |
| 最近记录: |