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
-
NATを使用するには前述の設定が必要である。OS起動後にこの値を変更するには、次のような処理を行えば良い。net.inet.ip.forwarding=1
user% sysctl net.inet.ip.forwarding=1
pppの設定
私の環境ではPPPoEを使ってWANに接続する。PPPoEクライアントにはpppを使用する。設定は次のように行う。
- /etc/ppp/ppp.conf
#から行末まではコメント。authnameとauthkeyはプロバイダから渡されたアカウントとパスワードを使用する。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
- /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の設定はどちらかだけで良い(両方あっても問題なく動作するようだが)。
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サーバには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
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へのアクセスをブロック