给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.100
和 192.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::/64
和172.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
本文来自博客园,作者:厚礼蝎,转载请注明原文链接:https://www.cnblogs.com/guangdelw/p/18719936
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现