iptablesでLinuxをルーターに

表題の通り。といっても設定ファイルをいじりつつiptablesのスクリプトを書くだけなのですが。とりあえずの今の設定ファイルをコピペして編集したメモなので動かなかった等あればコメントお願いします。まあ、自分用にまとめただけで別に似たようなことを書いたウェブページは世にいくらでもあるのでぐぐると判ると思います。

まず、/etc/sysctl.confをいじります。

net.ipv4.ip_forward = 1

みたいなのをコメントアウト解除、なければ書き足し。

# sysctl -p /etc/sysctl.conf

してその設定を反映。次回は起動時に反映。

iptablesを実行するシェルスクリプトを書きます(実行属性を忘れない)。WAN側をppp0、LAN側をeth0で192.168.1.1/24とします。

#!/bin/sh

WAN=ppp0
LAN=eth0
WANIP=`ifconfig $WAN | awk '/inet addr:/ { sub(/addr:/, ""); ORS=""; print $2 }'` # Ubuntuのifconfigに特化した感じがあるので動かなければ書き換え、というかコメントアウトしてあったので何か動かない理由があったのかもしれません。
LANIP=192.168.1.1
LANSUBNET=192.168.1.0/24

hairpin_nat(){
        iptables -A FORWARD -i $WAN -d $1 -p $2 --dport $3 -j ACCEPT
        iptables -t nat -A PREROUTING -p $2 --dport $3 -d $WANIP -j DNAT --to $1
        iptables -t nat -A POSTROUTING -p $2 -s $LANSUBNET -d $1 --dport $3 -j SNAT --to-source $WANIP
}

# Flush & Reset
iptables -F
iptables -t nat -F
iptables -X

# Default Rule
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP
iptables -P INPUT DROP

iptables -A INPUT -i $LAN -j ACCEPT

# Filter out packets with private IP addresses from the Internet
iptables -A INPUT -i $WAN -s 192.168.0.0/16 -j DROP
iptables -A INPUT -i $WAN -s 172.16.0.0/12 -j DROP
iptables -A INPUT -i $WAN -s 10.0.0.0/8 -j DROP
iptables -A FORWARD -i $WAN -s 192.168.0.0/16 -j DROP
iptables -A FORWARD -i $WAN -s 172.16.0.0/12 -j DROP
iptables -A FORWARD -i $WAN -s 10.0.0.0/8 -j DROP

# Established
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# FORWARD
iptables -A FORWARD -i $LAN -j ACCEPT
iptables -A FORWARD -i $WAN -m state --state ESTABLISHED,RELATED -j ACCEPT

# Loopback
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# Accept
iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT # この辺りは使うので許可してあげます。不要な場合は外します。
iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT

iptables -A INPUT -p tcp --dport 1234 -j ACCEPT # 自身で待ち受けるポート。LAN内の別のサーバーに転送したいものはここに書く必要はありません。

# SNAT (masquerade)
iptables -t nat -A POSTROUTING -o $WAN -j MASQUERADE

# Static NAT
hairpin_nat 192.168.1.2 tcp 80 # Webサーバーがある場合の例、これを必要な数だけ
hairpin_nat 192.168.1.2 tcp 443

あとはこのスクリプトをネットワーク起動後に読み込みます。Ubuntuなら/etc/network/interfacesのpppの設定のところに

auto dsl
iface dsl inet ppp
        pre-up /sbin/ifconfig eth0 up # line maintained by pppoeconf
        post-up /etc/network/iptables.up
        provider dsl

的な感じで、post-upから呼び出します。post-upのファイル名は環境に応じて変えてください。更新した場合は直接ファイルを呼び出してあげれば大丈夫です。

ファイルの中身についての説明はめんどくさいので省略しますが、DEFAULT RULEは除くとして基本的に同じchainについて複数のルールが該当する場合、先に呼び出された方のルールが適用されるはずです。ソースは忘れました。なので、「○○したいが、例外的に□□な時は△△したい」時は後者を先に書きます。

一年後、そこにはVPNと外部ネットワーク、そして攻撃してくる輩をブロックする記述で秘伝のタレ化したiptables設定ファイルが!

# 基本が自分用のメモなのでこのブログを常体で書くか敬体で書くか微妙に悩ましかったのですが、敬体を基本にしてみました。違和感ないですね。

(一部仕様を勘違いしていた部分があり随時修正しています。)