Apache 封禁IP及IP段访问
一般来说,网站可以用域名和IP来访问,通过IP直接访问,本来这没什么问题,但是会有些隐患:
1. 影响搜索引擎权重
由于搜索引擎收录你网站域名,同时也会收录你的IP地址的页面,所以同一个页面搜索引擎会重复收录,造成页面的权重不如单个收录高。
2. 恶意域名重定向
域名恶意指向的可能。记得 google.com.sb 事件吗?google.com.sb 这个域名被恶意指向了百度,后来证实了 google.com.sb 这个域名为第三者恶意指向的,并不是Google所为。当然这只是个玩笑,但是如果被人恶意用别的域名解析到你的IP的话,那么你的网站就能通过别人的域名来访问了。接下来会发生什么?假如那域名是不友善的域名,比如曾经指向非法网站,容易引发搜索引擎惩罚,连带IP受到牵连。即使域名没什么问题,但流量也会被劫持到别的域名,从而遭到广告联盟的封杀。
禁止直接通过IP访问网站
如何解决这个问题?最直接的方法是让用户只能通过域名来访问网站,而不能通过IP来直接访问。
这个可以修改Apache配置文件httpd.conf来实现,下面是米扑博客的实现:(实测不可行)
vim /etc/httpd/conf/httpd.conf
NameVirtualHost 115.29.237.28 # 拒绝直接使用IP(115.29.237.28)访问 <VirtualHost 115.29.237.28> ServerName 115.29.237.28 <Location /> Order Allow,Deny Deny from all </Location> </VirtualHost> # 把IP(115.29.237.28)访问定向到域名访问 <VirtualHost 115.29.237.28> DocumentRoot /var/www/blog/ ServerName blog.mimvp.com </VirtualHost> # 把IP(115.29.237.28)访问定向到顶级域名访问 <VirtualHost 115.29.237.28> DocumentRoot /var/www/blog/ ServerName mimvp.com </VirtualHost> # 把IP(115.29.237.28)访问定向到特定目录 <VirtualHost 115.29.237.28> DocumentRoot /var/www/deny/ ServerName 115.29.237.28 </VirtualHost>
第一部分代码是实现拒绝直接通过 115.29.237.28 这个IP的任何访问请求,这时如果你用 115.29.237.28 访问,会跳转到拒绝页面,提示拒绝访问。
第二部分代码就是允许通过 blog.mimvp.com 这个域名访问,主目录指向 /var/www/blog/ (这里服务器OS是 CentOS)
第三部分代码是允许 mimvp.com 的顶级域名访问。
第四部分代码是把通过 115.29.237.28 这个IP的任何访问请求,定向到特定目录,放置一个自定义index.php页面,提示用户不让IP直接访问。
经过实测,以上方法并不可行,因为 httpd.conf 无法解析IP,因此需要换一种思路,最终成功解决方案请见下文
禁止通过 IP 访问网站
# deny access from ip
<VirtualHost *:80>
ServerName 47.106.126.167
<Location />
Order Allow,Deny
Deny from all
</Location>
</VirtualHost>
修改实际不多,如红色字体,不指定具体IP,而是模糊匹配 VirtualHost *:80
若是IP地址,则匹配到了 ServerName 47.106.126.167 ,然后禁止此IP访问
效果图如下图:
强制通过IP访问进行跳转 (推荐方案)
# rewrite ip to domain
<VirtualHost *:80>
ServerName 47.106.126.167
RewriteEngine on
RewriteRule ^(.*) https://blog.mimvp.com [R=permanent,L]
</VirtualHost>
修改实际也不多,如红色字体,不指定具体IP,而是模糊匹配 VirtualHost *:80
若是IP地址,则匹配到了 ServerName 47.106.126.167 ,然后进行强制重写跳转到 https://blog.mimvp.com
效果图如下图:
通过 IP 47.106.126.167 永久强制跳转到了 https://blog.mimvp.com
至此,完美解决了通过IP访问,直接跳转到目标网址,IP转域名访问!
封禁某些IP访问/只允许某些IP访问网站
如果要控制禁止某些非法IP访问,在Directory选项控制:
<Directory "/var/www"> # Options Indexes FollowSymLinks Options FollowSymLinks # 禁用Indexes,防止根目录泄露 AllowOverride All # Controls who can get stuff from this server. Order allow,deny Allow from all Deny from 10.0.0.1 # 阻止一个IP Deny from 192.168.0.0/24 # 阻止一个IP段 </Directory>
只允许某些IP访问,适合允许内部或者合作公司访问:
<Directory "/var/www"> # Options Indexes FollowSymLinks Options FollowSymLinks # 禁用Indexes,防止根目录泄露 AllowOverride All # Controls who can get stuff from this server. Order deny,allow Deny from all Allow from example.com # 允许某个域名 Allow from 10.0.0.1 # 允许一个iP Allow from 10.0.0.1 10.0.0.2 # 允许多个iP Allow from 10.1.0.0/255.255.0.0 # 允许一个IP段,掩码对 Allow from 10.0.1 192.168 # 允许一个IP段,后面不填写 Allow from 192.168.0.0/24 # 允许一个IP段,网络号 </Directory>
禁止或允许某些IP访问,也可以从外部文件引入
1) 添加引入文件到 httpd.conf
Include block_ip_demo.con[f]
Include block_ip_blog.con[f]
2)把禁止或允许IP添加到配置文件
本文米扑博客以禁止IP访问为例
cat /etc/httpd/conf/block_ip_demo.conf
deny from 117.131.216.197
deny from 119.44.13.93
deny from 113.222.238.160
方法跟httpd.conf直接禁止IP类似,只是在禁止IP量很大(如1000个、10000个)时,引入一个外部的conf配置文件管理会更方便、简洁
配置好 httpd.conf 文件后,需要重启Apache,才能生效
/etc/init.d/httpd restart
参考推荐:
Apache设置禁止访问网站目录 (推荐)
Apache 实现https+Apache http访问转到https
版权所有: 本文系米扑博客原创、转载、摘录,或修订后发表,最后更新于 2018-08-19 10:50:33
侵权处理: 本个人博客,不盈利,若侵犯了您的作品权,请联系博主删除,莫恶意,索钱财,感谢!
转载注明: Apache 封禁IP及IP段访问 (米扑博客)