CentOSで堅牢なPPPoEルーターを1時間で作る方法
今週に入ってから、自宅のLinuxルーターのネットワークが断続的に切れる状態に。その度に再起動を繰り返していたのですが、ブートローダー自体起動しなくなってしまったので、再構築を行いました。
今回はそのメモを。
そもそも市販ルーターを使用しない理由
- スループットがよくない
- 細かい設定ができない
- 拡張性がない
特に1の理由が大きく、最近では手頃な値段のルーターが販売されていますが、カタログスペック通りに出る事はほぼ皆無です。
全ての要求を満たす物だと、YAMAHAのRTAシリーズやNetScreen、Ciscoなどなど、データセンター向けや企業向けの業務用の物になってしまい、なかなか手の出せる値段でもありません。また設定も複雑で個人用途にはオーバースペックになってしまいます。
ネットワーク構成
至ってシンプルなネットワークで、公開しているサービスは外出先でも自宅で流している音楽が聴けるように、自分用のストリーミング程度です。
上位はKDDIのひかりone (旧TEPCOひかり)のVDSLタイプですが、ADSLやBフレッツでも今回の方法は使えます。
ルーター機にNICを追加する
いわゆる「2枚挿し」にします。PCIスロットにNICを追加します。以前購入して部屋に転がっていたGbE対応NICを使用しました。
PCIスロットが複数あれば3枚挿し、4枚挿しにして、公開サービス用のセグメントを分ける事も可能です。
ルーターマシンにOSをインストールする
CentOS5のisoイメージをダウンロードし、DVD-ROMに焼いた物からインストールします。
セキュリティの観点からもOSインストール段階でのパッケージは最小限にします。
また、NICへのIP割当はLAN側にのみ行います。
インストール完了後は yum -y update を忘れずに。
ポリシーを決める
LAN→WANへ接続できるように、また、LAN側からルーターにSSHでログインし、リモートで操作できるようにします。
ルーター機ではDNS、DHCPの各サービスを起動させます。
サービスに必要なパッケージをインストールする
rootユーザーでbind,dhcp,ppp,rp-pppoeをインストールします。
# yum install bind dhcp ppp rp-pppoe
接続情報を設定する
rootユーザーでadsl-setupコマンドを実行します。
接続ID が yourid@yourisp.net 接続パスワードが yourpasswordの場合の設定です。
Welcome to the ADSL client setup. First, I will run some checks on
your system to make sure the PPPoE client is installed properly…
The following DSL config was found on your system:
Device: Name:
ppp0 DSLppp0
Please enter the device if you want to configure the present DSL config
(default ppp0) or enter ‘n’ if you want to create a new one:
LOGIN NAME
Enter your Login Name (default root): yourid@yourisp.net # ISPの接続ID
INTERFACE
Enter the Ethernet interface connected to the ADSL modem
For Solaris, this is likely to be something like /dev/hme0.
For Linux, it will be ethX, where ‘X’ is a number.
(default eth1): eth1 #eth0側に接続する場合は eth0 と指定。
Do you want the link to come up on demand, or stay up continuously?
If you want it to come up on demand, enter the idle time in seconds
after which the link should be dropped. If you want the link to
stay up permanently, enter ‘no’ (two letters, lower-case.)
NOTE: Demand-activated links do not interact well with dynamic IP
addresses. You may have some problems with demand-activated links.
Enter the demand value (default no): no
DNS
Please enter the IP address of your ISP’s primary DNS server.
If your ISP claims that ‘the server will provide dynamic DNS addresses’,
enter ‘server’ (all lower-case) here.
If you just press enter, I will assume you know what you are
doing and not modify your DNS setup.
Enter the DNS information here: # DNSはISPから自動取得するので空欄でenter
PASSWORD
Please enter your Password: yourpassword # ISPの接続パスワード
Please re-enter your Password: yourpassword # ISPの接続パスワード
USERCTRL
Please enter ‘yes’ (three letters, lower-case.) if you want to allow
normal user to start or stop DSL connection (default yes): yes
FIREWALLING
Please choose the firewall rules to use. Note that these rules are
very basic. You are strongly encouraged to use a more sophisticated
firewall setup; however, these will provide basic security. If you
are running any servers on your machine, you must choose ‘NONE’ and
set up firewalling yourself. Otherwise, the firewall rules will deny
access to all standard servers like Web, e-mail, ftp, etc. If you
are using SSH, the rules will block outgoing SSH connections which
allocate a privileged source port.
The firewall choices are:
0 – NONE: This script will not set any firewall rules. You are responsible
for ensuring the security of your machine. You are STRONGLY
recommended to use some kind of firewall rules.
1 – STANDALONE: Appropriate for a basic stand-alone web-surfing workstation
2 – MASQUERADE: Appropriate for a machine acting as an Internet gateway
for a LAN
Choose a type of firewall (0-2): __ # 後でiptablesのルールを設定するので…
Start this connection at boot time
Do you want to start this connection at boot time?
Please enter no or yes (default no):yes # 起動時に接続するので、yes
** Summary of what you entered **
Ethernet Interface: eth1
User name: yourID@yourisp.net
Activate-on-demand: No
DNS: Do not adjust
Firewalling: NONE
User Control: yes
Accept these settings and adjust configuration files (y/n)? y # 問題なければ yで終了。
adsl-setupコマンドが終了するとppp0用の設定ファイルが生成されるので、カーネルモードPPPoE用の設定と、MTU値の指定を追加します。
エディタで /etc/sysconfig/network-scripts/ifcfg-ppp0 を開きます。
USERCTL=yes
BOOTPROTO=dialup
NAME=DSLppp0
DEVICE=ppp0
TYPE=xDSL
ONBOOT=yes
PIDFILE=/var/run/pppoe-adsl.pid
FIREWALL=NONE
PING=.
PPPOE_TIMEOUT=80
LCP_FAILURE=3
LCP_INTERVAL=20
CLAMPMSS=1412
CONNECT_POLL=6
CONNECT_TIMEOUT=60
DEFROUTE=yes
SYNCHRONOUS=no
ETH=eth1
PROVIDER=DSLppp0
PEERDNS=no
DEMAND=no
_LINUX_PLUGIN=/usr/lib/pppd/2.4.4/rp-pppoe.so
MTU=1452_
NIC2枚挿しでデータ転送を有効にします。カーネルパラメーターのip_forwardをONにします。
# echo 1 > /proc/sys/net/ipv4/ip_forward
*再起動すると無効になるので、/etc/sysctl.confのnet.ipv4.ip_forwardを1にしておきます。
iptablesでファイヤーウォールルールを設定する
事前に決めておいたポリシーを元にルールを作成します。
シェルスクリプト化する事で、1行ずつコマンドを実行する手間を省きます。
例)LAN側のNICをeth0とし、IPアドレスは192.168.0.1を指定。ネットマスクは/24の場合。
#!/bin/sh
### IPTABLES
IPTABLES=”/sbin/iptables”
### NICS
NIC0=”eth0″
PPP0=”ppp0″
### IPs
LAN_NET=”192.168.0.0/24″
WAN_NET=”! 192.168.0.0/24″
# 既存のルールをリセット
$IPTABLES -F -t filter
$IPTABLES -F -t nat
$IPTABLES -F -t mangle
$IPTABLES -X
# MTU tuning
$IPTABLES -A FORWARD -o $PPP0 -p tcp –tcp-flags SYN,RST SYN -j TCPMSS –clamp-mss-to-pmtu
### Forward
$IPTABLES -A FORWARD -s $WAN_NET -d $LAN_NET -o $NIC0 -j ACCEPT
$IPTABLES -A FORWARD -s $LAN_NET -d $WAN_NET -o $PPP0 -j ACCEPT
### local
# all allow
$IPTABLES -A INPUT -j ACCEPT -i lo
$IPTABLES -A OUTPUT -j ACCEPT -o lo
### NIC0
# all allow
$IPTABLES -A INPUT -j ACCEPT -i $NIC0
$IPTABLES -A OUTPUT -j ACCEPT -o $NIC0
### outgoing
$IPTABLES -t nat -A POSTROUTING -s $LAN_NET -d $WAN_NET -j MASQUERADE
$IPTABLES -A OUTPUT -p tcp –sport 1024: –dport 80 -j ACCEPT -o $PPP0
$IPTABLES -A INPUT -p tcp –sport 80 –dport 1024: -j ACCEPT -i $PPP0 ! –syn
$IPTABLES -A OUTPUT -p tcp –sport 1024: –dport 53 -j ACCEPT -o $PPP0
$IPTABLES -A INPUT -p tcp –sport 53 –dport 1024: -j ACCEPT -i $PPP0 ! –syn
$IPTABLES -A OUTPUT -p udp –sport 1024: –dport 53 -j ACCEPT -o $PPP0
$IPTABLES -A INPUT -p udp –sport 53 –dport 1024: -j ACCEPT -i $PPP0
# Logging
$IPTABLES -A FORWARD -j LOG –log-prefix “Forward ”
$IPTABLES -A INPUT -j LOG –log-prefix “IN-Deny ”
$IPTABLES -A INPUT -j DROP
$IPTABLES -A OUTPUT -j LOG –log-prefix “Out-Deny ”
$IPTABLES -A OUTPUT -j DROP
本来はLAN側も細かくポート制限をすべきですが、家庭内用途を前提にしているので行っていません。
ルーター機からWAN側への通信は53番ポート(DNS)と80番ポート(HTTP:yumでのアップデートにて使用)のみ解放しています。
マシンの再起動を行うとルールがリセットされるので、保存しておきます。
# /etc/init.d/iptables save
また、natを行うモジュールを読み込みます。
# modprobe iptable_nat
# modprobe ip_conntrack_ftp
# modprobe ip_nat_ftp
こちらもマシンの再起動後に無効になるので、/etc/rc.localに追加しておきます。
DHCPサーバーの設定
/etc/dhcpd.confに記述します。
例) LAN側のNICのIPアドレスが192.168.0.1、ネットマスクは/24の場合。
ddns-update-style interim;
ignore client-updates;
subnet 192.168.0.0 netmask 255.255.255.0 {
# — default gateway
option routers 192.168.0.1;
option subnet-mask 255.255.255.0;
option nis-domain “hogehogehoge.net”;
option domain-name “hogehogehoge.net”;
option domain-name-servers 192.168.0.1;
option time-offset -18000; # Eastern Standard Time
range dynamic-bootp 192.168.0.101 192.168.0.200; # クライアントに割り当てるIPアドレス範囲
default-lease-time 21600;
max-lease-time 43200;
}
dhcpdを起動。
# /etc/init.d/dhcpd start
DNSキャッシュサーバーの設定
例) LAN側のNICのIPアドレスが192.168.0.1、ネットマスクは/24の場合。
/etc/named.confに記述します。
options {
directory “/var/named”;
allow-query { 127.0.0.1; 192.168.0.0/24; };
};
zone “.” {
type hint;
file “data/db.root”;
};
zone “localhost” IN {
type master;
file “data/localhost.zone”;
};
zone “0.0.127.in-addr.arpa” IN {
type master;
file “data/0.0.127.in-addr.arpa”;
};
include “/etc/rndc.key”;
ゾーンファイルを作成します。
db.root
# dig @A.ROOT-SERVERS.NET . ns > /var/named/data/db.root
localhost.zone
$TTL 300
@ IN SOA localhost. root.localhost.(
1 ; Serial
10800 ; Refresh
3600 ; Retry
604800 ; Expire
86400 ) ; Minimum
IN NS localhost.
IN A 127.0.0.1
0.0.127.in-addr.arpa
$TTL 300
@ IN SOA localhost. root.localhost.(
1 ; Serial
10800 ; Refresh
3600 ; Retry
604800 ; Expire
86400 ) ; Minimum
IN NS localhost.
1 IN PTR localhost.
namedを起動。
# /etc/init.d/named start
ルーター起動時に必要なサービスを起動させる設定
ntsysvコマンドを使用して、最低限必要なサービスのみを起動するように設定します。
crond
dhcpd
iptables
named
network
sshd
syslog
yum-updatesd
速度計測を行ってみる
speed.rbbtoday.comを使用してみました。ロケーションは東京・大手町を選択。
何度か計測しましたが、軒並み 下り:85〜90Mbps、上り:20〜25Mbps 辺りを叩き出しました。
VDSLの為、マンションのMDF盤の終端装置からは距離がありますので、カタログスペックまでは行かない物の、市販ルーターよりは速度は出ています。
左側はstreaming用サーバー、右がルーター機。