魔術師見習いのノート

プロフィール

魔術師見習い
Author魔術師見習い-_-.
Twitter魔術師見習い

コンピュータ関係のメモを主に書きます.

MENU

FreeBSDでルータ構築

投稿日:
タグ:

FreeBSD10でルータを構築した際のメモ。

最低限のWANとLANを接続するルータを作るには次の2つの機能が必要である。

FreeBSDのPPPoEクライアントであるpppは、NAT機能を備えている。それゆえ、OSのパケット転送機能を可能にし、pppの設定を行えば、最低限のルータとして動作する。

市販の多くのルータは前述の機能に加えて以下の機能も持つ。

これらの機能はなくてもインターネットにアクセス可能だが、あった方が安全だったりネットワークの設定が楽だったり通信が速かったりする。


基本設定

OSはFreeBSD10でカーネルはデフォルトのまま使用する。本ルータはDHCPサーバの機能を持ち、固定IPアドレスを使用する(もしDHCPサーバが別にあるならそれからIPアドレスを貰ってもいい)。 IPアドレスの割り当ては、次のようにifconfigコマンドで行うことができる。

user% ifconfig re0 192.168.10.1 netmask 255.255.255.0
また、OS起動時にこの設定を行うには、rc.confに次のような行を追加すれば良い。
/etc/rc.conf
ifconfig_re0="inet 192.168.10.1 netmask 255.255.255.0"
/etc/sysctl.conf
net.inet.ip.forwarding=1
NATを使用するには前述の設定が必要である。OS起動後にこの値を変更するには、次のような処理を行えば良い。
user% sysctl net.inet.ip.forwarding=1

pppの設定

私の環境ではPPPoEを使ってWANに接続する。PPPoEクライアントにはpppを使用する。設定は次のように行う。

/etc/ppp/ppp.conf
default:
  set log Phase Chat LCP IPCP CCP tun command
  set device PPPoE:re1
  set mru 1454
  set mtu 1454
  set authname XXXXXXX@YYYYYY.ZZZ
  set authkey WWWWWWWWWW
  set dial
  set login
  add default HISADDR
  nat enable yes
#  enable dns
#から行末まではコメント。authnameとauthkeyはプロバイダから渡されたアカウントとパスワードを使用する。
/etc/rc.conf
ppp_enable="YES"
ppp_mode="ddial" # モードについてはman pppを参照されたし
ppp_nat="YES"    # ppp.confの"nat enable yes"と同じ。
ppp_profile="default"
この設定は次のような処理と同じである。
user% ppp -ddial -nat default
ちなみにNATの設定はどちらかだけで良い(両方あっても問題なく動作するようだが)。
設定後、OSを再起動するか次のようにpppの起動スクリプトを実行すればWANに接続できる。
user% /etc/rc.d/ppp start
正常に接続できたならば、次のような仮想デバイスが生成されているはずである(番号が0でない可能性があるのでifconfig -aで確認した方が無難)。
user% ifconfig tun0
tun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> metric 0 mtu 1454
	options=80000<LINKSTATE>
	inet XXX.XXX.XXX.XXX --> YYY.YYY.YYY.YYY netmask 0xffffffff 
	nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
	Opened by PID 1101
XXX.XXX.XXX.XXXやYYY.YYY.YYY.YYYには実際のIPアドレスが入る。以降このような記述は同様の意図である。

これによりルータ、または内部ネットワークのノードが外部と通信した場合、その送信元IPアドレスはXXX.XXX.XXX.XXXとなる。


isc-dhcp-serverの設定

DHCPを使用しない場合、ノードのIPアドレス、使用するネームサーバ、ルーティングテーブルなどの設定を主導で設定しなければならない。以下に設定例を紹介する。

IPアドレスの割り当て
user% ifconfig eth0 192.168.10.3 netmask 255.255.255.0
使用するネームサーバ(/etc/resolv.conf)の設定ファイル
nameserver WWW.WWW.WWW.WWW
nameserver WWW.WWW.WWW.VVV
ルーティングテーブル
ルーティングテーブルの確認
user% netstat -r
ルーティングテーブルからの削除
デフォルトルートを削除する。
user% route del -net default
ルーティングテーブルへの追加
デフォルトルートeth0から192.168.10.1へのルートを追加する。
user% route add -net default gw 192.168.10.1 dev eth0
毎度毎度このような設定は面倒臭い。それゆえDHCPサーバを用意する。

本環境ではDHCPサーバはルータと同じマシンである。DHCPサーバにはisc-dhcp-serverを使用する。インストールはpkgを使用して以下のような感じでインストールする。

user% pkg install isc-dhcp43-server-4.3.0_1

isc-dhcp-serverの設定は以下のように行う。

/usr/local/etc/dhcpd.conf
option domain-name-servers WWW.WWW.WWW.WWW, WWW.WWW.WWW.VVV;
default-lease-time 600;
max-lease-time 7200;
log-facility local7;

subnet 192.168.10.0 netmask 255.255.255.0 {
        range 192.168.10.2 192.168.10.254;
        option routers 192.168.10.1;
        option broadcast-address 192.168.10.255;
}

# 個別設定

host my_router {
        hardware ethernet XX:XX:XX:XX:XX:XX;
        fixed-address 192.168.10.1;
        option host-name "my_router";
}

host my_client1 {
        hardware ethernet XX:XX:XX:XX:XX:XX;
        fixed-address 192.168.10.3;
        option host-name "my_client1";
}
/etc/rc.conf
dhcpd_enable="YES"                      # dhcpd enabled?
dhcpd_flags="-q"                        # command option(s)
dhcpd_conf="/usr/local/etc/dhcpd.conf"  # configuration file
dhcpd_ifaces="re0"                      # ethernet interface(s)
dhcpd_withumask="022"                   # file creation mask
#dhcpd_chuser_enable="YES"              # runs w/o privileges?
#dhcpd_withuser="dhcpd"                 # user name to run as
#dhcpd_withgroup="dhcpd"                # group name to run as
#dhcpd_chroot_enable="YES"              # runs chrooted?
#dhcpd_devfs_enable="YES"               # use devfs if available?
#dhcpd_rootdir="/var/db/dhcpd"          # directory to run in
#dhcpd_includedir="<some_dir>"		# directory with config-files to include
設定のサンプルは/usr/local/etc/dhcpd.conf.exampleを参照されたし。

isc-dhcp-serverの起動スクリプトは/usr/local/etc/rc.dにある。

/usr/local/etc/rc.d/isc-dhcpd start

pfの設定

PFとはBSD系のパケットフィルタである。PFの詳細については過去の記事を参照されたし。以下にサンプルコードを紹介する。

ext_if="tun0"
int_if="re0"

web_server="192.168.10.4"

rdr on $ext_if proto tcp from any to ($ext_if) port 80 -> $web_server # Webサーバへの通信を別のローカルマシンにリダイレクト
block drop in quick on $ext_if proto tcp from any to ($ext_if) port 22  # 外部からsshへのアクセスをブロック

一覧