Overview
シェルスクリプトを使用して iptables を設定します。久しぶりに iptables をスクリプト化しましたが、最低限の内容でかなりシンプルになったと思います。シンブルなサーバーであれば大体のケースに適合すると思います。
- IPv6 に対応しています。
- 1NIC のシステム用となりますので、インターフェイス指定の必要がありません。
- デフォルトの INPUT, FORWARD は DROP、OUTPUT は ACCEPT です。
- 適用するルールは全て個別のチェインを作成してモジュール化しています。
- INPUT に対して、lo は全て許可、RELATED,ESTABLISHED は全て許可、ICMP v4/v6 を全て許可、管理セグメントからのアクセスを全て許可としています。
- 公開するサービスのポート番号を public_port 変数にカンマ区切りで記載します。このポートはスクリプトの簡略化の為、TCP, UDP で許可されます。
Contents
シェルスクリプトは下記の通りです。IPv4/IPv6 は基本的に同じルールになる為、for, case を使用してできるだけ処理を合わせています。
#!/bin/bash
mgmt_ipv4="10.0.0.0/18"
mgmt_ipv6="fd00:0000:0000:0000:0000:0000:0a00:0000/114"
public_port="53"
for cmd in iptables ip6tables; do
${cmd} -P INPUT DROP
${cmd} -P FORWARD DROP
${cmd} -P OUTPUT ACCEPT
${cmd} -F
${cmd} -X
${cmd} -Z
for table in filter nat mangle; do
${cmd} -t ${table} -F
${cmd} -t ${table} -X
${cmd} -t ${table} -Z
done
${cmd} -N BASIC
${cmd} -A BASIC -i lo -j ACCEPT
${cmd} -A BASIC -m state --state RELATED,ESTABLISHED -j ACCEPT
${cmd} -N ICMP
case ${cmd} in
"iptables" ) ${cmd} -A ICMP -p icmp -j ACCEPT ;;
"ip6tables" ) ${cmd} -A ICMP -p ipv6-icmp -j ACCEPT ;;
esac
${cmd} -N MGMT
case ${cmd} in
"iptables" ) ${cmd} -A MGMT -s ${mgmt_ipv4} -j ACCEPT ;;
"ip6tables" ) ${cmd} -A MGMT -s ${mgmt_ipv6} -j ACCEPT ;;
esac
${cmd} -N PUBLIC
for proto in tcp udp; do
${cmd} -A PUBLIC -m state --state NEW -m multiport -p ${proto} --dports ${public_port} -j ACCEPT
done
for chain in BASIC ICMP MGMT PUBLIC; do
${cmd} -A INPUT -j ${chain}
done
${cmd} -A INPUT -j LOG
done
netfilter-persistent save
最近の iptables の内部は nftables に代わっていて、Ubuntu も同じです。nftables 単体でも設定可能ですが、現状では慣れ親しんだ iptables がフロントエンドとして使わているケースが多いようです。数年後は iptables コマンドが無くなるかもしれませんね。
myadmin@ubuntu:~$ iptables --version iptables v1.8.7 (nf_tables)
Ubuntu 22.04 iptables ホストファイアウォール

