[AlmaLinux 9] ルーターの設定

2024-02-11 公開

ルーターは、コンピュータネットワークにおいて、データを2つ以上の異なるネットワーク間に中継する通信機器です。通信プロトコルに TCP/IP が使われるようになってから普及しました。データをネットワーク層で、どのルートを通して転送すべきかを判断するルート選択機能を持ちます。

Wikipedia より引用
今回のテーマ
  • 複数の NIC(ネットワーク・インターフェイス・カード)を持ったサーバーを、DHCP サービス付きのルーターとして使えるようにします。
    • NTP サーバーも設定します。

--- OUTLINE ---

DHCP サービス付きのルーターにするサーバーの OS は下記のとおりです。

OS AlmaLinux 9.3 (Shamrock Pampas Cat) x86_64

 

AlmaLinux 9

ネットワーク構成

今回使用する AlmaLinux のサーバー (cnction) には、4つの NIC(ネットワーク・インターフェイス・カード)が搭載されています。物理的にマシンに刺さっているデバイス名(ネットワークインターフェース名)は下記のようになっています。

ネットワークインターフェース名一覧
[bitwalk@cnction ~]$ for DEV in `find /sys/devices -name net | grep -v virtual`; do ls $DEV/; done | sort
enp1s0
enp2s0
enp3s0
enp4s0
[bitwalk@cnction ~]$ 

※ 上記コマンドは、参考サイト [1] の記事を参考にさせていただきました。

4つの NIC を利用できますが、今回はそのうち enp1s0enp2s0 の2つの NIC を使用します。

右図に、AlmaLinux (cnction) が扱うネットワーク構成を示しました。

  • 一番目の NIC (enp1s0) は、ケーブルテレビ会社からレンタルしているルーター (BCW720J) の「家庭内 LAN (192.168.0.0/24)」に接続しています。
    • ルーター (BCW720J) は動的に IP アドレスなどを割り当ててくれますが、AlmaLinux のサーバー (cnction) の enp1s0(の MAC アドレス)については、ルーターの Web アプリを使って、IP アドレスを 192.168.0.34 に固定しています。
  • 二番目の NIC (enp2s0) は、評価用に使う「プライベートなネットワーク (192.168.2.0/24)」と「家庭内 LAN」とを接続するためのゲートウェイにします。
    • 「プライベートなネットワーク」からは、「家庭内 LAN」およびインターネットへ接続できるようにします。
  • さらに、AlmaLinux に DHCP サーバーを設定して「プライベートなネットワーク」に接続する PC に、IP アドレスなどを動的に割り当てられるようにします。
    • 割り当てる(リースする)動的な IP アドレスは 192.168.2.100 ~ 192.168.2.200 とします。
  • AlmaLinux に NTP サーバーを設定して「プライベートなネットワーク」に接続する PC から時刻を参照できるようにします。

なお、「プライベートなネットワーク」で使用する接続確認用 PC (silverblue) は、Fedora Silverblue 39 をインストールしたノート PC です。

※ 識者からは叱られそうですが、ここでは、ルーターとゲートウェイを厳密に区別していません。🙇🏻

 

AlmaLinux 9

IP フォワードを有効化

IP フォワードを有効にすることで、2つの NIC の間でパケットを転送できるようにします。

IP フォワードを有効にするには、カーネルパラメータを記述する /etc/sysctl.conf を管理者権限で編集して、下記のように末尾に net.ipv4.ip_forward=1 というパラメータを追加します。

/etc/sysctl.conf
# sysctl settings are defined through files in
# /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/.
#
# Vendors settings live in /usr/lib/sysctl.d/.
# To override a whole file, create a new file with the same in
# /etc/sysctl.d/ and put new settings there. To override
# only specific settings, add a file with a lexically later
# name in /etc/sysctl.d/ and put new settings there.
#
# For more information, see sysctl.conf(5) and sysctl.d(5).
net.ipv4.ip_forward=1

システムの起動時にここに記述されたパラメータが読み込まれますが、すぐに /etc/sysctl.conf の内容を反映させるには、システム管理コマンド sysctl -p を実行します。

[bitwalk@cnction ~]$ sudo sysctl -p
net.ipv4.ip_forward = 1
[bitwalk@cnction ~]$ 

IPv4 のフォワードが有効になっているかどうかは /proc/sys/net/ipv4/ip_forward の内容で確認できます。

[bitwalk@cnction ~]$ cat /proc/sys/net/ipv4/ip_forward
1
[bitwalk@cnction ~]$ 

 

AlmaLinux 9

ゾーンの設定

変更を加える前のゾーン設定は以下のようになっています。

[bitwalk@cnction ~]$ sudo firewall-cmd --get-active-zones
public
  interfaces: enp1s0
[bitwalk@cnction ~]$ 

お恥ずかしい話ですが、デフォルトで用意されているゾーンは、名前によって役割(=設定内容)が異なるということをしっかり認識していなかったために、うまくいかなかったことが、参考サイト [2] であっさり解決してしまいました。ということで、今回はそのゾーン名をそのまま適用することにしました。

RHEL 9 の文書 [3] に詳細な説明があります。

さてゾーンの設定ですが、ネットワークデバイスのインターフェイス enp1s0(家庭内 LAN 側)と enp2s0(プライベートな LAN)のゾーンを、それぞれ externaltrusted に設定します。

[bitwalk@cnction ~]$ sudo firewall-cmd --permanent --zone=external --change-interface=enp1s0
The interface is under control of NetworkManager, setting zone to 'external'.
success
[bitwalk@cnction ~]$ sudo firewall-cmd --permanent --zone=trusted --change-interface=enp2s0
The interface is under control of NetworkManager and already bound to 'trusted'
success
[bitwalk@cnction ~]$ 

※ ゾーンを firewall-cmd コマンドで設定していますが、NetworkManager のコマンドラインインターフェイス nmcli で設定すると警告が表示されないそうです。

設定したゾーンを確認します。

[bitwalk@cnction ~]$ sudo firewall-cmd --reload
success
[bitwalk@cnction ~]$ sudo firewall-cmd --get-active-zones
external
  interfaces: enp1s0
trusted
  interfaces: enp2s0
[bitwalk@cnction ~]$ 

 

AlmaLinux 9

IP マスカレードの有効化

external ゾーンで IP マスカレードを有効にして、「プライベートなネットワーク」の trusted ゾーンから、external ゾーン内のネットワークおよびインターネットにアクセスできるようにします。

[bitwalk@cnction ~]$ sudo firewall-cmd --permanent --zone=external --add-masquerade
success
[bitwalk@cnction ~]$ sudo firewall-cmd --reload
success
[bitwalk@cnction ~]$ 

設定したゾーンの詳細を確認します。

[bitwalk@cnction ~]$ sudo firewall-cmd --list-all --zone=external
external (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp1s0
  sources: 
  services: ssh
  ports: 
  protocols: 
  forward: yes
  masquerade: yes
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
[bitwalk@cnction ~]$ sudo firewall-cmd --list-all --zone=trusted
trusted (active)
  target: ACCEPT
  icmp-block-inversion: no
  interfaces: enp2s0
  sources: 
  services: 
  ports: 
  protocols: 
  forward: yes
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
[bitwalk@cnction ~]$ 

 

AlmaLinux 9

二番目の NIC の設定

NetworkManager のコマンドラインインターフェイス nmcli で、二番目の NIC の IP アドレス enp2s0192.168.2.1/24 に設定します。

[bitwalk@cnction ~]$ sudo nmcli con mod enp2s0 ipv4.addr 192.168.2.1/24

さらに、サーバーの起動後に enp2s0 が自動接続するように設定して、接続をアクティベートします。

[bitwalk@cnction ~]$ sudo nmcli connection modify enp2s0 connection.autoconnect yes
[bitwalk@cnction ~]$ sudo nmcli con up enp2s0
接続が正常にアクティベートされました (D-Bus アクティブパス: /org/freedesktop/NetworkManager/ActiveConnection/4)
[bitwalk@cnction ~]$ 

route コマンドで、ルーティングテーブルの内容を確認します。

[bitwalk@cnction ~]$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.0.1     0.0.0.0         UG    101    0        0 enp1s0
192.168.0.0     0.0.0.0         255.255.255.0   U     101    0        0 enp1s0
192.168.2.0     0.0.0.0         255.255.255.0   U     100    0        0 enp2s0
[bitwalk@cnction ~]$ 

 

Client PC

接続テスト (1) - 固定アドレス

ここまで設定ができたところで、enp2s0trusted ゾーン側)に有線でノート PC (silverblue) を接続して、IP アドレス (192.168.2.2) を手動で設定して、インターネットに接続できるか確認をしました。

DNS は、インターネットのルータ側すなわち external ゾーンで利用しているアドレスを割り当てています。

enp2s0(trusted ゾーン側)に有線で接続して固定 IP を設定

有線でノート PC (silverblue) 上でルーティングテーブルの内容を確認すると、以下のようになっています。

bitwalk@silverblue:~$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.2.1     0.0.0.0         UG    100    0        0 enp0s21f0u5u1
192.168.2.0     0.0.0.0         255.255.255.0   U     100    0        0 enp0s21f0u5u1
bitwalk@silverblue:~$ 

Google Chrome で問題なくインターネットに接続できることを確認できました。

 

AlmaLinux 9

DHCP の設定

まず、DHCP サーバーのパッケージをインストールします。

[bitwalk@cnction ~]$ sudo dnf -y install dhcp-server
...
...

参考サイト [4]/usr/share/doc/dhcp-server/dhcpd.conf.example を参考に、管理者権限で /etc/dhcp/dhcpd.conf を下記のように編集します。

#
# DHCP Server Configuration file.
#   see /usr/share/doc/dhcp-server/dhcpd.conf.example
#   see dhcpd.conf(5) man page
#

# option definitions common to all supported networks...
option domain-name-servers XXX.XXX.XXX.XXX, XXX.XXX.XXX.XXX;

default-lease-time 600;
max-lease-time 7200;

# If this DHCP server is the official DHCP server for the local
# network, the authoritative directive should be uncommented.
authoritative;

# This declaration allows BOOTP clients to get dynamic addresses,
# which we don't really recommend.

subnet 192.168.2.0 netmask 255.255.255.0 {
  range dynamic-bootp 192.168.2.100 192.168.2.200;
  option broadcast-address 192.168.2.255;
  option routers 192.168.2.1;
}

DHCP サーバーが割り当てる IP アドレスの範囲は、192.168.2.100 から 192.168.2.200 までとしました。

/etc/dhcp/dhcpd.conf の記述のやり方は /usr/share/doc/dhcp-server/dhcpd.conf.example によるといろいろ選択できることが判りましたが、とりあえずは参考サイト [3] と同じようにしました。

DHCP サーバーを起動します。

[bitwalk@cnction ~]$ sudo systemctl start dhcpd
[bitwalk@cnction ~]$ sudo systemctl enable dhcpd

ファイアーウォールの設定をします。

[bitwalk@cnction ~]$ sudo firewall-cmd --add-service=dhcp --zone=trusted --permanent
success
[bitwalk@cnction ~]$ sudo firewall-cmd --reload
success
[bitwalk@cnction ~]$ 

 

Client PC

接続テスト (2) - DHCP による自動取得

enp2s0trusted ゾーン側)に有線で接続しているノート PC (silverblue) の接続設定を 自動 (DHCP) 変更しました。

enp2s0(trusted ゾーン側)に有線で接続して IP を自動取得 (1)
enp2s0(trusted ゾーン側)に有線で接続して IP を自動取得 (2)

DHCP サーバが割り当てる範囲の IP アドレスを取得し、Google Chrome でインターネットに接続できることを確認しました。

 

AlmaLinux 9

DHCP サーバー側

DHCP サーバーからクライアントコンピューターに割り付けた(リースした)IP アドレスの情報は、/var/lib/dhcpd 内のファイルに保存されています。

[bitwalk@cnction ~]$ ls /var/lib/dhcpd
dhcpd.leases  dhcpd.leases~  dhcpd6.leases
[bitwalk@cnction ~]$ cat /var/lib/dhcpd/dhcpd.leases 
# The format of this file is documented in the dhcpd.leases(5) manual page.
# This lease file was written by isc-dhcp-4.4.2b1

# authoring-byte-order entry is generated, DO NOT DELETE
authoring-byte-order little-endian;

lease 192.168.2.100 {
  starts 3 2024/02/07 02:41:55;
  ends 3 2024/02/07 02:51:55;
  cltt 3 2024/02/07 02:41:55;
  binding state active;
  next binding state free;
  rewind binding state free;
  hardware ethernet 00:e0:4c:42:54:3a;
  uid "\001\000\340LBT:";
  client-hostname "silverblue";
}
lease 192.168.2.100 {
  starts 3 2024/02/07 02:46:55;
  ends 3 2024/02/07 02:56:55;
  cltt 3 2024/02/07 02:46:55;
  binding state active;
  next binding state free;
  ...
  ...

ネットワークのトラフィックは、ブラウザから Cockpit (https://localhost:9090) にログインして確認できます。

Cockpit によるネットワークの監視

 

AlmaLinux 9

NTP の設定

NTP サーバーの設定は、参考サイト [5] を参考にさせていただいています。

NTP サーバー chrony がインストールされていなければインストールします。

[bitwalk@cnction ~]$ sudo dnf -y install chrony
...
...

管理者権限で、/etc/chrony.conf の下記の赤字の部分を編集します。

# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (https://www.pool.ntp.org/join.html).
#pool 2.almalinux.pool.ntp.org iburst
pool ntp.nict.jp iburst

# Use NTP servers from DHCP.
sourcedir /run/chrony-dhcp

# Record the rate at which the system clock gains/losses time.
driftfile /var/lib/chrony/drift

# Allow the system clock to be stepped in the first three updates
# if its offset is larger than 1 second.
makestep 1.0 3

# Enable kernel synchronization of the real-time clock (RTC).
rtcsync

# Enable hardware timestamping on all interfaces that support it.
#hwtimestamp *

# Increase the minimum number of selectable sources required to adjust
# the system clock.
#minsources 2

# Allow NTP client access from local network.
#allow 192.168.0.0/16
allow 192.168.2.0/24

# Serve time even if not synchronized to a time source.
#local stratum 10

# Require authentication (nts or key option) for all NTP sources.
#authselectmode require

# Specify file containing keys for NTP authentication.
keyfile /etc/chrony.keys

# Save NTS keys and cookies.
ntsdumpdir /var/lib/chrony

# Insert/delete leap seconds by slewing instead of stepping.
#leapsecmode slew

# Get TAI-UTC offset and leap seconds from the system tz database.
leapsectz right/UTC

# Specify directory for log files.
logdir /var/log/chrony

# Select which information is logged.
#log measurements statistics tracking

chronyd を起動して、自動起動するようにもします。

[bitwalk@cnction ~]$ sudo systemctl start chronyd
[bitwalk@cnction ~]$ sudo systemctl enable chronyd

ファイアーウォールに、NTP サービスを許可します。

[bitwalk@cnction ~]$ sudo firewall-cmd --add-service=ntp --zone=trusted --permanent
success
[bitwalk@cnction ~]$ sudo firewall-cmd --reload
success

chrony の動作確認をします。なにか何か結果が帰ってくれば OK です。

[bitwalk@cnction ~]$ sudo chronyc sources
MS Name/IP address         Stratum Poll Reach LastRx Last sample               
===============================================================================
^- ap-northeast-1.clearnet.>     2  10   377   31m   +709us[+2855us] +/-   32ms
^* gw-jp-1.gdn.lonely.obser>     2  10   367   27m  +1424us[+3606us] +/- 6579us
^- 122x215x240x52.ap122.ftt>     2  10   377   24m  +5956us[+5956us] +/-   36ms
^- 20.210.25.42                  2  10   377   31m  +8538us[  +11ms] +/-   87ms

システムを再起動して、ゾーン trusted に接続した PC が NTP サーバーを参照できるようにします。

 

Client PC

接続テスト (3) - NTP サーバの時刻を参照

念のため、ゾーン trusted に有線接続したノート PC (silverblue) から、ntpdate コマンドで NTP サーバの時刻を問い合わせてみます。

ntpdate コマンドを利用するために、ntpsec パッケージを rpm-ostree install でインストールしています。

bitwalk@silverblue:~$ ntpdate -q 192.168.2.1
/usr/lib64/python3.12/site-packages/ntp/util.py:641: SyntaxWarning: invalid escape sequence '\]'
  m = re.match("([:.[\]]|\w)*", inhost)
/usr/lib64/python3.12/site-packages/ntp/util.py:1398: SyntaxWarning: invalid escape sequence '\%'
  if not c.isalnum() and c not in "/.:[] \%\n":
2024-02-08 18:16:05.274945 (+0900) +0.005893 +/- 0.000680 192.168.2.1 s2 no-leap
bitwalk@silverblue:~$ 

なにやら警告が出ていますが、最後の行に時刻が精度付きで表示されました。

 

まとめ

いまどきの有線ルータは、仕様やメーカーにこだわらなければ、5ポートぐらい付いているものが1万円未満で買えて、しかも高機能です。わざわざ Linux マシンでルータを作る需要があるのか、という声もありそうです。

しかし、日頃から Linux をメインの PC として利用しているのであれば、ルーター機能は自分で設定できるようにしたいと考えていました。そのため、わざわざ複数の NIC を搭載した廉価なミニ PC を買っておいたのですが、理解が十分でない中、設定を微妙に変えて再確認をして問題にハマってしまっていて、いままで満足な再現性を得られませんでした。

今回、ある程度納得ができる再現性を得られたので、ノートとしてまとめて掲載しました。内容は随時見直して、改善していくようにします。

 

参考サイト

  1. Linux から認識されている、すべてのネットワークインターフェイス名だけを取得する #Linux - Qiita [2018-07-19]
  2. 【2023年9月版】RHEL9.2 で作る簡単Linuxルーター #RHEL - Qiita [2023-09-01]
  3. ファイアウォールおよびパケットフィルターの設定 Red Hat Enterprise Linux 9 | Red Hat Customer Portal
  4. AlmaLinux 9 : DHCP サーバーの設定 : Server World
  5. AlmaLinux 9 : NTP : サーバーの設定 : Server World

 

ブログランキング・にほんブログ村へにほんブログ村

0 件のコメント: