表題の通り。といっても設定ファイルをいじりつつ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設定ファイルが!
# 基本が自分用のメモなのでこのブログを常体で書くか敬体で書くか微妙に悩ましかったのですが、敬体を基本にしてみました。違和感ないですね。
(一部仕様を勘違いしていた部分があり随時修正しています。)