Debianでルータ構築

2008-11-16 書き始め
2009-04-05 修正と加筆
2009-04-06 一旦完成
2011-05-18 Debian squeezeにdist-upgrade後,動作確認済

目的:家庭用ルータをいわゆる「PCルータ」と交換し,家庭内ネットワークの高速化を図る.またiptablesによる強力なファイアウォールを導入する.
注意:書いてる途中でDebian etchからDebian lennyにアップグレードしたため,情報が混ざっている可能性があります
   前述の通り,squeezeで動きました.
方針:NAT(Firewall)→PPPoEの順にひたすらゴリゴリ設定していく.

・NAT(Firewall)
iptablesをインストールする

$ su
# apt-get install iptables

iptable_natをロードする

# modprobe iptable_nat

ちゃんとロードできたか確認

# lsmod |grep iptable
iptable_nat 7044 0
ip_nat 16876 1 iptable_nat
ip_tables 13028 1 iptable_nat
ip_conntrack 49088 2 iptable_nat,ip_nat
x_tables 13316 2 iptable_nat,ip_tables

確認できたら,起動時に自動で読み込むようにしておく

# echo 'iptable_nat' >> /etc/modules

NATを有効にするとともに,SYNフラッドやDDoS攻撃を防ぐため,/etc/sysctl.confに以下を書く.

net.ipv4.tcp_syncookies = 1
net.ipv4.ip_forward = 1
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1

iptables.sh(シェルスクリプト)に設定を書き込む.
※これはあくまで簡単な設定例です.もう少し練り込んで使ったほうがいいでしょう.


#!/bin/sh
IPTABLES="/sbin/iptables"

#--------------------------------#
#    定数設定    #
#--------------------------------#

# インターフェース定義
wan_port='ppp0'
lan_port='eth0'

# LAN内のIPアドレス定義
sangou='192.168.0.3'

# ポート定義
www_http='80'

# IPアドレス範囲定義
lan_range='192.168.0.0/24'
any='0.0.0.0/0'

#--------------------------------#
#    初期設定    #
#--------------------------------#

$IPTABLES -t nat -F
$IPTABLES -F
$IPTABLES -X
# LANから外に出て行くパケットの送信元IPを書き換える(NAT)
$IPTABLES -t nat -A POSTROUTING -o $wan_port -s $lan_range -j MASQUERADE

# deny,allow(基本拒否)
$IPTABLES -P INPUT DROP
$IPTABLES -P FORWARD ACCEPT

# allow,deny(基本許可)
$IPTABLES -P OUTPUT ACCEPT

#---------------------------------------#
#   INPUT RULES   #
#---------------------------------------#

# 1秒間に4回を越えない範囲でicmpを許可
$IPTABLES -A INPUT -m limit --limit 1/s --limit-burst 4 -j ACCEPT

# 自端末からのアクセスを許可
$IPTABLES -A INPUT -i lo -j ACCEPT

# LAN内の他端末からのアクセスを許可
$IPTABLES -A INPUT -s $lan_range -j ACCEPT

# 接続が確立したパケットの応答は許可
$IPTABLES -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

#IP Spoofing対策(不正なIPアドレスからのアクセスを拒否)
$IPTABLES -A INPUT -i $wan_port -s 0.0.0.0/8 -j DROP
$IPTABLES -A INPUT -i $wan_port -s 10.0.0.0/8 -j DROP
$IPTABLES -A INPUT -i $wan_port -s 127.0.0.0/8 -j DROP
$IPTABLES -A INPUT -i $wan_port -s 169.254.0.0/16 -j DROP
$IPTABLES -A INPUT -i $wan_port -s 172.16.0.0/12 -j DROP
$IPTABLES -A INPUT -i $wan_port -s 192.0.2.0/24 -j DROP
$IPTABLES -A INPUT -i $wan_port -s 192.168.0.0/16 -j DROP
$IPTABLES -A INPUT -i $wan_port -s 224.0.0.0/4 -j DROP
$IPTABLES -A INPUT -i $wan_port -s 240.0.0.0/5 -j DROP
$IPTABLES -A INPUT -i $wan_port -s 248.0.0.0/5 -j DROP
$IPTABLES -A INPUT -i $wan_port -s 255.255.255.255/32 -j DROP

# 外部からの必須ICMPパケットを許可
$IPTABLES -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
$IPTABLES -A INPUT -p icmp --icmp-type source-quench -j ACCEPT
$IPTABLES -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT
$IPTABLES -A INPUT -p icmp --icmp-type parameter-problem -j ACCEPT

#---------------------------------------#
#   OUTPUT RULES  #
#---------------------------------------#

# 宛先ポート135,137〜139,445のパケットを破棄(netbiosが漏れるのを防ぐ)
$IPTABLES -A OUTPUT -o $wan_port -p tcp --dport 135 -j DROP
$IPTABLES -A OUTPUT -o $wan_port -p udp --dport 135 -j DROP
$IPTABLES -A OUTPUT -o $wan_port -p tcp --dport 137:139 -j DROP
$IPTABLES -A OUTPUT -o $wan_port -p udp --dport 137:139 -j DROP
$IPTABLES -A OUTPUT -o $wan_port -p tcp --dport 445 -j DROP
$IPTABLES -A OUTPUT -o $wan_port -p udp --dport 445 -j DROP

#------------------------------------------#
#   FORWARD RULES  #
#------------------------------------------#

# パスMTU問題対策
$IPTABLES -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

# 宛先ポート135,137〜139,445のパケットを破棄(netbiosが漏れるのを防ぐ)
$IPTABLES -A FORWARD -p tcp --dport 135 -j DROP
$IPTABLES -A FORWARD -p udp --dport 135 -j DROP
$IPTABLES -A FORWARD -p tcp --dport 137:139 -j DROP
$IPTABLES -A FORWARD -p udp --dport 137:139 -j DROP
$IPTABLES -A FORWARD -p tcp --dport 445 -j DROP
$IPTABLES -A FORWARD -p udp --dport 445 -j DROP

# 外部からの必須ICMPパケットを許可
$IPTABLES -A FORWARD -p icmp --icmp-type destination-unreachable -j ACCEPT
$IPTABLES -A FORWARD -p icmp --icmp-type source-quench -j ACCEPT
$IPTABLES -A FORWARD -p icmp --icmp-type time-exceeded -j ACCEPT
$IPTABLES -A FORWARD -p icmp --icmp-type parameter-problem -j ACCEPT

# 接続が確立したパケットの応答は許可
$IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

# LAN内の他端末からのアクセスを許可
$IPTABLES -A FORWARD -s $lan_range -d $lan_range -j ACCEPT

# HTTPサーバへの転送
$IPTABLES -t nat -A PREROUTING -i $wan_port -p tcp --dport $www_http -j DNAT --to-destination $sangou

・PPP
pppoeconf使って手抜きをするととても簡単.


# apt-get install pppoeconf
# pppoeconf

一問一答形式で答えていけばいい

起動時に上記iptables.shを適用させるため,/etc/network/interfacesをいい感じに書き換える.
これも一例です.環境に合わせて書き直すべきです.


# eth0はWAN側のポート(PPPoE)
auto eth0
iface eth0 inet ppp
provider dsl-provider
pre-up /sbin/ifconfig eth0 up
pre-up /pass_to_iptables.sh/iptables.sh
mtu 1454

# eth1はLAN側のポート(192.168.1.1をゲートウェイにする)
auto eth1
iface eth1 inet static
address 192.168.1.1
netmask 255.255.255.0
mtu 1454

書けたらネットワークの再起動をしましょう


# /etc/init.d/networking restart

あとはクライアント側の/etc/network/interfacesと/etc/hostsを書き換えて/etc/init.d/networking restartすれば繋がるはずです.

・次の課題
カーネルモードPPPを使う
DNSサーバを自分で立てる
特定の国のIPアドレス範囲を,夜中に取得してiptablesに突っ込んで自動で蹴るようにする

・参考にした(する)サイト
Linux/iptablesでルータを作る

Ubuntu/iptables(firewall)

iptablesによるパケットフィルタリング

イーモバイル D02HW でルータ

PCルーター構築(PPPoE+iptables)

Manpage of IPTABLES

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です