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 ホストファイアウォール