Linux Firewall 設定

iptablesでFirewallを実装

Firewall専用機でフィルタリングや不正アクセスに対応しているのだが、あまりに煩い奴がいるので、ブラックリストを用意して、明示的にフィルタリングしてやろうと設定を行った。ここでは、ファイアーウォールのログに残されているアタックしてきたサイトからのパケットを落とすだけで、iptablesのみでファイアーウォールを作成するわけではありません。

Debian/GNU Linuxの初期状態

iptables -L

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain 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