SEO対策とセキュリティで企業をバックアップします。

ITエンジニアの技術力UPをお約束します。

DoS攻撃激減。 python3.5でiptablesの国内IPのみの接続ルールを生成&適用。

DoS攻撃激減。 python3.5でiptablesの国内IPのみの接続ルールを生成&適用。


pythonでiptables向けにAPNICが管理しているIP割当ブロック情報から国内IPアドレスの最新情報を集め、自動で追加するプログラムを昨年の夏頃作ったのですが、pythonの環境やライブラリーバージョンが現状と合わなくなってきたので再度作りなおししました。python3.5で動作しました。追加したルールが保存されるように「service iptables save」を実行してください。(Redhat6.x,CentOS6.x系 CentOS7でもiptablesに切り替えで使えます)

2018/6/2 SCRIPTコードを改定しました。

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のルールを保存しましょう。

(root)> python  jponly.py
(root)> service iptables save

再度ルールを実行したい場合は全ルールを破棄します。iptablesを-Fオプションで実行すると全クリアになります。

(root)> iptables -F

タグ: , , , ,