Ubuntu 22.04 iptables シェルスクリプト

目次に戻る

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 シェルスクリプト

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

トップへ戻る