Loading... <strong>说明:</strong>博主很早前发过<code>VPS</code>一键屏蔽指定国家<code>IP</code>的教程,查看:<a href="http://www.502435.com/1026.html" target="_blank" rel="noopener noreferrer">Linux VPS一键屏蔽指定国家所有的IP访问</a>,这对于我们阻止某个国家访问网站和<code>CC</code>攻击还是很有用的,不过鉴于很多人需要白名单设置方法,博主研究了下,发现也可以用<code>ipset</code>来完成,这里就说下,目前测试是没问题的。 <div data-unique="方法"></div> <h2>方法</h2> 首先需要得到国家<code>IP</code>段,下载地址:<a href="http://www.ipdeny.com/ipblocks/" target="_blank" rel="noopener noreferrer">http://www.ipdeny.com/ipblocks/</a>。这里以我们国家为例。 <strong>1、安装ipset</strong> <pre><code class="hljs shell"><span class="hljs-meta">#</span><span class="bash">Debian/Ubuntu系统</span> apt-get -y install ipset <span class="hljs-meta"> #</span><span class="bash">CentOS系统</span> yum -y install ipset </code></pre> <code>CentOS 7</code>还需要关闭<code>firewall</code>防火墙: <pre><code class="hljs sql">systemctl <span class="hljs-keyword">stop</span> firewalld.service systemctl <span class="hljs-keyword">disable</span> firewalld.service </code></pre> <strong>2、清空之前的规则</strong> <pre><code class="hljs nginx"><span class="hljs-comment">#防止设置不生效,建议清空下之前的防火墙规则</span> <span class="hljs-attribute">iptables</span> -P INPUT ACCEPT iptables -F </code></pre> <strong>3、创建新规则</strong> <pre><code class="hljs bash"><span class="hljs-comment">#创建一个名为cnip的规则</span> ipset -N cnip <span class="hljs-built_in">hash</span>:net <span class="hljs-comment">#下载国家IP段,这里以中国为例</span> wget -P . http://www.ipdeny.com/ipblocks/data/countries/cn.zone <span class="hljs-comment">#将IP段添加到cnip规则中</span> <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> $(cat /root/cn.zone ); <span class="hljs-keyword">do</span> ipset -A cnip <span class="hljs-variable">$i</span>; <span class="hljs-keyword">done</span> </code></pre> <strong>4、设置IP段白名单</strong> <pre><code class="hljs cs"><span class="hljs-meta">#放行IP段</span> iptables -A INPUT -p tcp -m <span class="hljs-keyword">set</span> --match-<span class="hljs-keyword">set</span> cnip src -j ACCEPT <span class="hljs-meta">#关掉所有端口</span> iptables -P INPUT DROP</code></pre> 这时候就只有指定国家的<code>IP</code>能访问服务器了。 如果你在国内,网站不允许被国内人访问,建议别关所有端口,这样你的<code>SSH</code>会上不去,我们可以只关闭<code>80</code>/<code>443</code>端口。 <pre><code class="hljs nginx"><span class="hljs-comment">#关闭指定端口,比如80/443</span> <span class="hljs-attribute">iptables</span> -A INPUT -p tcp --dport <span class="hljs-number">80</span> -j DROP iptables -A INPUT -p tcp --dport <span class="hljs-number">443</span> -j DROP</code></pre> 这时候其他国家的<code>IP</code>是无法访问你服务器的<code>80</code>/<code>443</code>端口,等于无法访问你的网站,其它端口还是可以访问的。 <strong>5、删除规则</strong> <pre><code class="hljs cs"><span class="hljs-meta">#将参数里的-A改成-D就是删除规则了,如</span> iptables -D INPUT -p tcp -m <span class="hljs-keyword">set</span> --match-<span class="hljs-keyword">set</span> cnip src -j ACCEPT iptables -D INPUT -p tcp --dport <span class="hljs-number">443</span> -j DROP </code></pre> <div data-unique="说明"></div> <h2>说明</h2> 设置防火墙后,可能有些服务器重启系统后会清空防火墙规则,导致设置的失效,所以我们设置规则后,需要使用<code>iptables</code>命令保存下,保存命令可能在很多系统中都不通用,这里就不说了,需要各位自行搜索解决了,有耐心的也可以每次重启的时候都重新设置一下防火墙。 最后修改:2022 年 08 月 02 日 © 允许规范转载 打赏 赞赏作者 赞 0 如果觉得我的文章对你有用,请随意赞赏