ルーター(firewall)

どこかからの(忘れた)転載.


IPマスカレード

#/etc/rc.localに


if [ -f /usr/local/bin/ipmasq ]; then
/usr/local/bin/ipmasq
fi
と書き足す。

/usr/local/bin/の下にipmasqという名で次のファイルを置く.
パーミッションは 700.
ファイル中の下のところを書き換える.
(例)
INSIDE_DEVICE=eth0
INSIDE_IP=192.168.0.1

OUTSIDE_DEVICE=eth1
OUTSIDE_IP=123.456.789.012


#!/bin/sh
iptables='/sbin/iptables'

#このルーターのWAN側(外向きの)IP
OUTSIDE_DEVICE=eth0
OUTSIDE_IP=xxx.xxx.xxx.xxx

#このルーターのLAN側(内向きの)IP
INSIDE_DEVICE=eth1
INSIDE_IP=yyy.yyy.yyy.yyy

#初期設定中のセキュリティ確保の為に
echo "0" > /proc/sys/net/ipv4/ip_forward
#全設定が終わった後、必ず
#$echo "1" >proc/sys/net/ipv4/ip_forward
#を実行する。でないと、通信できない。

#[Firewall]
#全てのチェーンの初期化
iptables -F
#natテーブルを初期化
iptables -t nat -F
#ユーザー定義チェーンの初期化
iptables -X
#全てのカウンタを初期化
iptables -Z
#パケットの受信を拒否
iptables -P INPUT DROP
#パケットの送信を拒否
iptables -P OUTPUT DROP
#パケットの転送を拒否
iptables -P FORWARD DROP

#[ザルのルーター]
#セキュリティ無用のルーターならここだけでOK
#但し、最後に echo "1" > /proc/sys/net/ipv4/ip_forward は必須

#[IPマスカレード(NAT)の設定]
iptables -t nat -A POSTROUTING -o ${OUTSIDE_DEVICE} -j MASQUERADE

#[サーバーを公開]
#現時点ではなにもサーバーないのですべてコメントにしている。
#公開するなら、下記のコメントを外す。
#SERVER_IP=192.168.1.100
#公開するサーバーのIP (ルーターの内側においてあるやつ)
#SSH:
#iptables -A PREROUTING -t nat -p tcp -d ${OUTSIDE_IP} --dport 22 -j DNAT --to ${SERVER_IP}:22
#iptables -A FORWARD -p tcp -d ${SERVER_IP} --dport 22 -o ${INSIDE_DEVICE} -j ACCEPT
#Web:
#iptables -A PREROUTING -t nat -p tcp -d ${OUTSIDE_IP} --dport 80 -j DNAT --to ${SERVER_IP}:80
#iptables -A FORWARD -p tcp -d ${SERVER_IP} --dport 80 -o ${INSIDE_DEVICE} -j ACCEPT
#FTP:
#iptables -A PREROUTING -t nat -p tcp -d ${OUTSIDE_IP} --dport 21 -j DNAT --to ${SERVER_IP}:21
#iptables -A FORWARD -p tcp -d ${SERVER_IP} --dport 21 -o ${INSIDE_DEVICE} -j ACCEPT

#[LAN内部のクライアント向けの設定]
#外部に転送される接続開始パケットを許可
iptables -A FORWARD -m state --state NEW -i ${INSIDE_DEVICE} -j ACCEPT

#すでに確立している接続に関連するパケットの転送を許可
#(外からは内部からつなごうとしたところからのみパケットを受け入れることができる。)
#(ただし、内部に置いてある公開サーバーには、特別に外からアクセスできる。)
#(ここでの設定より前で、それを許可すると書いてあるから)
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

#外からの内部への接続開始要求のパケット、不正なパケットを破棄
iptables -A FORWARD -m state --state NEW,INVALID -i ${OUTSIDE_DEVICE} -j DROP

#[Windows 固有のパケットの漏洩を防止]
#NetBIOS系パケットの漏洩を防止
iptables -t nat -A PREROUTING -p TCP -i ${INSIDE_DEVICE} --dport 135:139 -j DROP
iptables -t nat -A PREROUTING -p UDP -i ${INSIDE_DEVICE} --dport 137:139 -j DROP
#SMBパケットの漏洩を防止
iptables -t nat -A PREROUTING -p TCP -i ${INSIDE_DEVICE} --dport 445 -j DROP
iptables -t nat -A PREROUTING -p UDP -i ${INSIDE_DEVICE} --dport 445 -j DROP

#[ルーターPCの設定]
#ローカルループバックを全開
iptables -A INPUT -i lo -j ACCEPT
#すでに確立している接続に関連するパケットの着信を許可
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#新しい接続を開始するパケットとすでに確立している接続に関連するパケットの送信を許可
iptables -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

#ICMP(pingに使ったりする)パケットの送信を許可
iptables -A OUTPUT -p icmp -j ACCEPT
#ICMPパケットの着信を許可
iptables -A INPUT -p icmp -j ACCEPT

#LAN内のマシンとの通信
iptables -A INPUT -i ${INSIDE_DEVICE} -j ACCEPT
iptables -A OUTPUT -o ${INSIDE_DEVICE} -j ACCEPT

#[PMTUブラックホールの回避]
#パケットのMSSサイズをPMTUのサイズに合わせる
#PMTUブラックホール問題とは,PMTU(通信経路上で再分割せずに送信できるIPパケットのサイズ)と、
#MSS(パケットに格納できるアプリケーション・データの最大サイズ)の不整合により,
#PMTUより大きなサイズのデータが送受信不可能な状態になるトラブル。
#パケット転送時にMSSのサイズzをPMTUに合わせておいてこれを回避すると設定
iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

#[パケット毎のチューニング]
#SSHパケットは応答速度を優先
iptables -A PREROUTING -t mangle -p tcp --sport ssh -j TOS --set-tos Minimize-Delay
#FTPパケットは応答速度を優先
iptables -A PREROUTING -t mangle -p tcp --sport ftp -j TOS --set-tos Minimize-Delay
#FTP-DATAパケットは転送速度を優先
iptables -A PREROUTING -t mangle -p tcp --sport ftp-data -j TOS --set-tos Maximize-Throughput

#[ルールの表示]
#iptables -L -n

#[WAN側アドレスの変更に対応するために]
#WAN側アドレスが変更してもIPマスカレードを継続
#DHCPなどでWAN側のアドレスを受けている場合、
#接続が切れると違うIPを受けることがある。
#この時も再設定の必要がないように。
echo 1 > /proc/sys/net/ipv4/ip_dynaddr

#[必須 通信の許可をあたえる]
#パケット転送の許可(不許可にしたい場合は, echo 0)
echo "1" > /proc/sys/net/ipv4/ip_forward


起動時に自動的に許可させたい場合は,/etc/sysctl.conf 中で下のように変更(0 -> 1)


net.ipv4.ip_forward = 1