提防壞人:Nginx 拒絕指定IP訪問
導讀 | 閒來無事,登陸伺服器,發現有個IP不斷的猜測路徑、試圖往伺服器上傳檔案(木馬)。 |
於是查看了之前的日誌,無奈鄙站被攻擊者盯上了,不斷的有不同的IP試圖上傳木馬。看來壞人還是有的。由於不想讓鄙站淪為肉雞,所以就想寫個簡單的指令碼,來阻止攻擊者的IP訪問。
攻擊者:
195.154.216.165 - - [28/Nov/2015:23:10:40 +0800] "POST /wp-content/themes/twentyten/404.php HTTP/1.1" 404 27 "http://www.z-dig.com/11m.php" "Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1)" "-" 195.154.216.165 - - [28/Nov/2015:23:10:40 +0800] "POST /wp-content/themes/twentythirteen/404.php HTTP/1.1" 404 27 "http://www.z-dig.com/11m.php" "Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1)" "-" 195.154.216.165 - - [28/Nov/2015:23:10:40 +0800] "POST /wp-content/themes/twentytwelve/404.php HTTP/1.1" 404 27 "http://www.z-dig.com/11m.php" "Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1)" "-" 195.154.216.165 - - [28/Nov/2015:23:10:40 +0800] "POST /wp-content/uploads/phptest.php HTTP/1.1" 404 27 "http://www.z-dig.com/11m.php" "Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1)" "-" 195.154.216.165 - - [28/Nov/2015:23:10:41 +0800] "POST /xyr/confings.asp HTTP/1.1" 404 1569 "http://www.z-dig.com/11m.php" "Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1)" "-" 195.154.216.165 - - [28/Nov/2015:23:10:41 +0800] "POST /xz.asp;.jpg HTTP/1.1" 404 564 "http://www.z-dig.com/11m.php" "Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1)" "-" 195.154.216.165 - - [28/Nov/2015:23:10:41 +0800] "POST /yanyu/?q={${eval%28$_POST[u]%29}} HTTP/1.1" 404 1569 "http://www.z-dig.com/11m.php" "Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1)" "-" 195.154.216.165 - - [28/Nov/2015:23:10:42 +0800] "POST /ztxxw/Images/images.asp HTTP/1.1" 404 1569 "http://www.z-dig.com/11m.php" "Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1)" "-"
[[email protected] www]# grep '195.154.216.165' 2015-11-28.access.log|wc -l [[email protected] www]#
[[email protected] www]# curl ipinfo.io/195.154.216.165;echo'' { "ip": "195.154.216.165", "hostname": "fr.07.gs", "city": "", "region": "", "country": "FR", "loc": "48.8600,2.3500", "org": "AS12876 ONLINE S.A.S." } [[email protected] www]#
法國的哥們竟然試了180多次!辛苦了。
用 shell 和定時任務來實現吧。>_<
網站跑在 Nginx 上,所以可以使用 Nginx 的 Deny 來拒絕攻擊者的IP訪問。
那麼思路就出來了,定期(五分鐘或十分鐘)獲取攻擊者的IP,將IP放入到黑名單(Nginx 配置檔案),並 reload 使其生效。
由於前期規劃的比較好,網站的訪問日誌放在了一個指定的目錄,Nginx 的錯誤日誌也放在了一個指定的目錄。網站的訪問日誌每日進行切割。Nginx 的錯誤日誌沒有進行切割。
下面就是我的思路和操作步驟:
通過 Nginx 的錯誤日誌(為什麼不使用訪問日誌)來獲取攻擊者的IP。之前沒有對 Nginx 的錯誤日誌進行定時切割,為了方便統計攻擊者的IP所以,編寫指令碼並加入定時任務,使錯誤日誌每小時切割一次,並且每小時對黑名單檔案進行清空。
錯誤日誌切割、清空黑名單指令碼:
[[email protected] scripts]# cat rotate-nginx-error-logs.sh #!/bin/bash # Rotate nginx error logs and clean block ip 's configure file # Nginx pid file : /application/nginx/logs/nginx.pid # Nginx error logs directory : /data/logs/nginx # Block Ip 's configure file : /application/nginx/conf/website/blockip.conf # Default log name : error.log # Author : Mr.Zhou # E-mail : [email protected] NGX_PID=/application/nginx/logs/nginx.pid NGINX_CMD=/application/nginx/sbin/nginx LOGS_DIR=/data/logs/nginx LOG_NAME=error.log BLOCK_IP_FILE=/application/nginx/conf/website/blockip.conf cd $LOGS_DIR && /usr/bin/rename $LOG_NAME $(/bin/date +%F-%H -d "last hour").$LOG_NAME $LOG_NAME && /bin/kill -USR1 $(cat $NGX_PID) >$BLOCK_IP_FILE && $($NGINX_CMD -s reload) [[email protected] scripts]#
獲取攻擊者IP指令碼:
該指令碼從 Nginx 的錯誤日誌中統計出超過20次試圖猜測路徑或上傳檔案的IP,並將這些IP加入到 Nginx 的配置檔案。若有新增加的IP則 reload Nginx 使配置檔案生效,若沒有新增IP則不進行reload。
[[email protected] scripts]# cat block-ip.sh #!/bin/bash # Author : Mr.Zhou # Email : [email protected] # Website : http://www.z-dig.com # block ip ERR_LOG=/data/logs/nginx/error.log BLOCK_IP_FILE=/application/nginx/conf/website/blockip.conf BLOCKED_IP=/dev/shm/blocked-ip.txt BLOCK_IP=/dev/shm/block-ip.txt NGINX_CMD=/application/nginx/sbin/nginx /bin/cp $BLOCK_IP_FILE $BLOCKED_IP && /bin/sed -nr 's#.*[^0-9](([0-9]+\.){3}[0-9]+).*#\1#p' $ERR_LOG |/bin/awk '{IP[$1]++}END{for (i in IP) print IP[i],i}'|/bin/awk '{if($1>20)print "deny "$2";"}' >$BLOCK_IP && /bin/grep -v -f $BLOCK_IP_FILE $BLOCK_IP >>$BLOCK_IP_FILE && $($NGINX_CMD -s reload) [[email protected] scripts]#
將拒絕指定IP訪問的配置檔案(黑名單)單獨存放,並在 nginx 主配置檔案中 include 進去。
[[email protected] conf]# grep blockip.conf nginx.conf include website/blockip.conf; [[email protected] conf]#
blockip.conf 檔案格式如下:
[[email protected] website]# cat blockip.conf deny 195.154.211.220; deny 195.154.188.28; deny 195.154.188.186; deny 180.97.106.161; deny 180.97.106.162; deny 180.97.106.36; deny 195.154.180.69; deny 195.154.211.26; deny 221.229.166.247; deny 180.97.106.37; deny 195.154.216.164; deny 195.154.216.165; [[email protected] website]#
將指令碼放入定時任務執行:
每小時對 Nginx 的錯誤日誌進行切割並且清空一次被拒絕訪問IP的配置檔案,若不清空的話,此IP將終生不能訪問,若它再次攻擊則會再次進入黑名單,>_<。 清空命令放在了切割指令碼的尾部。
可以自己決定統計頻率,根據指定的頻率執行指令碼,獲取攻擊者的IP,若此IP已經在黑名單中,則會忽略掉(由於錯誤日誌一小時切割一次,所以在一小時內會出現重複的IP)。然後把剩下的新攻擊者的IP追加到黑名單。並 reload Nginx 。若沒有新增的攻擊者IP則什麼都不做。
[[email protected] ~]# crontab -l # rotate nginx log everyday 00 00 * * * /bin/bash /application/scripts/rotate-nginx-logs.sh &>/dev/null # rotate nginx error log every hour and clean the block ip file 00 */1 * * * /bin/bash /application/scripts/rotate-nginx-error-logs.sh &>/dev/null # check hacker's ip every ten minutes */10 * * * * /bin/bash /application/scripts/block-ip.sh &>/dev/null [[email protected] ~]#
以下是指令碼執行一段時間的攻擊者IP
[[email protected] ~]# cat /application/nginx/conf/website/blockip.conf deny 195.154.211.220; deny 195.154.188.28; deny 195.154.188.186; deny 180.97.106.161; deny 180.97.106.162; deny 180.97.106.36; deny 195.154.180.69; deny 195.154.211.26; deny 221.229.166.247; deny 180.97.106.37; deny 195.154.216.164; deny 195.154.216.165; [[email protected] ~]#
過段時間,再列出一份黑名單IP,看是否有變化。
[[email protected] ~]# cat /application/nginx/conf/website/blockip.conf deny 195.154.188.224; [[email protected] ~]# curl ipinfo.io/195.154.188.224;echo '' { "ip": "195.154.188.224", "hostname": "195-154-188-224.rev.poneytelecom.eu", "city": "", "region": "", "country": "FR", "loc": "48.8600,2.3500", "org": "AS12876 ONLINE S.A.S." } [[email protected] ~]# grep '195.154.188.224' /data/logs/nginx/error.log |wc -l [[email protected] ~]# grep '195.154.188.224' /data/logs/nginx/error.log |grep -v 'access forbidden' |wc -l [[email protected] ~]# [[email protected] ~]# tail -n 1 /data/logs/nginx/error.log 2015/11/30 10:47:53 [error] 30754#0: *37828 access forbidden by rule, client: 195.154.188.224, server: www.z-dig.com, request: "GET / HTTP/1.1", host: "www.z-dig.com", referrer: "http://www.z-dig.com" [[email protected] ~]#
看來多少還是管點用的。一共 access forbidden by rule 了 102-24=78 次。
適當的改改指令碼,儲存黑名單的歷史資料,定期將大於1000的IP直接放入iptables!
相關推薦
提防壞人:Nginx 拒絕指定IP訪問
導讀 閒來無事,登陸伺服器,發現有個IP不斷的猜測路徑、試圖往伺服器上傳檔案(木馬)。 於是查看了之前的日誌,無奈鄙站被攻擊者盯上了,不斷的有不同的IP試圖上傳木馬。看來壞人還是有的。由於不想讓鄙站淪為肉雞,所以就想寫個簡單的指令碼,來阻止攻擊者的IP訪問。 攻擊者:
Nginx如何設定拒絕或允許指定ip訪問
nginx拒絕或允許指定IP,是使用模組HTTP訪問控制模組(HTTP Access). 控制規則按照宣告的順序進行檢查,首條匹配IP的訪問規則將被啟用。 location / { deny 192.168.1.1; allow 192.168.1.0/
Linux防火墻限制指定port僅僅能由指定IP訪問
端口 state article name dsm ack 防火墻 dport 公司 須要對redis的端口做限制,僅僅能讓公司內指定IP的機器訪問 -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACC
nginx禁止特定IP訪問
nginx在server段添加一些代碼if ( $http_clientip = 106.120.173.120 ) { return 403;}如果使用反向代理,使用deny禁止ip訪問不會生效。參考博文:https://www.cnblogs.com/saneri/p/6257188.htmlngin
阿裏雲設置指定ip訪問實例
itl 設置 1.0 所有 image nbsp aliyun ali doc 添加安全組規則 添加允許訪問的外網IP,優先級設置為1,並將所有ip設置為拒絕訪問,優先級設置為2。 參考地址: https://help.aliyun.com/
BIEE遷移過後,在設置用戶登錄默認頁時報錯:已拒絕用戶訪問路徑/user/......
拒絕 icon .com data data- gif class biee loading BIEE遷移過後,在設置用戶登錄默認頁時報錯:已拒絕用戶訪問路徑/user/......
iptables只允許指定ip訪問本機的指定埠
檢視埠情況 1.netstat -ntpl 2.iptables -F 清除預設表filter中的所有規則鏈的規則 3.iptables -X 清除預設表filter中使用者自定鏈中的規則 4.ipt
mysql設定指定ip訪問,使用者許可權相關操作
基礎語法 GRANT priv_type ON database.table TO user[IDENTIFIED BY [PASSWORD] 'password'] [,user [IDENTIFIED BY [PASSWORD] 'password']
授權指定ip訪問mysql 伺服器
授權指定ip訪問訪問 授權ROOT使用密碼1234從應用伺服器主機連線到mysql伺服器 mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'xxx.xx
windows防火牆安全設定指定ip訪問指定埠
場景摘要: 1、我有三臺騰訊雲伺服器 2、我日常辦公網路的ip換了 3、我在騰訊雲上面改了安全規則,也不能訪問我A伺服器的21,1433等埠 4、開始我以為是辦公網路的安全設定問題 5、我進B伺服器去走測A伺服器也不通,有點懷疑是騰訊雲網絡規則的問題,但覺得不科學
nginx限制每個ip訪問的頻率和併發量
http{ ... limit_req_zone$binary_remote_addr zone=allips:10m rate=20r/s; 解釋:#定義一個名為allips的limit_req_zone用來儲存session,大小是10M記憶體,
Linux 防火牆設定指定 IP 訪問
1.修改防火牆配置 vi /etc/sysconfig/iptables 新增以下內容:-A INPUT -i eth0 -s 192.168.0.1 -p tcp -j ACCEPT -A INPUT -i eth0 -s 192.168.0.2 -p tcp -j A
Linux防火牆限制指定埠只能由指定IP訪問
需要對redis的埠做限制,只能讓公司內指定IP的機器訪問-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT -A INPU
記一次主機入侵攻防大戰:firewalld防火牆指定的IP段的埠訪問控制
一、背景 一大早來公司,登入那臺暴露在外網的伺服器,登入成功的時候,看到160000+次登入失敗的記錄,看到這個我和我的小夥伴們都驚呆了,是誰那麼執著?小夥伴還開玩笑說是不是誰跟你有世仇啊,這麼搞你!來活了,我的伺服器我做主,搞起,who怕who? 二、
Nginx限制IP訪問及獲取客戶端realip實戰
org 編譯安裝nginx .org 編譯安裝 rem blog 標簽 技術 code 做網站時經常會用到remote_addr和x_forwarded_for這兩個頭信息來獲取客戶端的IP,然而當有反向代理或者CDN的情況下,這兩個值就不夠準確了,需要調整一些配置
Nginx 禁止IP訪問 只允許域名訪問
nginx 禁止ip訪問 只允許域名訪問今天要在Nginx上設置禁止通過IP訪問服務器,只能通過域名訪問,這樣做是為了避免別人把未備案的域名解析到自己的服務器IP而導致服務器被斷網,從網絡上搜到以下解決方案我們在使用的時候會遇到很多的惡意IP攻擊,這個時候就要用到Nginx 禁止IP訪問了。下面我們就先看看N
使用awk統nginx日誌文件ip訪問站點次數
nginx web ip次數 awk | 表示分隔符,$4表示第四列awk -F"|" ‘{count[$4]++}END{for (ip in count) {printf "%-20s:%d\n",ip,count[ip]}}‘ access_log本文出自 “Linux 系統運維” 博
Nginx實現基於ip的訪問控制(Ngx_http_access_module模塊)
nginx;web服務器;Nginx實現基於ip的訪問控制功能:(Ngx_http_access_module)官方文檔:http://nginx.org/en/docs/http/ngx_http_access_module.html官方示例:The ngx_http_access_module modul
限制指定機器IP訪問oracle數據庫
oracle安全通過使用數據庫服務器端的sqlnet.ora文件可以實現禁止指定IP主機訪問數據庫的功能,這對於提升數據庫的安全性有很大的幫助,與此同時,這個技術為我們管理和約束數據庫訪問控制提供了有效的手段。下面是實現這個目的的具體步驟僅供參考:1.默認的服務器端sqlnet.ora文件的內容# sqlne
Nginx指定IP無須通過認證
nginx 認證 為了保證網站的安全性,我們一般都限制IP訪問,但是這種方法又不靈活,使用VPN又太復雜,那麽可以通過再增加一道認證來提升安全性。需求: 指定IP直接訪問,否則增加二次認證server { listen 0.0.0.0:80; server_name