此教程由Chatgpt4 生成,自己测试了以下没问题所以记录一下。
1. 安装必要的软件包
首先,确保您已安装了 iptables
和 ipset
。打开终端并运行以下命令
sudo apt update
sudo apt install iptables ipset
2. 创建 IP 集合
sudo ipset create cloudflare hash:net
3. 将 Cloudflare IP 地址添加到集合中
从 Cloudflare 的官方网站获取最新的 IP 地址列表:https://www.cloudflare.com/ips/
然后,将这些 IP 地址添加到您刚刚创建的集合中。运行以下命令(以实际 Cloudflare IP 地址替换示例 IP 地址):
ipset add cloudflare 103.21.244.0/22
ipset add cloudflare 103.22.200.0/22
ipset add cloudflare 103.31.4.0/22
ipset add cloudflare 104.16.0.0/13
ipset add cloudflare 104.24.0.0/14
ipset add cloudflare 108.162.192.0/18
ipset add cloudflare 131.0.72.0/22
ipset add cloudflare 141.101.64.0/18
ipset add cloudflare 162.158.0.0/15
ipset add cloudflare 172.64.0.0/13
ipset add cloudflare 173.245.48.0/20
ipset add cloudflare 188.114.96.0/20
ipset add cloudflare 190.93.240.0/20
ipset add cloudflare 197.234.240.0/22
ipset add cloudflare 198.41.128.0/17
# ...继续添加其他 IP 地址
4. 配置 iptables 规则
接下来,配置 iptables
规则,以仅允许来自 Cloudflare IP 地址的流量通过。首先,允许来自 Cloudflare 集合的流量:
sudo iptables -A INPUT -m set --match-set cloudflare src -j ACCEPT
然后,阻止其他所有 IP 地址的流量。请根据需要替换 <your_port>
为您希望保护的端口号(例如,HTTP 对应 80,HTTPS 对应 443):
sudo iptables -A INPUT -p tcp --dport <your_port> -j DROP
执行上面命令后 例如是443端口,执行后443端口只能接受来自Cloudflare IP的访问,其他IP访问则丢弃。
5. 保存 iptables 规则
要确保在服务器重新启动后 iptables
规则仍然有效,请安装 iptables-persistent
并保存当前规则:
sudo apt install iptables-persistent
sudo iptables-save | sudo tee /etc/iptables/rules.v4
6. 保存 ipset 配置
同样,您还需要在启动时恢复 ipset
配置。首先,保存当前配置:
sudo ipset save | sudo tee /etc/ipset.conf
接下来,创建一个新的 systemd 服务文件:
sudo vim /etc/systemd/system/ipset.service
[Unit]
Description=ipset persistent configuration
Before=netfilter-persistent.service
PartOf=netfilter-persistent.service
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/sbin/ipset restore -f /etc/ipset.conf
ExecStop=/sbin/ipset save -f /etc/ipset.conf
Environment=SYSTEMD_LOG_LEVEL=err
[Install]
WantedBy=multi-user.target
保存并退出文件。然后,启用并启动新创建的服务:
sudo systemctl enable ipset
sudo systemctl start ipset
sudo systemctl status ipset
因为刚才配置过了所以现在ipset启动不了,设置开机自启动后,重启下服务器,输入systemctl status ipset就能看到是运行状态了。
7.iptables 一些说明
说明由GPT生成
默认查看filter表、所有链的策
iptables -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 match-set cloudflare src
DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:443
第一条规则允许来自名为"cloudflare"的IP集合中的源IP地址所有的流量通过,包括TCP协议的443端口流量。这条规则的作用是允许来自Cloudflare CDN的流量通过防火墙,以便在Web服务器上提供服务。
第二条规则拒绝所有目标端口为443的TCP流量通过。这条规则的作用是防止来自其他来源的TCP 443端口的流量进入系统。因为这个规则在第二位,所以只有当源IP地址不在"cloudflare" IP集合中时,才会应用这条规则。
因此,这两条规则的功能是允许来自Cloudflare CDN的所有流量通过防火墙,同时拒绝来自其他源IP地址的TCP 443端口流量。如果这两条规则在同一个iptables链中,并且第一条规则在第二条规则之前,那么先执行第一条规则,否则先执行第二条规则。
如果访问IP通过第一条规则了,是不是就不会执行第二条规则了?
是的,如果一个IP地址通过了第一条规则(即被允许通过),那么它将不会被第二条规则(即被拒绝)所匹配。因为iptables规则是按照规则列表的顺序依次匹配的,一旦某个规则匹配成功,iptables就会执行相应的动作,并且不会再继续匹配后续的规则。因此,如果一个IP地址被第一条规则允许通过,那么它将不会被第二条规则所匹配,因此第二条规则对该IP地址不会起作用。
需要注意的是,如果一个IP地址既符合第一条规则又符合第二条规则,那么它将被第一条规则所匹配,并且被允许通过。这是因为iptables规则是按照规则列表的顺序依次匹配的,一旦某个规则匹配成功,iptables就会执行相应的动作,并且不会再继续匹配后续的规则。
现在,您的 Debian 10 服务器应该已经配置为仅允许来自 Cloudflare CDN 的 IP 地址访问。请注意,这可能会对您的 SSH 和其他服务产生影响,因此确保在实施此设置之前进行适当的测试。
依照上面的iptables说明,如果只有上面两条规则的话,通过测试实际上不会影响到22端口导致SSH断开失联。