配置iptables规则仅允许CloudFlare的IP访问网站 作者: 毕世平 时间: 2022-05-22 分类: 默认分类 前言:秋大在19年曾写过[如何使用 FirewallD 开启 IP 白名单](https://teddysun.com/566.html "点击访问")的文章,这里介绍使用了`Firewalld`配置仅允许`cloudflare ip`访问网站的规则。个人还是对`iptables`相对熟悉一些,于是试图用`iptables`来实现这一目标。 本文主要介绍在`Debian`发行版下使用`ipset`将`cloudflare`的所有IPv4地址加入到一个集合里面,然后在`iptables`规则里面引用这个集合,来配置仅允许cf的ip访问网站的80和443端口。 # 一、配置ipset ## 1.1 安装 `ipset`这个工具可能在`debian10`发行版下默认没有安装,因此需要先安装,执行下面命令: # 更新源并安装ipset apt update && apt -y install ipset ## 1.2 配置ip文本 根据[IP Ranges-CloudFlare](https://www.cloudflare.com/zh-cn/ips/ "点击打开")页面,这里罗列了cloudflare的所有IP子段,因此可以将它存为一个文本文件,然后将其加到ipset集合中去,当然你也可以基于此文本文件修改添加: # 下载CloudFlare提供的所有IPv4地址文本文件 wget -O cf_ipv4 https://www.cloudflare.com/ips-v4 # (如有需要,可以自行在此cf_ipv4文本文件中添加修改) # 创建ipset集合,取名cf,类型hash:net ipset create cf hash:net # 将上面下载好的cf地址全部添加到此cf集合中去 cat cf_ipv4 | xargs -I {} ipset add cf {} # 查看cf集合内容 ipset list cf # 删除此集合 ipset destroy cf ## 1.3 手动添加(跟1.2二选一即可) # 创建集合 ipset create cf hash:net # 手动添加 ipset add cf 173.245.48.0/20 ipset add cf 103.21.244.0/22 ipset add cf 103.22.200.0/22 ipset add cf 103.31.4.0/22 ipset add cf 141.101.64.0/18 ipset add cf 108.162.192.0/18 ipset add cf 190.93.240.0/20 ipset add cf 188.114.96.0/20 ipset add cf 197.234.240.0/22 ipset add cf 198.41.128.0/17 ipset add cf 162.158.0.0/15 ipset add cf 104.16.0.0/13 ipset add cf 104.24.0.0/14 ipset add cf 172.64.0.0/13 ipset add cf 131.0.72.0/22 # 二、配置iptables规则 下面的规则是摘抄自`Centos7`安装完`iptables-services`服务后默认带的规则,假定你的`vps ssh`端口是22,那么配置相应规则命令如下: iptables -t filter -F iptables -t filter -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -t filter -A INPUT -i lo -j ACCEPT iptables -t filter -A INPUT -p icmp -j ACCEPT iptables -t filter -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT iptables -t filter -A INPUT -p tcp -m state --state NEW -m set --match-set cf src -m tcp --dport 80 -j ACCEPT iptables -t filter -A INPUT -p tcp -m state --state NEW -m set --match-set cf src -m tcp --dport 443 -j ACCEPT iptables -t filter -A INPUT -j REJECT --reject-with icmp-host-prohibited iptables -t filter -A FORWARD -j REJECT --reject-with icmp-host-prohibited **说明**:使用`ipset`的好处就在于方便查找,而且不必添加多条同类的`iptables`规则拖慢匹配速度,而且当对ipset集合内容进行修改时,不用修改`iptables`规则即可生效。 # 三、规则和集合的持久化保存 ## 3.1 安装iptables-persistent 对于`Debian`,它不像`Centos`那样可以安装`iptables-services`和`ipset-service`,不过`Debian`有`iptables-persistent`这个持久化工具: # 安装,安装过程中会提示是否保存当前iptables规则,保存即可 apt -y install iptables-persistent # 查看状态,一般装完默认启动 systemctl status netfilter-persistent # 每次修改iptables规则后,要对其进行保存,需执行下面命令 netfilter-persistent save # (可选)也可对/usr/sbin/netfilter-persistent脚本创建个软连接 ln -s /usr/sbin/netfilter-persistent /usr/sbin/np # (可选)创建完软连接后,执行下面命令即可保存 np save ## 3.2 配置ipset的持久化 与`iptables`规则一样,如果不对`ipset`集合内容进行保存,机器重启`ipset`集合内容就会丢失,因此需要借助这样一个扩展:[netfilter-persistent-plugin-ipset项目地址](https://github.com/freeyoung/netfilter-persistent-plugin-ipset "点击访问") # 切换路径 cd /usr/share/netfilter-persistent/plugins.d # 下载脚本插件 wget https://raw.githubusercontent.com/freeyoung/netfilter-persistent-plugin-ipset/master/10-ipset # 添加可执行权限 chmod +x 10-ipset # 添加好以后,即可在保存iptables规则的同时保存ipset集合内容 netfilter-persistent save (np save) //若是上面一步创建了软连接 > 执行此命令,第一行即可看到10-ipset保存成功字样 参考链接: - [CloudFlare所有IP地址界面](https://www.cloudflare.com/zh-cn/ips/ "点击访问") - [如何使用 FirewallD 开启 IP 白名单-秋水逸冰](https://teddysun.com/566.html "点击访问") - [ipset持久化工具项目地址](https://github.com/freeyoung/netfilter-persistent-plugin-ipset "点击访问") - [Linux xargs命令](https://www.runoob.com/linux/linux-comm-xargs.html "点击访问") 标签: none