複数 IP を持つ FreeBSD 13.1 でスタティックルートを設定してルーターとして動作させる方法

前書き

我が家では FreeBSD をインストールしたパソコンを 2 つのネットワークの境界に設置している。

言い換えると、この FreeBSD はネットワーク A とネットワーク B に繋がっているわけだ。

  • ネットワーク A = 10.1.0.0/24
  • ネットワーク B = 10.2.0.0/24

で、FreeBSD には 10.1.0.101 と 10.2.0.101 の IP アドレスが設定されている。ここまでが前提のお話である。

ここから例えば、ネットワーク B のパソコンから、ネットワーク A のサーバーに通信させたい場合、FreeBSD をルーターとして動作させることで実現可能だ。

ルーターとして動作するためにはルーティングできる必要がある。ルーティングとは、ネットワーク B から来たパケット (通信) をネットワーク A (またはこの逆) に転送する機能のことだ。

FreeBSD はこの転送機能 (つまりルーティング機能) がデフォルトでは OFF になっている。

このため、まず [1] ルーティング機能を ON にすることと、[2] 具体的にどこの IP アドレス宛の通信を転送させるかの設定 (スタティックルートの設定) が必要になる。(細かく言えばダイナミックルーティングというものもあるがそれについては触れない)

本投稿は [1] と [2] の方法について書いていく。

[1] ルーティング機能を ON にする

/etc/rc.conf に

gateway_enable=”YES”

の 1 行を記載する。

これだけで設定は完了だが、動作として反映させるためにカーネルの設定 (net.inet.ip.forwarding) を変更する。

% sysctl -a net.inet.ip.forwarding
net.inet.ip.forwarding: 0
%

0 はルーティングが動作しないことを意味するのでこれを 1 に変更する。

% sudo sysctl -w net.inet.ip.forwarding=1
net.inet.ip.forwarding: 0 -> 1
% sysctl -a net.inet.ip.forwarding
net.inet.ip.forwarding: 1
%

1 に変更できた。

[2] スタティックルートを追加する

スタティックルートを設定するのに必要な情報は 2 つだ。

  • 宛先 IP アドレス
  • ネクストホップ

「宛先 IP アドレス」で、どこの IP アドレス宛の通信経路を追加するのかを指定し、そこ宛の通信を誰に渡すかを IP アドレスで定義するのがネクストホップだ。

以下の例では、172.16.1.0/24 宛のパケットは 10.1.0.1 の IP アドレス (これは我が家のヤマハルーター) に転送するように設定している。

% sudo route add -net 172.16.1.0/24 10.1.0.1
%

netstat -rn でルーティングテーブルを確認する。

% netstat -rn
Routing tables

Internet:
Destination Gateway Flags Netif Expire
default 10.2.0.254 UGS re0.102
10.1.0.0/24 link#3 U re0.101
10.1.0.101 link#3 UHS lo0
10.2.0.0/24 link#4 U re0.102
10.2.0.101 link#4 UHS lo0
127.0.0.1 link#2 UH lo0
172.16.1.0/24 10.1.0.1 UGS re0.101

Internet6:
Destination Gateway Flags Netif Expire
::/96 ::1 UGRS lo0
::1 link#2 UHS lo0
::ffff:0.0.0.0/96 ::1 UGRS lo0
fe80::/10 ::1 UGRS lo0
fe80::%lo0/64 link#2 U lo0
fe80::1%lo0 link#2 UHS lo0
ff02::/16 ::1 UGRS lo0
%

上記青字の箇所が追加されたことが確認できる。

これで FreeBSD は 172.16.1.0/24 宛のパケットを受け取ると、10.1.0.1 に転送するように動作する。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください