以下是使用 ipset 和 iptables 来控制容器端口访问的完整步骤,以 9000 端口为例:
1. 安装 ipset(如果尚未安装)
sudo apt-get update
sudo apt-get install ipset -y
2. 创建 ipset 集合
创建允许的特定 IP 集合
sudo ipset create allowed_ips hash:ip
创建 Cloudflare IPv4 集合
sudo ipset create cf_ipv4 hash:net
创建 Cloudflare IPv6 集合(如需要)
sudo ipset create cf_ipv6 hash:net family inet6
3. 添加 IP 到集合
添加需要允许访问的特定 IP 地址到allowed_ips 集合,替换为你自己的 IP
sudo ipset add allowed_ips 192.168.1.11
添加 Cloudflare IPv4 网段
sudo ipset add cf_ipv4 103.21.244.0/22
sudo ipset add cf_ipv4 103.22.200.0/22
sudo ipset add cf_ipv4 103.31.4.0/22
sudo ipset add cf_ipv4 104.16.0.0/13
sudo ipset add cf_ipv4 104.24.0.0/14
sudo ipset add cf_ipv4 108.162.192.0/18
sudo ipset add cf_ipv4 131.0.72.0/22
sudo ipset add cf_ipv4 141.101.64.0/18
sudo ipset add cf_ipv4 162.158.0.0/15
sudo ipset add cf_ipv4 172.64.0.0/13
sudo ipset add cf_ipv4 173.245.48.0/20
sudo ipset add cf_ipv4 188.114.96.0/20
sudo ipset add cf_ipv4 190.93.240.0/20
sudo ipset add cf_ipv4 197.234.240.0/22
sudo ipset add cf_ipv4 198.41.128.0/17
添加 Cloudflare IPv6 网段(如需要)
sudo ipset add cf_ipv6 2400:cb00::/32
sudo ipset add cf_ipv6 2606:4700::/32
sudo ipset add cf_ipv6 2803:f800::/32
sudo ipset add cf_ipv6 2405:b500::/32
sudo ipset add cf_ipv6 2405:8100::/32
sudo ipset add cf_ipv6 2a06:98c0::/29
sudo ipset add cf_ipv6 2c0f:f248::/32
4. 添加新的 iptables 规则
允许 allowed_ips 与cf_ipv4集合的ip地址访问 9000 端口
sudo iptables -I DOCKER-USER 1 -m set --match-set allowed_ips src -p tcp --dport 9000 -j ACCEPT
sudo iptables -I DOCKER-USER 2 -m set --match-set cf_ipv4 src -p tcp --dport 9000 -j ACCEPT
sudo iptables -I DOCKER-USER 3 -p tcp --dport 9000 -j DROP
5. 添加 IPv6 规则(如需要)
允许 cf_ipv6 集合中的 IPv6 地址访问 9000 端口
sudo ip6tables -I DOCKER-USER 1 -m set --match-set cf_ipv6 src -p tcp --dport 9000 -j ACCEPT
sudo ip6tables -I DOCKER-USER 2 -p tcp --dport 9000 -j DROP
删除规则,例如编号7的规则
sudo ip6tables -D DOCKER-USER 7
6. 验证规则
检查 allowed_ips 集合
sudo ipset list allowed_ips
检查 ipset 集合
sudo ipset list
检查 IPv4 iptables 规则
sudo iptables -vnL DOCKER-USER --line-numbers
检查 IPv6 iptables 规则(如已配置)
sudo ip6tables -L DOCKER-USER -n -v --line-numbers
7. 保存规则以防重启后丢失
保存 ipset 集合
sudo ipset save > /etc/ipset.conf
保存 iptables 规则
sudo iptables-save > /etc/iptables/rules.v4
保存 ip6tables 规则(如已配置)
sudo ip6tables-save > /etc/iptables/rules.v6
8. 创建开机自动加载脚本
# 创建启动脚本
cat > /etc/network/if-pre-up.d/ipset <<EOF
#!/bin/bash
ipset restore < /etc/ipset.conf
exit 0
EOF
# 赋予执行权限
chmod +x /etc/network/if-pre-up.d/ipset
9. 清除现有的 DOCKER-USER 规则
查看allowed_ips集合
sudo ipset list allowed_ips
从 allowed_ips 集合中删除指定 IP
sudo ipset del allowed_ips 192.168.1.22
首先检查并记录现有规则的数量:
sudo iptables -vnL DOCKER-USER --line-numbers
然后根据查询结果删除相关规则。假设有 4 条与 9000 端口相关的规则:
# 注意:从最高编号开始删除,避免编号变化
sudo iptables -D DOCKER-USER 4
sudo iptables -D DOCKER-USER 3
sudo iptables -D DOCKER-USER 2
sudo iptables -D DOCKER-USER 1
现在,只有 allowed_ips 集合中的特定 IP 和 cf_ipv4 集合中的 Cloudflare IP 才能访问你的 9000 端口,其他所有 IP 的访问都会被拒绝。如果后续需要添加更多 IP,只需将它们添加到 allowed_ips 集合中即可,不需要修改 iptables 规则。