Rat's

使用ipset设置防火墙端口白名单,只让指定国家访问
说明:博主很早前发过VPS一键屏蔽指定国家IP的教程,查看:Linux VPS一键屏蔽指定国家所有的IP访问,这对...
扫描右侧二维码阅读全文
25
2018/07

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

说明:博主很早前发过VPS一键屏蔽指定国家IP的教程,查看:Linux VPS一键屏蔽指定国家所有的IP访问,这对于我们阻止某个国家访问网站和CC攻击还是很有用的,不过鉴于很多人需要白名单设置方法,博主研究了下,发现也可以用ipset来完成,这里就说下,目前测试是没问题的。

方法

首先需要得到国家IP段,下载地址:http://www.ipdeny.com/ipblocks/。这里以我们国家为例。

1、安装ipset

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

#CentOS系统
yum -y install ipset

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

systemctl stop firewalld.service
systemctl disable firewalld.service

2、清空之前的规则

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

3、创建新规则

#创建一个名为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

4、设置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端口,等于无法访问你的网站,其它端口还是可以访问的。

5、删除规则

#将参数里的-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命令保存下,保存命令可能在很多系统中都不通用,这里就不说了,需要各位自行搜索解决了,有耐心的也可以每次重启的时候都重新设置一下防火墙。

Vultr新用户注册送100美元/16个机房按小时计费,支持支付宝,【点击查看】。
最后修改:2018 年 11 月 20 日 09 : 07 PM

发表评论

13 条评论

  1. 666

    设置完之后,无法解析任何域名了,没人注意到这个问题吗?

  2. NeP

    这似乎会把127.0.0.1屏蔽了。

    1. 东方
      @NeP

      把它加进去不就得了

  3. jack

    请教RAT,我想屏蔽中国大陆访问80/443,使用以下设置是否正确,烦请指教,谢谢!

    禁止IP段

    iptables -A INPUT -p tcp -m set --match-set cnip src -j ACCEPT

    禁止指定端口80/443

    iptables -A INPUT -p tcp --dport 80 -j DROP
    iptables -A INPUT -p tcp --dport 443 -j DROP

    1. jack
      @jack 禁止IP段

      iptables -I INPUT -p tcp -m set --match-set cnip src -j ACCEPT

      禁止指定端口80/443

      iptables -I INPUT -p tcp --dport 80 -j DROP
      iptables -I INPUT -p tcp --dport 443 -j DROP
      找了一下资料,似乎应该这样才对,还请Rat帮忙检查,谢谢

      1. Rat's
        @jack

        这个直接用nginx配置就可以禁止国内访问网站,还简单些

        1. jack
          @Rat's

          我用Apache也可以对吧,你这个省事点

          1. Rat's
            @jack

            都可以,nginx也行,不过这些需要安装ip模块啥的,相对来说比较复杂些

  4. 站长安安,我的vps环境是
    CentOS 7.5.1804(x86_64)httpd nginx iptables
    按照上面的设置没有效果不知道是哪一个环节出问题
    谢谢站长>M<

    1. Rat's
      @茗

      按照步骤走是没错的,你设置完了后使用iptables -L查看下规则,带cnip的规则在第一排,如果你单独禁端口,那禁端口的规则在第二排。

  5. 蓝爵薇

    翻车了,保存规则后重启vps iptables自启失败
    要service iptables save再service iptables start才能启动。且规则也保存不了 。

    1. Rat's
      @蓝爵薇

      其实可以不用保存的,每次重启服务器就运行一遍规则就行了。

      1. jack
        @Rat's

        这个长期需要的,程序要代替每次手动加规则