話很少說,一般大多數站點都會有被薅羊毛的狀況,防禦無非也就是業務層作處理,短時內再也不響應惡意請求啦.雖然不響應了,可仍是會消耗資源的,好比我要從數據庫(固然也多是內存數據庫)去查詢下,你是否是惡意的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.conf的notify-keyspace-events或CONFIG SET啓用通知。將參數設置爲空字符串會禁用通知。爲了啓用該功能,使用了一個非空字符串,由多個字符組成,其中每一個字符都具備特殊含義,以下表所示:運維
K Keyspace事件,使用keyspace @前綴發佈。E Keyevent事件,使用keyevent @前綴發佈。g通用命令(非類型特定),如DEL,EXPIRE,RENAME,... $ String命令l列表命令設置命令h哈希命令z排序的設置命令x過時事件(每次鍵到期時生成的事件)e被驅逐的事件(爲maxmemory驅逐密鑰時生成的事件)g$lshzxe的別名,「AKE」字符串表示全部事件。編碼
字符串中至少應存在K或E,不然不管字符串的其他部分如何都不會傳遞任何事件。例如,只爲列表啓用鍵空間事件,配置參數必須設置爲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
今後普通開發也能像運維那樣,使用防火牆了.其實我不擅長寫做,大夥湊合看吧,就這麼多。日誌