DoS攻撃激減。 python3.5でiptablesの国内IPのみの接続ルールを生成&適用。
2018年6月2日Security Tips, セキュリティ日記, トピックス, ノウハウ
pythonでiptables向けにAPNICが管理しているIP割当ブロック情報から国内IPアドレスの最新情報を集め、自動で追加するプログラムを昨年の夏頃作ったのですが、pythonの環境やライブラリーバージョンが現状と合わなくなってきたので再度作りなおししました。python3.5で動作しました。追加したルールが保存されるように「service iptables save」を実行してください。(Redhat6.x,CentOS6.x系 CentOS7でもiptablesに切り替えで使えます)
2018/6/2 SCRIPTコードを改定しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
import urllib3 from math import log import sys,subprocess as cmd http=urllib3.PoolManager() def jpout(fd,line): if 'apnic|JP|ipv4' in line: ipaddr = line.split('|')[3] netmask = 32 - log( int( line.split('|')[4]) , 2) fd.write("{0}/{1}\n".format(ipaddr,int(netmask))) def allow_ip(line): line = line.strip() #改行コードを抜く cmd.call("iptables -A INPUT -s {0} -p tcp -m multiport --dports 80,110,143,443,993,995 -j ACCEPT ".format(line),shell=True) if __name__ == '__main__': response = http.request('GET','http://ftp.apnic.net/stats/apnic/delegated-apnic-latest') with open('jpallow.dat','w') as fd: [ jpout(fd,line) for line in response.data.decode('utf-8').split('\n') ] try: with open('jpallow.dat','r') as fd: fd_lines = fd.readlines() except IOError: print("Something went wrong.") for src in fd_lines: allow_ip(src) #ipatblesへ日本国内IPリストを適用 |
実行する。
非常にデータが大きいため処理に時間がかかります。実行後はiptablesのルールを保存しましょう。
1 2 |
(root)> python jponly.py (root)> service iptables save |
再度ルールを実行したい場合は全ルールを破棄します。iptablesを-Fオプションで実行すると全クリアになります。
1 |
(root)> iptables -F |