使用redis來調用iptables,封禁惡意IP

話很少說,一般大多數站點都會有被薅羊毛的狀況,防禦無非也就是業務層作處理,短時內再也不響應惡意請求啦.雖然不響應了,可仍是會消耗資源的,好比我要從數據庫(固然也多是內存數據庫)去查詢下,你是否是惡意的IP. 那麼可否網絡層或應用層去處理呢?在前幾篇文章有寫過應用層方案,今天就寫下網絡層方法.git

提及iptables 除非是專業人員,像普通開發者是不會使用的,一堆表一堆鏈的一看就頭疼.因此**RedisPushIptables**就應時而生,開發者不須爲iptables複雜語法頭疼,只須要像使用redis那樣簡單,就可以使用iptables來阻擋惡意IP地址.github

RedisPushIptables是一個redis模塊,用於更新防火牆規則,以在指定的時間內拒絕IP地址或永久拒絕。比fail2ban更好用點,不到400行代碼實現.適用任意業務,API調用,不須要分析應用日誌,業務主動調用,缺點是要手動編碼.不適用普通使用者.redis

該模塊能夠經過 redis 來操做 iptables 的 filter表INPUT鏈規則的增長和刪除,能夠用來動態調用防火牆。好比用來防護攻擊。數據庫

可是前提要以 root 來運行,由於 iptables 須要 root 權限。bash

#1: Compile hiredis
    cd redis-4.0**version**/deps/hiredis
    make 
    make install 
    
  #2: git clone  https://github.com/limithit/RedisPushIptables.git
    cd RedisPushIptables
    make 


加載模塊
MODULE LOAD /path/to/iptablespush.so

語法
accept.insert - Filter table INPUT ADD ACCEPT
accept.delete - Filter table INPUT DEL ACCEPT
drop.insert - Filter table INPUT ADD DROP
drop.delete - Filter table INPUT DEL DROP
ttl.drop.insert - Dynamic delete filter table INPUT ADD DROP

127.0.0.1:6379>accept.insert 192.168.188.8
(integer) 13
127.0.0.1:6379>accept.delete 192.168.188.8
(integer) 13
127.0.0.1:6379>drop.delete 192.168.188.8
(integer) 13
127.0.0.1:6379>drop.insert 192.168.188.8
(integer) 13
127.0.0.1:6379>ttl.drop.insert 192.168.188.8 60
(integer) 13
root@debian:~# iptables -L -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
DROP       all  --  192.168.188.8        0.0.0.0/0 
ACCEPT       all  --  192.168.188.8        0.0.0.0/0

iptables 動態刪除配置網絡

默認狀況下,禁用鍵空間事件通知,雖然不太明智,但該功能會使用一些CPU。使用redis.confnotify-keyspace-eventsCONFIG SET啓用通知。將參數設置爲空字符串會禁用通知。爲了啓用該功能,使用了一個非空字符串,由多個字符組成,其中每一個字符都具備特殊含義,以下表所示:運維

K Keyspace事件,使用keyspace @前綴發佈。E Keyevent事件,使用keyevent @前綴發佈。g通用命令(非類型特定),如DELEXPIRERENAME... $ String命令l列表命令設置命令h哈希命令z排序的設置命令x過時事件(每次鍵到期時生成的事件)e被驅逐的事件(爲maxmemory驅逐密鑰時生成的事件)g$lshzxe的別名,「AKE」字符串表示全部事件。編碼

字符串中至少應存在KE,不然不管字符串的其他部分如何都不會傳遞任何事件。例如,只爲列表啓用鍵空間事件,配置參數必須設置爲Kl,依此類推。字符串KEA可用於啓用每一個可能的事件。spa

# redis-cli config set notify-keyspace-events Ex
也可使用如下redis.conf配置指令加載模塊:

notify-keyspace-events Ex
#notify-keyspace-events ""  #註釋掉這行

使用root用戶運行ttl_iptables守護程序

root@debian:~/RedisPushIptables# ./ttl_iptables
日誌在/var/log/ttl_iptables.log中查看

root@debian:~# redis-cli TTL.DROP.INSERT 192.168.18.5 60  
(integer) 12
root@debian:~# date
Fri Mar 15 09:38:49 CST 2019    
root@debian:~# iptables -L -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
DROP       all  --  192.168.18.5        0.0.0.0/0 
root@debian:~/RedisPushIptables# tail -f /var/log/ttl_iptables.log 
pid=5670 03/15-09:39:48 iptables -D INPUT -s 192.168.18.5 -j DROP
root@debian:~# iptables -L INPUT -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination

今後普通開發也能像運維那樣,使用防火牆了.其實我不擅長寫做,大夥湊合看吧,就這麼多。日誌

相關文章
相關標籤/搜索