给docker暴露的端口设置白名单

问题

之前有写过一篇博客
iptables对docker进行限制

介绍了如何限制对docker的访问,但是,如果是白名单,要如何写呢

可能很多人觉得应该是这样配置

iptables -F DOCKER-USER
iptables -A DOCKER-USER -s 192.168.5.100 -j ACCEPT
iptables -A DOCKER-USER -s 192.168.5.101 -j ACCEPT
iptables -A DOCKER-USER -j DROP

但是实际操作下来,发现,虽然确实限制了docker对外提供的服务,但是我们希望开放的白名单 192.168.5.100192.168.5.101 也是无法访问的

解决办法

只针对指定的端口进行放通和拒绝

例如,需要为docker暴露端口 8080 设置白名单

iptables -F DOCKER-USER
iptables -A DOCKER-USER -s 192.168.5.100 -p tcp --dport 8080 -j ACCEPT
iptables -A DOCKER-USER -s 192.168.5.101 -p tcp --dport 8080 -j ACCEPT
iptables -A DOCKER-USER -p tcp --dport 8080 -j DROP

这样配置下来,就可以完美解决这个问题

实用脚本

因为每次设备重启或者docker重启,都会导致防火墙配置重新加载,那如何保证我们自定义的策略能够不被覆盖掉呢

写成systemd服务

脚本部分

vim /data/insert_custom_iptables.sh

#!/bin/bash
ipv4="
10.10.1.0/24
192.168.5.100
192.168.5.101
172.17.0.0/16
"
ipv6="
240e:6b0::/64
2400:3200::/64
2001:1112:1111:1111::/64
"

tcpport="
8080
3306
80
"

udpport="
162
53
"

# 为了保证docker服务和原本的防火墙策略已经加载完成
sleep 30

iptables -F DOCKER-USER
for i4 in $ipv4;do
  for ptcp in $tcpport;do
    iptables -I DOCKER-USER -s $i4 -p tcp --dport $ptcp -j ACCEPT
  done
  for pudp in $udpport;do
    iptables -I DOCKER-USER -s $i4 -p udp --dport $pudp -j ACCEPT
  done
done

ip6tables -F DOCKER-USER
for i6 in $ipv6;do
  for ptcp in $tcpport;do
    ip6tables -I DOCKER-USER -s $i6 -p tcp --dport $ptcp -j ACCEPT
  done
  for pudp in $udpport;do
    ip6tables -I DOCKER-USER -s $i6 -p udp --dport $pudp -j ACCEPT
  done
done

for ptcp in $tcpport;do
  iptables -A DOCKER-USER -p tcp --dport $p -j DROP
  ip6tables -A DOCKER-USER -p tcp --dport $p -j DROP
done
for pudp in $udpport;do
  iptables -A DOCKER-USER -p udp --dport $pudp -j DROP
  ip6tables -A DOCKER-USER -p udp --dport $pudp -j DROP
done

这里面需要注意的是
ip地址中还需要加上docker本身网络的网段,包括IPv4和IPv6网段
也就是上面的 2001:1112:1111:1111::/64172.17.0.0/16

给权限

chmod +x /data/sinsert_custom_iptables.sh

systemd 服务

vim /etc/systemd/system/insert-custom-iptables.service

[Unit]
Description=Insert custom iptables rules to DOCKER-USER chain
After=docker.service
Requires=docker.service

[Service]
ExecStart=/data/insert_custom_iptables.sh
Type=oneshot
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

启动服务

systemctl daemon-reload
systemctl enable insert-custom-iptables.service
systemctl restart insert-custom-iptables.service
posted @   厚礼蝎  阅读(20)  评论(0编辑  收藏  举报
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示