使用iptables实现只允许中国或指定IP访问服务器

90次阅读
没有评论

虽然互联网使地球变成了村,但是,有些外村村民时分不友好,服务器的大部分攻击都来自国外,单位电脑更是其攻击的主要目标,这时就极有必要限制与他们来往。

实现与其隔绝有多种方式,首先是防火墙,单位硬件来现,或者云服务商的防火墙规则,但有时不是这么容易实现的,首先硬件多数是在成本的,服务商的规则不太人性化,不能随意设置,比如阿里云可以用安全组解决,但安全组能设置的IP段太少了,强行导入直接失败。这时就把功能转移到了服务器本身上,简单实用的环境可以用iptables实现,有appnode/宝塔也可以在面板上设置。

如果是像我一样,想屏蔽某个国家的IP,首先需要得到国家IP段,下载地址:http://www.ipdeny.com/ipblocks/(可能需要梯子)。

一、iptables屏蔽来自某个国家的 IP

安装ipset、iptables服务

#Debian/Ubuntu系统
apt-get -y install ipset
apt-get -y install iptables
#CentOS系统
yum -y install ipset 
#安装或更新服务
yum install iptables-services 
#启用iptables
systemctl enable iptables 
#启动iptables
systemctl start iptables

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

#停止firewall
systemctl stop firewalld.service
#禁止firewall开机启动
systemctl disable firewalld.service
#查看默认防火墙状态(关闭后显示notrunning,开启后显示running)
firewall-cmd --state 
如发现service iptables save 无效,而且报错
[root@localhost bin]# service iptables save
The service command supports only basic LSB actions (start, stop, restart, try-restart, reload, force-reload, status). For other actions, please try to use systemctl.,产生这个问题的原因是iptables的服务没有安装,按上步安装。(问题记录)

清空之前的规则

#防止设置不生效,建议清空下之前的防火墙规则
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规则有没有删除。

ptables-save把规则保存到文件中,再由目录rc.d下的脚本(/etc/rc.d/init.d/iptables)自动装载

使用命令iptables-save来保存规则。一般用

iptables-save > /etc/sysconfig/iptables

生成保存规则的文件 /etc/sysconfig/iptables,

也可以用

service iptables save

它能把规则自动保存在/etc/sysconfig/iptables中。

当计算机启动时,rc.d下的脚本将用命令iptables-restore调用这个文件,从而就自动恢复了规则。

 

二、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详解

iptables详解及一些常用规则

怎样利用.htaccess屏蔽国内IP访问?

 2
评论(没有评论)
验证码