以前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
設定の作成
通常の使い方であれば、ポリシーはINPUTをDROPにして必要なものだけ許可、OUTPUTはACCEPT、FORWARDは特に使わないので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。
コメント