仅允许特定 IP 访问特定端口
诉求及策略
尽管最终目标“禁止 IP + 端口访问”未实现,不过也算是已经变相满足安全诉求。这是第三种用来屏蔽外界直接访问特定服务之解决方案,之前两种,一种是直接不暴露 Docker 容器端口借助反代从根源上达到目的,另一种是通过自定义容器内配置文件以达到屏蔽外界通过 IP 地址直接访问服务之可能性,这第三种比较特殊,不能通过上述那两种方法达到目的,必须要暴露并映射端口才能使用,也无法通过自定义配置文件去屏蔽。具体策略就是,仅允许特定 IP 访问某个端口且开机自动运行,尽管无法通过反代访问,不过就算是没有 ssl 配置之安全加持,外界也无法访问特定端口之服务。最终,特定之服务,只能通过特定 IP 地址访问,其实就是代理地址。
第 1 步
安装ipset
工具,并新建add_ips.sh
脚本。
1 2 |
apt-get install -y ipset #安装 ipset 地址管理工具 nano /root/add_ips.sh #新建 add_ips.sh 脚本 |
第 2 步
在add_ips.sh
脚本中添加以下内容。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#!/bin/bash # 创建 ipset allowed_ips 地址合集 ipset create allowed_ips hash:ip # 添加 IP 地址到 ipset allowed_ips 合集 ipset add allowed_ips 地址1 ipset add allowed_ips 地址2 ipset add allowed_ips 地址3 # 设置 iptables 规则 iptables -A INPUT -p tcp -m multiport --dports 端口 \ -m set --match-set allowed_ips src \ -m comment --comment "Allow access to port 端口 from allowed IPs" \ -j ACCEPT iptables -A INPUT -p tcp --dport 端口 \ -m comment --comment "Block access to port 端口 for all other sources" \ -j DROP |
第 3 步
赋予add_ips.sh
执行权限,并新建add_ips.service
开机自动运行服务文件。
1 2 |
chmod +x ./add_ips.sh #赋予权限 nano /etc/systemd/system/add_ips.service #新建开机自动运行服务文件 |
第 4 步
在add_ips.service
文件中添加以下内容。
1 2 3 4 5 6 7 8 |
[Unit] Description=Add IP addresses to ipset and set iptables rules After=network.target [Service] Type=oneshot ExecStart=/root/add_ips.sh [Install] WantedBy=multi-user.target |
第 5 步
重新加载配置,设置开机自动运行,启动服务,查看运行状态。验证配置是否已经生效。
1 2 3 4 5 |
systemctl daemon-reload #重新加载配置 systemctl enable add_ips.service #设置开机自动运行 systemctl start add_ips.service #启动服务 systemctl status add_ips.service #查看运行状态 iptables -L INPUT -n #验证是否生效 |
第 6 步
重启服务器,验证是否开机自动运行。
1 2 |
reboot #重启服务器 iptables -L INPUT -n #验证是否自己自动成功运行 |
命令备忘
1 2 3 |
iptables -D INPUT 1 #清楚编号为 1 的防火墙入站规则 iptables -L -n #查看全部防火墙规则 ipset list allowed_ips #显示地址合集具体信息 |
鸣谢
所有解决思路和方案探讨,以及最终诉求达成,全部来自 ChatGPT 之建议。
THE END