iptablesでFirewallを実装
Firewall専用機でフィルタリングや不正アクセスに対応しているのだが、あまりに煩い奴がいるので、ブラックリストを用意して、明示的にフィルタリングしてやろうと設定を行った。ここでは、ファイアーウォールのログに残されているアタックしてきたサイトからのパケットを落とすだけで、iptablesのみでファイアーウォールを作成するわけではありません。
Debian/GNU Linuxの初期状態
iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destinationChain FORWARD (policy ACCEPT)
target prot opt source destinationChain OUTPUT (policy ACCEPT)
target prot opt source destination
Black list作成ツールをインストールする。
apt install ipset
IPベースのブラックリストを作成
ipset create blacklist hash:ip hashsize 4096
ネットワークベースのブラックリストの場合には、
ipset create blacklist hash:net hashsize 4096
ブラックリストにマッチしたパケットをDROPする。
iptables -I INPUT -m set --match-set blacklist src -j DROP iptables -I FORWARD -m set --match-set blacklist src -j DROP
ブラクリストにDROP対象のホスト・ネットワークを追加する。
ipset add blacklist xxx.xxx.xxx.xxx/yyy
iptables-persistent、ipset-persistentでipset、iptablesを情報を永続化し、起動時に読み込む。
apt install ipset-persistent
apt install iptables-persistent
netfilterサービスを有効にする。これで、ipset、iptablesをシステム終了時にセーブ、起動時にロードする。
systemctl enable netfilter-persistent
手動で、ルールを保存する。
netfilter-persistent save
run-parts: executing /usr/share/netfilter-persistent/plugins.d/10-ipset save
run-parts: executing /usr/share/netfilter-persistent/plugins.d/15-ip4tables save
# Warning: iptables-legacy tables present, use iptables-legacy-save to see them
run-parts: executing /usr/share/netfilter-persistent/plugins.d/25-ip6tables save
# Warning: ip6tables-legacy tables present, use ip6tables-legacy-save to see them
run-parts: executing /usr/share/netfilter-persistent/plugins.d/40-ipset save
ipsetのルールをファイルに保存する。
ipset -file /etc/iptables/ipset save
IPv6対応
ipset create blacklist6 hash:net hashsize 4096 family inet ip6tables -I INPUT -m set --match-set blacklist6 src -j DROP
内容変更の場合
ブラックリストを削除
ipset destroy blacklist
ブラックリストからエントリーを削除するには
del blacklist ENTRY
ログ内容から、ブラックリストに動的にエントリーを追加
例) mail.logから外部からのAuth失敗したIPアドレスを検索し、ipsetを使用してブラックリストに追加する例です。ローカルアドレスは除外します。
for i in `grep warning /var/log/mail.log | grep "authentication failed" | grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | grep -v '^192\.168\.' | uniq`; do ipset add blacklist $i/32 -q; done