Linuxでルーターを作る

提供: Akionux-wiki
Share/Save/Bookmark
移動: 案内検索

概要

Linuxサーバーを用いて市販のブロードバンドルーターのようなルーターを作る。

ここでは、セキュリティは特に考えず、ローカルネットワーク上のマシンがサーバーからDHCPでIPアドレスを取得し、インターネットに繋がるようにするための最小限の設定のみ紹介するので注意。

テスト環境

Slackware Linux 14.0

手順

ネットワークインターフェース

ネットワークインターフェースを2つ用意する。ここでの説明ではeth0がインターネットにつながっていて、eth1がローカルネットワークにつながっているとする。

サーバーのeth1のアドレスは192.168.1.1とする。

ルーティング

ローカルマシンからサーバーへの経路を確保するために次のようなルーティングを行う:

route del -net 192.168.1.0 netmask 255.255.255.0 eth1
route add -net 192.168.1.0 netmask 255.255.255.0 gw 192.168.1.1 eth1

IPフォーワード

次に、IPフォーワードを有効にする。 Slackware Linuxの場合は、rc.ip_forwardというスクリプトが用意されているので、実行可能にしておく:

chmod 755 /etc/rc.d/rc.ip_forward

rc.ip_forwardはrc.inet1でネットワークが確立された後に実行されるrc.inet2の中で実行されるので、実行可能にしておきさえすれば良い。 rc.ip_forwardのやっていることは、/proc/sys/net/ipv4/ip_forwardの値を1にすることでIPフォーワードを有効にする

echo 1 > /proc/sys/net/ipv4/ip_forward

という操作である。

iptablesによるNAT

サーバーを経由するときにアドレスを書き換えるNAT(ネットワークアドレス変換)によって、ローカルマシンはインターネットとのやりとりが可能になる。 NATを有効にするためにiptablesを使う。

次のようなスクリプトでNATを有効にする:

#!/bin/sh
internal_ip='192.168.1.0/24'
iptables -t nat -F
iptables -t nat -A POSTROUTING -o eth0 -s $internal_ip -j MASQUERADE

internal_ipでローカルネットワークを指定し、NATテーブルを指定する-t nat及びまず-Fでルールを消去し、internal_ipからeth0を出て行くルートを通った後マスカレードするというルールを設定している。 これはセキュリティは全く考えていないので必要に応じてその他の設定を行うこと。

Slackware Linuxではrc.inet2がiptablesのスクリプト/etc/rc.d/rc.firewallが実行可能であれば実行するようになっている。 rc.firewallは自分で作らない限り存在しないので、先ほどのスクリプトの内容で作成する。

DNSサーバー

ローカルマシンが名前解決を行うためにはDNSサーバーを持っておく必要がある。 とはいっても、単にフォーワードすれば良いだけなので、大したことではない。

BINDをインストールしたら、/etc/named.confのoptionsの項目にforwardersという項目を次のように追加しよう[1]:

options {
        directory "/var/named";
        /*
         * If there is a firewall between you and nameservers you want
         * to talk to, you might need to uncomment the query-source
         * directive below.  Previous versions of BIND always asked
         * questions using port 53, but BIND 8.1 uses an unprivileged
         * port by default.
         */
        // query-source address * port 53;
        forwarders{
                xxx.xxx.xxx.xx;
                yyy.yyy.yyy.yy;
        };
};

ここで、xxx.xxx.xxx.xxとyyy.yyy.yyy.yyはプロバイダなどから提供されている、サーバーが使っているDNSサーバーのアドレスである。

Slackware Linuxではbindもrc.inet2が/etc/rc.d/rc.bindが実行可能であれば起動してくれるようになっている。

sudo chmod 755 /etc/rc.d/rc.bind

DHCPサーバー

ローカルマシンにアドレスを割り振り、DNSサーバーのアドレス(自分自身のアドレス)を指定させる必要がある。

dhcpdをインストールし、/etc/dhcpd.confに次のような内容を編集する[2]:

ddns-update-style interim;
ignore client-updates;

subnet 192.168.1.0 netmask 255.255.255.0 {

        option routers                  192.168.1.1;
        option subnet-mask              255.255.255.0;
        #option domain-name              "example.jp";
        option domain-name-servers      192.168.1.1;
        option time-offset              -18000; # Eastern Standard Time

        range dynamic-bootp 192.168.1.2 192.168.1.100; #←割り当てるIPアドレスの範囲
        default-lease-time 21600; #←クライアントが期限を求めない場合の割り当て期間(秒)
        max-lease-time 43200; #←クライアントが期限を求めた場合の最大割り当て期間(秒)

}

ルーターとDNSサーバーを自分のアドレスに指定している。

DHCPサーバーによるアドレスのリース状況は

/var/state/dhcp/dhcpd.leases

を読むと確認できる。

クライアント側

ローカルネットワークのクライアントはネットワークにつなげばDHCPサーバーからアドレスとDNSサーバーのアドレス(/etc/resolv.conf内に書いてある)が設定され、特に何の設定もなくインターネットにつなげるはずである。

References

  1. 鶴長鎮一, 実用 BIND 9で作るDNSサーバ(最終回):BIND 9を徹底活用するためのTips集 (2/2) - @IT http://www.atmarkit.co.jp/ait/articles/0405/15/news015_2.html
  2. 北浦訓行, @IT:DHCPサーバを立てるには http://www.atmarkit.co.jp/flinux/rensai/linuxtips/539usedhcpd.html