iptables for DD-WRT

はじめに

以前WHR-300HP2をDD-WRT化した.
heavymoon.hateblo.jp

GUIからはフィルタの設定ができなくなったが,中身はLinuxなのでiptablesでフィルタを設定できる. iptablesでフィルタ設定したのでその備忘.

作業を始める前に

なにはともあれ読むべきはマニュアルと巨人達の足跡.

ログ出力設定

Syslogd と Klogd を Enable に変更する.
これ設定しておかないと-j LOGを設定してもログを出力できない.

  • Services > Services > Services Management > System Log
    f:id:HeavyMoon:20190119014045p:plain

iptables設定スクリプト

いきなりコマンドを投入して,WebGUIにアクセスできず,SSHも繋がらなくなっては面倒. 殻割りしてコンソールから操作しない以上は電源を切り設定を消し去る他無い. コマンドを1つ1つ投入して途中で断しても面倒なので,スクリプトを作る.

一応デフォルトスクリプト/tmp/.iptに置いてある.

とりあえず最低限WANからのINPUTをDROPしつつ,LANからはアクセスできるよう設定スクリプトを作る. nvramから設定値を読み込むこともできる.

#!/bin/sh
#############################
# IPTABLES FOR DD-WRT
#############################
# WAN INFO
WAN_IP=$(nvram get wan_ipaddr)
WAN_IF=$(nvram get wan_ifname)

# LAN INFO
LAN_IP=$(nvram get lan_ipaddr)
LAN_IF=$(nvram get lan_ifnames)
LocalNet=$LAN_IP/24

## RESET CONFIG
iptables -X
iptables -F

## SET POLICY
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

#############################

## NAT TABLE ----------------
iptables -t nat -A POSTROUTING -o $WAN_IF -j SNAT --to-source $WAN_IP

## MANGLE TABLE -------------
# nothing to do

## FILTER TABLE -------------
# Loopback
iptables -t filter -A INPUT -i lo -j ACCEPT
# from LAN to router
iptables -t filter -A INPUT -s $LocalNet -j ACCEPT
# exist connection that this router started
iptables -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Log Drop at INPUT
iptables -t filter -A INPUT -j LOG --log-prefix "Drop at INPUT:"
# Log Drop at FORWARD
iptables -t filter -A FORWARD -j LOG --log-prefix "Drop at FORWARD:"

## RAW TABLE ----------------
# nothing to do

#############################

iptablesを理解していない状態でお試し設定を投入した際にSSHが断することは往々にして有り得るため,実行時にはデバッグオプションをつけることをオススメする.

$ /bin/sh -x myiptables

あとはこれを自分の環境にあわせて適当に改変してあげればOK.
このままだとFORWARDはDROPするけど,SNATの設定を入れておいたのでFORWARDのフィルタ追加すればいい感じになるはず. GoogleMicrosoftに流れ出ようとする謎のパケットがドロップされて行く様を眺めるも良し,適当なサーバを晒すも良し.