虽然,互联网是无国界的,但有时候还是需要限制某些地区访问我的服务器。

大部分攻击都来自国外,虽然Rat's分享过一键脚本,但一键脚本并不适合使用了面板的服务器,例如宝塔/appnode,实际上手动设置也很简单。
原本我是计划用安全组解决的,但是阿里云安全组能设置的IP段太少了,强行导入直接失败。只好用iptables。

首先需要得到国家IP段,下载地址:http://www.ipdeny.com/ipblocks/

下面我根据无面板/appnode/宝塔三种情况来写教程。

无面板

安装ipset

#Debian/Ubuntu系统
apt-get -y install ipset

#CentOS系统
yum -y install ipset

CentOS 7还需要关闭firewall防火墙:

systemctl stop firewalld.service
systemctl disable firewalld.service

清空之前的规则

#防止设置不生效,建议清空下之前的防火墙规则
iptables -P INPUT ACCEPT
iptables -F

创建新规则

#创建一个名为cnip的规则
ipset -N cnip hash:net
#下载国家IP段,这里以中国为例
wget -P . http://www.ipdeny.com/ipblocks/data/countries/cn.zone
#将IP段添加到cnip规则中
for i in $(cat /root/cn.zone ); do ipset -A cnip $i; done

设置IP段白名单

#放行IP段
iptables -A INPUT -p tcp -m set --match-set cnip src -j ACCEPT
#关掉所有端口
iptables -P INPUT DROP

这时候就只有中国的IP能访问服务器了。

如果你在国内,网站不允许被国内人访问,建议别关所有端口,这样你的SSH会上不去,我们可以只关闭80/443端口,上面关掉所有端口的命令就不用执行了。

#关闭指定端口,比如80/443
iptables -A INPUT -p tcp --dport 80 -j DROP
iptables -A INPUT -p tcp --dport 443 -j DROP

这时候其他国家的IP是无法访问你服务器的80/443端口,等于无法访问你的网站,其它端口还是可以访问的。

删除规则

#将参数里的-A改成-D就是删除规则了,如
iptables -D INPUT -p tcp -m set --match-set cnip src -j ACCEPT
iptables -D INPUT -p tcp --dport 443 -j DROP

保存规则

记得保存规则,之后重启进服务器,看iptables规则有没有删除。

appnode

appnode付费版也有根据国家ban IP的功能,当然在这我用的是免费版

appnode安装完成后自带ipset,就不用安装了,也不要执行清空规则。

初始配置appnode

前往应用列表-防火墙,点击安装防火墙-立即安装。
安装完成后有两个一键设置的提示:

 您当前数据包流入规则默认为接受,将默认规则更改为“拒绝”可以加固系统网络安全。 一键设置
 您当前转发链规则默认为接受,将默认规则更改为“拒绝”可以加固系统网络安全。 一键设置

选择一键设置后,点击启动,把自启和守护都勾上。
随便进一个应用列表的应用,再进入防火墙,以刷新界面。
选择22端口规则配置-增加规则-所有IP接受。
再次用SSH连接服务器。

创建新规则

#创建一个名为cnip的规则
ipset -N cnip hash:net
#下载国家IP段,这里以中国为例
wget -P . http://www.ipdeny.com/ipblocks/data/countries/cn.zone
#将IP段添加到cnip规则中
for i in $(cat /root/cn.zone ); do ipset -A cnip $i; done

设置IP段白名单

上面执行完后关掉ssh
进入防火墙应用,源文模式,点击编辑,将下面的内容输入进去

#放行IP段
[0:0] -A INPUT -p tcp -m set --match-set cnip src -j ACCEPT
#关掉所有端口
[0:0] -P INPUT DROP

输入后保存,重启防火墙服务,现在默认都是端口全开,最好是手动设置22端口,把它关掉:
选择22端口规则配置-编辑规则-所有IP拒绝。
你也可以设置其他端口,在面板的规则配置的权重高于你之前在源文模式设置的根据地区禁止访问的规则的权重。

宝塔

无法手动配置,现在的宝塔太脑残,面板直接覆盖掉你的所有设置,并且不给地方你设置。手动保存成功后也给你覆盖掉。
而面板处的设置选项也少的可怜。
论坛已经有很多人反馈这个问题了,但官方就是不改,连付费解决的途径都木有。


参考:使用ipset设置防火墙端口白名单,只让指定国家访问

最后修改:2020 年 02 月 07 日
如果觉得我的文章对你有用,请随意赞赏