aquadrops *

Technologies and Labs, Lifelog and more.

2008-07-31

CentOSで堅牢なPPPoEルーターを1時間で作る方法

今週に入ってから、自宅のLinuxルーターのネットワークが断続的に切れる状態に。その度に再起動を繰り返していたのですが、ブートローダー自体起動しなくなってしまったので、再構築を行いました。

今回はそのメモを。

そもそも市販ルーターを使用しない理由

  1. スループットがよくない
  2. 細かい設定ができない
  3. 拡張性がない

特に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

USER=yourid@yourisp.net

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用サーバー、右がルーター機。