解决 Docker 对 iptables 的影响
  LinuxDocker   0 评论

解决 Docker 对 iptables 的影响

  LinuxDocker   0 评论

当我们在启动容器的时候设置了端口映射,就会导致 iptables 设置失效,端口直接暴露在公网上,这对我们不想暴露出来或者需要使用 caddy/nginx 反向代理的童鞋来说会很难受

测试环境

ufw 配置

我们首先进行一下 ufw 的配置

# 如果没有安装则执行
apt update && apt install -y ufw
# 设置默认行为
ufw default reject incoming
ufw default allow outgoing
ufw default allow routed
# 添加默认的规则,防止把 ssh 端口禁用
ufw allow ssh
# 允许 docker 内部方位
ufw all from 172.17.0.0/16
# 启用 ufw
ufw disable && ufw enable

禁止 docker 修改 iptables

mkdir -p /lib/systemd/system/docker.service.d

cat << EOF > /lib/systemd/system/docker.service.d/override.conf
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd
EOF

cat << EOF > /etc/docker/daemon.json
{
  "hosts": ["fd://"],
  "dns": ["8.8.8.8", "8.8.4.4"],
  "iptables": false
}
EOF

systemctl daemon-reload && systemctl restart docker

检查 docker 启动命令

ps aux | grep docker | grep -v grep

配置 Docker 的 NAT

cat << EOF >> /etc/ufw/before.rules
*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING ! -o docker0 -s 172.17.0.0/16 -j MASQUERADE
COMMIT
EOF

# 检查 docker 内是否可以访问外网
docker run -it --rm alpine ping -c 1 8.8.8.8

其它

  1. nginx 无法获取真实 ip

    可以使用 host 模式启动容器

    docker run --net=host ...

参考来源

回复