pve虚拟机下istoreos docker容器不能访问外网的问题解决方法
问题复现:安装了QD容器,执行任务时一直超时,同样的其他容器内部好像也不能访问外网,最直接的方式是用了host模式启动容器,这样可以正常连接外网。
- 查了资料发现是防火墙问题
- 参考一:https://www.jb51.net/server/290134iof.htm
- 参考二:https://github.com/istoreos/istoreos/discussions/1077
- 参考三:https://github.com/istoreos/istoreos/issues/1511
- 参考四:https://github.com/istoreos/istoreos/issues/934
解决方法1:你这个是因为旁路由的情况下,流量不是从wan口出去,而是从lan口出去,lan口默认没开NAT。所以解决方法也很简单,在防火墙页面,把lan口的“IP动态伪装”勾选上。
解决方法2 :根据:https://www.jb51.net/server/290134iof.htm 该文章参考步骤尝试
# docker network inspect bridge
[
{
"Name": "bridge",
"Id": "52d99eec11c4706581e4b8235613d5258ef2c318557baddbb79766136d7b0868",
"Created": "2022-10-22T19:31:19.358514137+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.17.0.0/16",
"Gateway": "172.17.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {
"com.docker.network.bridge.default_bridge": "true",
"com.docker.network.bridge.enable_icc": "true",
"com.docker.network.bridge.enable_ip_masquerade": "false",
"com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
"com.docker.network.bridge.name": "docker0",
"com.docker.network.driver.mtu": "1500"
},
"Labels": {}
}
]
发现:com.docker.network.bridge.enable_ip_masquerade值为false,代表是否开启IP伪装,false代表未开启。
接着原文通过\# vim /etc/systemd/system/docker.service
来更改配置,找了半天也没有找到istoreos里面的docker.service文件在哪里,最后得知直接更改/etc/config/dockerd
文件,将iptables0改为1即可
config globals 'globals'
option log_level 'warn'
option iptables '1' # 将 '0' 改为 '1'
option data_root '/mnt/sdb1/docker'
option remote_endpoint '0'
config firewall 'firewall'
option device 'docker0'
list blocked_interfaces 'wan'
然后重启docker:service dockerd restart
,然后再docker network inspect bridge
发现"com.docker.network.bridge.enable_ip_masquerade": “true”,至此QD任务可正常执行
看看AI的解释:
在 Docker 的配置文件中,`iptables` 选项用于控制 Docker 是否应该管理和修改 iptables 规则。具体来说:
- `option iptables '0'` 表示 Docker 不会管理和修改 iptables 规则。
- `option iptables '1'` 表示 Docker 会管理和修改 iptables 规则。
当 `iptables` 设置为 `0` 时,Docker 不会添加任何 iptables 规则,这意味着容器的网络流量不会经过 Docker 的默认 NAT 和防火墙规则处理。这可能会导致容器无法访问外部网络,除非手动配置 iptables 规则。
设置 `iptables` 为 `1` 可以确保 Docker 自动管理 iptables 规则,以确保容器的网络功能正常运行,包括 NAT、端口映射和 IP 伪装等。