这是网络设计 https://imagebin.ca/v/5NNDpuDwq9PT
它托管在 hetzner 上,1 个带有面向公众的接口的防火墙,pfsense。1 个带有两个接口的 docker 主机,一个连接到私有网络,一个面向互联网,面向公众的接口处于 DOWN 状态并且需要保持这种状态。docker 主机是 ubuntu 20.04,但 18.04 也出现了同样的行为。
docker 主机通过 pfSense 正确访问互联网,容器在桥接网络中则无法访问。它们确实可以访问互联网并可以发出 DNS 请求和 ping,但只要我发出稍大一点的 http/s 请求,数据包就会被丢弃并且无法通过。
这是“curl”上的数据包捕获https://www.google.com“
https://imagebin.ca/v/5NPvwMusFW5i
左侧是 pfSense 盒与 docker 主机之间的 pfSense 盒上的数据包捕获,右侧是主机与容器之间的主机上的数据包捕获
如果我以主机模式而不是桥接模式设置 docker 网络,那么一切都可以正常工作。
就好像大于 1288 的数据包无法从主机传输到容器,这看起来很奇怪。这种行为可能是什么原因造成的?它只发生在桥接网络中,而不会发生在主机网络中。非常奇怪的是,如果我在主机上启动面向公众的接口并让它在不通过私有网络/pfSense 盒的情况下上网,桥接网络就可以工作。
私有网络接口和面向公众的接口有不同的驱动程序,一个是eth,另一个是ens。
有任何想法吗?
docker network inspect(在桥接网络上)
[
{
"Name": "customername",
"Id": "fb5efb66279ac3d33e7b671f542a017d7bb13bf935444df43b0a7d95da60dc75",
"Created": "2020-05-22T15:19:23.03700718+02:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "192.168.1.0/24",
"Gateway": "192.168.1.1"
}
]
},
"Internal": false,
"Attachable": true,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"a09dfb38562b518d9c4dbf44f6f5ea6ac43904c17b6714e5aa13fe35cc7d5f5a": {
"Name": "romantic_dijkstra",
"EndpointID": "516ddfd29d82b161e197109d83ee0ccdfb52257dc2874ef11aa1f1ae15adbcd3",
"MacAddress": "02:42:c0:a8:01:02",
"IPv4Address": "192.168.1.2/24",
"IPv6Address": ""
}
},
"Options": {
"com.docker.network.bridge.default_bridge": "false",
"com.docker.network.bridge.enable_icc": "true",
"com.docker.network.bridge.enable_ip_masquerade": "true",
"com.docker.network.bridge.host_binding_ipv4": "10.0.10.3",
"com.docker.network.bridge.name": "customername-br",
"com.docker.network.driver.mtu": "1500"
},
"Labels": {}
}
]
答案1
您的问题有点晚了,但我目前也面临类似的问题。我发现 Hetzner 的私有接口的 mtu 为 1450,而公共接口的 mtu 为 1500。这是 docker 的一个严重问题,因为它的默认 mtu 是 1500。
有一个部分解决方案,但不适用于我正在使用的 docker-compose https://rahulait.wordpress.com/2016/02/28/modifying-default-mtu-for-docker-containers/