[FreeBSD 13.1] 1 つの NIC に vlan tag の設定をして IP を 2 個設定する方法

前書き

先日から自宅パソコンに FreeBSD をインストールして使っている。

中古で買ったデルの小型パソコンに FreeBSD 13.1 をインストールした

NIC が 1 個しかないパソコンにインストールしたわけですが、IP を 2 個 (それぞれ違うサブネットの IP) 設定して使いたいというニーズが出てきました。

USB – LAN アダプターをくっつけて NIC を増設することはしたくなかったので、FreeBSD の NIC を vlan tag 設定にし IP を 2 個設定する方法を調べたので記録しておこうと思った。

関連するコマンドとファイル

  • ifconfig コマンド
  • netstat コマンド
  • /etc/rc.conf

NIC のデバイスファイル名

FreeBSD のマニュアル もしくは man vlan した情報によると vlan に対応しているハードウェア (NIC) が書かれている。

At present, these devices are capable of full VLAN processing in hard-ware: ae(4), age(4), alc(4), ale(4), bce(4), bge(4), bxe(4), cxgb(4), cxgbe(4), em(4), igb(4), ixgbe(4), jme(4), liquidio(4), msk(4), mxge(4), nge(4), re(4), sge(4), stge(4), ti(4), and vge(4).

つまり、ここに書かれているデバイスじゃないと本稿で解説する vlan tag の設定などはできない、もしくはちゃんと動作しない可能性が考えられる。

今回僕が FreeBSD をインストールした環境だと re が使用されているためオーケーだ。

現状を確認しておく

FreeBSD は普通にインストールしただけの状態であったため NIC にはすでに IP 1 個が設定済みの状態である。

% ifconfig
re0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        options=8209b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,WOL_MAGIC,LINKSTATE>
        ether 84:7b:eb:eb:44:2e
        inet 10.1.0.101 netmask 0xffffff00 broadcast 10.1.0.255
        media: Ethernet autoselect (1000baseT <full-duplex>)
        status: active
        nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
        options=680003<RXCSUM,TXCSUM,LINKSTATE,RXCSUM_IPV6,TXCSUM_IPV6>
        inet6 ::1 prefixlen 128
        inet6 fe80::1%lo0 prefixlen 64 scopeid 0x2
        inet 127.0.0.1 netmask 0xff000000
        groups: lo
        nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
%

re0 に 10.1.0.101 という IP が設定された状態である。

設定方法

最初に vlan を作る

今回は vlan 101 と vlan 202 を作るコマンドは以下の 2 つだ。

sudo ifconfig vlan101 create
sudo ifconfig vlan202 create

サブインターフェイスを作る

正式な用語がわからなかったのでサブインターフェイスと書いたが、これは re0 という物理インターフェイス (NIC) の中に vlan 101 用と vlan 202 用の論理インターフェイスを作るイメージである。具体的には re0.101 と re0.202 だ。

re0 という親インターフェイスの中に作るから re0.101 と re0.202 を子供と見立ててサブインターフェイスと勝手に呼んでいると捉えていただいて結構だ。

以下のコマンドでサブインターフェイスを作る。

sudo ifconfig re0.101 create
sudo ifconfig re0.202 create

これでサブインターフェイスが作られるので、ココに IP をそれぞれ設定するのである。

サブインターフェイスに IP を設定する

サブインターフェイスに IP を設定する前に、親 (re0) に設定されている IP アドレスを削除する。

sudo ifconfig re0 inet 10.1.0.101 delete

そして、以下のコマンドでサブインターフェイスに IP を設定する。

sudo ifconfig re0.101 inet 10.1.0.101 netmask 255.255.255.0
sudo ifconfig re0.202 inet 172.16.2.101 netmask 255.255.255.0

ここで ping コマンドでネットワーク内にある端末と通信ができればここまではオーケーです。これまでに設定したコマンドが機能していることを意味します。

次は FreeBSD を再起動してもこの設定がされるように作っていきます。

/etc/rc.conf を編集する

編集したあとの rc.conf をお見せする。

% cat /etc/rc.conf
hostname="interface-srv"
keymap="jp.kbd"
ifconfig_re0="up"
cloned_interfaces="re0.101 re0.202"
ifconfig_re0_101="inet 10.1.0.101 netmask 255.255.255.0"
ifconfig_re0_202="inet 172.16.2.101 netmask 255.255.255.0"
defaultrouter="10.1.0.1"
sshd_enable="YES"
ntpdate_enable="YES"
ntpd_enable="YES"
# Set dumpdev to "AUTO" to enable crash dumps, "NO" to disable
dumpdev="AUTO"
zfs_enable="YES"
%

青文字の箇所が今回の設定と関係しているものです。

defaultrouter はデフォルトゲートウェイの設定ですが、これが意図したとおりになっているか確認する必要があります。デフォルトゲートウェイは 2 つ書いたらダメです。1 つです。だから確認をしておきます。

ifconfig_re0=”up” は、re0 を有効化するための設定です (たぶん)

cloned_interfaces=”re0.101 re0.202″ は、サブインターフェイスを明示しています

ifconfig_re0_101=”inet 10.1.0.101 netmask 255.255.255.0″ は、re0.101 の IP アドレス設定です。re0_101 という風にドットではなくアンダーバーになっている点に注意してください。

ifconfig_re0_202=”inet 172.16.2.101 netmask 255.255.255.0″ は、re0.202 の IP アドレス設定です。

再起動して動作を確認する

sudo shutdown -r now などで FreeBSD を再起動します。再起動後に ifconfig で確認します。

% ifconfig
re0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        options=8209b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,WOL_MAGIC,LINKSTATE>
        ether 84:7b:eb:eb:44:2e
        media: Ethernet autoselect (1000baseT <full-duplex>)
        status: active
        nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
        options=680003<RXCSUM,TXCSUM,LINKSTATE,RXCSUM_IPV6,TXCSUM_IPV6>
        inet6 ::1 prefixlen 128
        inet6 fe80::1%lo0 prefixlen 64 scopeid 0x2
        inet 127.0.0.1 netmask 0xff000000
        groups: lo
        nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
re0.101: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        options=80003<RXCSUM,TXCSUM,LINKSTATE>
        ether 84:7b:eb:eb:44:2e
        inet 10.1.0.101 netmask 0xffffff00 broadcast 10.1.0.255
        groups: vlan
        vlan: 101 vlanproto: 802.1q vlanpcp: 0 parent interface: re0
        media: Ethernet autoselect (1000baseT <full-duplex>)
        status: active
        nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
re0.202: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        options=80003<RXCSUM,TXCSUM,LINKSTATE>
        ether 84:7b:eb:eb:44:2e
        inet 172.16.2.101 netmask 0xffffff00 broadcast 172.16.2.255
        groups: vlan
        vlan: 202 vlanproto: 802.1q vlanpcp: 0 parent interface: re0
        media: Ethernet autoselect (1000baseT <full-duplex>)
        status: active
        nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
%

チェックしておきたいところを青文字にしておいた。

このあと ping 8.8.8.8 などでインターネット側と通信できることを確認する。

通信がうまくできないときは netstat でルーティングテーブルを確認するなどして切り分けを行う。

% netstat -r
Routing tables

Internet:
Destination Gateway Flags Netif Expire
default 10.1.0.1 UGS re0.101
10.1.0.0/24 link#3 U re0.101
10.1.0.101 link#3 UHS lo0
localhost link#2 UH lo0
172.16.2.0/24 link#4 U re0.202
172.16.2.101 link#4 UHS lo0

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

これも見るべきポイントになるところを青文字にしておいた。

コメントを残す

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

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