Linuxルータのiptables設定スクリプト

再インストールした時とかに忘れて消してしまうことがあるので、バックアップを兼ねて LTE ルータにした BBB 向けの iptables ルール登録スクリプトを公開しておく。
インタフェースとサービスだけ問題なければそのまま実行すればいける、、、はず。実行してアクセスできなくなっても知りません。:P

想定環境

  • ArchLinux 端末(BBB)
  • LAN側インタフェース: eth0(NWアドレスは ip route コマンドから取得)
  • WAN側インタフェース: ppp0(アドレスは任意)
  • ルーティング: WAN側デフォルト、LAN側直結のみ
  • 待ち受けサービス: LAN 側からのみ SSH, DNS, NTP, DHCP

iptables ルール登録用スクリプト

LAN 側インタフェース名、WAN 側インタフェース名は冒頭の変数(LAN_INTF, WAN_INTF)で指定しています。

LAN 側インタフェースのアドレスは ip route コマンドの出力から勝手に取ってくる(LAN_ADDR)ように作っています。出力の関係で LAN 側向けにスタティックルートを登録しているとうまく動かない場合があります。

iptables のルールファイル(RULES_FILE)は ArchLinux のデフォルト(/etc/iptables/iptables.rules)としています。Ubuntu とかの方は変える必要があるかもしれません。

待ち受けするサービスは OPENNEW チェインで扱っています(-m state --state NEW をたくさん並べるの嫌なので)。変なアクセスは、LAN 側からだと ICMP による通知ありで落とされ、WAN 側からは無視します。

#!/bin/bash

RULES_FILE='/etc/iptables/iptables.rules'

WAN_INTF='ppp0'
LAN_INTF='eth0'
LAN_ADDR=`ip route | grep ${LAN_INTF} | sed -n 's/^\([^ ]*\) .*/\1/p'`

LOG_RATE='10/m'
ICMP_RATE='30/m'

PRIV_NET_A='10.0.0.0/8'
PRIV_NET_B='172.16.0.0/12'
PRIV_NET_C='192.168.0.0/16'

iptables -F
iptables -Z
iptables -X

iptables -N NETUNREACH
iptables -A NETUNREACH -j REJECT --reject-with icmp-net-unreachable

iptables -N LOGREJECT
iptables -A LOGREJECT -j LOG -m limit --limit ${LOG_RATE}
iptables -A LOGREJECT -j REJECT --reject-with icmp-host-prohibited

iptables -N LOGDROP
iptables -A LOGDROP -j LOG -m limit --limit ${LOG_RATE}
iptables -A LOGDROP -j DROP

iptables -N OPENNEW
iptables -A OPENNEW -j ACCEPT -i ${LAN_INTF} -m tcp -p tcp --dport 22
#iptables -A OPENNEW -j ACCEPT -i ${LAN_INTF} -m tcp -p tcp --dport 80
iptables -A OPENNEW -j ACCEPT -i ${LAN_INTF} -m udp -p udp --dport 53
iptables -A OPENNEW -j ACCEPT -i ${LAN_INTF} -m udp -p udp --dport 67
iptables -A OPENNEW -j ACCEPT -i ${LAN_INTF} -m udp -p udp --dport 123
iptables -A OPENNEW -j REJECT -i ${LAN_INTF} --reject-with icmp-host-prohibited
iptables -A OPENNEW -j LOGDROP

iptables -P INPUT ACCEPT
iptables -A INPUT -j ACCEPT -i lo
iptables -A INPUT -j ACCEPT -i eth0 -p icmp -m limit --limit ${ICMP_RATE}
iptables -A INPUT -j ACCEPT -m state --state ESTABLISHED,RELATED
iptables -A INPUT -j OPENNEW -m state --state NEW
iptables -A INPUT -j LOGDROP

iptables -P OUTPUT ACCEPT
iptables -A OUTPUT -j NETUNREACH -o ${WAN_INTF} -d ${PRIV_NET_A}
iptables -A OUTPUT -j NETUNREACH -o ${WAN_INTF} -d ${PRIV_NET_B}
iptables -A OUTPUT -j NETUNREACH -o ${WAN_INTF} -d ${PRIV_NET_C}
iptables -A OUTPUT -j ACCEPT

iptables -t nat -F
iptables -t nat -A POSTROUTING -j MASQUERADE -s ${LAN_ADDR} -o ${WAN_INTF}

iptables -P FORWARD ACCEPT
iptables -A FORWARD -j NETUNREACH -o ${WAN_INTF} -d ${PRIV_NET_A}
iptables -A FORWARD -j NETUNREACH -o ${WAN_INTF} -d ${PRIV_NET_B}
iptables -A FORWARD -j NETUNREACH -o ${WAN_INTF} -d ${PRIV_NET_C}
iptables -A FORWARD -j ACCEPT -i ${LAN_INTF}
iptables -A FORWARD -j ACCEPT -m state --state ESTABLISHED,RELATED
iptables -A FORWARD -j LOGREJECT

# 保存して良い場合はコメントアウト
#iptables-save > ${RULES_FILE}