Debian服务器设置只允许cloudflare的IP访问

20230518205605.png
20230518205645.png

此教程由Chatgpt4 生成,自己测试了以下没问题所以记录一下。

1. 安装必要的软件包

首先,确保您已安装了 iptablesipset。打开终端并运行以下命令

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断开失联。


本文由:星际难民
实践,测试,整理发布.如需转载请注明地址 本文标题:Debian服务器设置只允许cloudflare的IP访问
地址:https://530503.xyz/articles/2023/05/18/1684417015384.html

评论

取消