Debianでiptablesを使う

以前ufwを使ったファイアウォールの設定はやっているが、LightsailのDebianインスタンスにiptablesが入っていたので使ってみた。
AWSではLightsailファイアウォールとOSレベルのファイアウォールの両方をかけることを推奨している

IPv4ではiptables、IPv6ではip6tablesコマンドを使用する。

次のコマンドで現在の設定を表示する。

sudo 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 

設定の作成

通常の使い方であれば、ポリシーはINPUTDROPにして必要なものだけ許可、OUTPUTACCEPTFORWARDは特に使わないのでDROPに設定すればいいと思う。

ここで絶対にいきなりiptables -P INPUT DROPとかしてはいけない。
自分はバカなので打った瞬間即設定が反映されることを知らずにSSH締め出された。
まぁ、まだ設定保存されていないのでインスタンス再起動すれば復活できるのだけど。

結局一個一個設定するよりシェルスクリプトにして一気に行ったほうがいいかと思い、作った。
内容はさくらインターネットが紹介しているものをそのまま参考にしている。

#!/bin/bash

# 設定をクリア
iptables -F
iptables -X

# (1) ポリシーの設定 OUTPUTのみACCEPTにする
iptables -P INPUT   DROP
iptables -P FORWARD DROP
iptables -P OUTPUT  ACCEPT

# (2) ループバック(自分自身からの通信)を許可する
iptables -A INPUT -i lo -j ACCEPT

# (3) データを持たないパケットの接続を破棄する
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP

# (4) SYNflood攻撃と思われる接続を破棄する
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP

# (5) ステルススキャンと思われる接続を破棄する
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP

# (6) icmp(ping)の設定
# hashlimitを使う
# -m hashlimit                   hashlimitモジュールを使用する
# —hashlimit-name t_icmp  記録するファイル名
# —hashlimit 1/m               リミット時には1分間に1パケットを上限とする
# —hashlimit-burst 10        規定時間内に10パケット受信すればリミットを有効にする
# —hashlimit-mode srcip    ソースIPを元にアクセスを制限する
# —hashlimit-htable-expire 120000   リミットの有効期間。単位はms
iptables -A INPUT -p icmp --icmp-type echo-request -m hashlimit --hashlimit-name t_icmp --hashlimit 1/m --hashlimit-burst 10 --hashlimit-mode srcip --hashlimit-htable-expire 120000 -j ACCEPT

# (7) 確立済みの通信は、ポート番号に関係なく許可する
iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT

# (8) 任意へのDNSアクセスの戻りパケットを受け付ける
iptables -A INPUT -p udp --sport 53 -j ACCEPT

# (9) SSHを許可する設定
# hashlimitを使う
# -m hashlimit                   hashlimitモジュールを使用する
# —hashlimit-name t_sshd 記録するファイル名
# —hashlimit 1/m              リミット時には1分間に1パケットを上限とする
# —hashlimit-burst 10       規定時間内に10パケット受信すればリミットを有効にする
# —hashlimit-mode srcip   ソースIPを元にアクセスを制限する
# —hashlimit-htable-expire 120000   リミットの有効期間。単位はms
iptables -A INPUT -p tcp -m state --syn --state NEW --dport 22 -m hashlimit --hashlimit-name t_sshd --hashlimit 1/m --hashlimit-burst 10 --hashlimit-mode srcip --hashlimit-htable-expire 120000 -j ACCEPT

# (10) 個別に許可するプロトコルとポートをここに書き込む。
# この例では、HTTP(TCP 80)とHTTPS(TCP 443)を許可している。
iptables -A INPUT -p tcp --dport 80   -j ACCEPT
iptables -A INPUT -p tcp --dport 443  -j ACCEPT

chmodしてから実行

chmod 700 firewall.sh
sudo ./firewall.sh

設定の保存

さっきも言った通りこのままインスタンスを再起動すると設定は元に戻ってしまう。
Debianではiptables-persistentの使用を推奨している。

sudo apt install iptables-persistent

インストールすると自動的にウィザードが始まるので、指示に従って進めればOK。

参考

関連記事

コメント

この記事へのコメントはありません。

TOP