ルーターは、コンピュータネットワークにおいて、データを2つ以上の異なるネットワーク間に中継する通信機器です。通信プロトコルに TCP/IP が使われるようになってから普及しました。データをネットワーク層で、どのルートを通して転送すべきかを判断するルート選択機能を持ちます。
- 複数の 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 を利用できますが、今回はそのうち enp1s0 と enp2s0 の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 というパラメータを追加します。
# 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)のゾーンを、それぞれ external と trusted に設定します。
[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 アドレス enp2s0 を 192.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) - 固定アドレス
ここまで設定ができたところで、enp2s0(trusted ゾーン側)に有線でノート PC (silverblue) を接続して、IP アドレス (192.168.2.2) を手動で設定して、インターネットに接続できるか確認をしました。
DNS は、インターネットのルータ側すなわち external ゾーンで利用しているアドレスを割り当てています。
有線でノート 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 による自動取得
enp2s0(trusted ゾーン側)に有線で接続しているノート PC (silverblue) の接続設定を 自動 (DHCP) 変更しました。
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) にログインして確認できます。
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 を買っておいたのですが、理解が十分でない中、設定を微妙に変えて再確認をして問題にハマってしまっていて、いままで満足な再現性を得られませんでした。
今回、ある程度納得ができる再現性を得られたので、ノートとしてまとめて掲載しました。内容は随時見直して、改善していくようにします。
参考サイト
- Linux から認識されている、すべてのネットワークインターフェイス名だけを取得する #Linux - Qiita [2018-07-19]
- 【2023年9月版】RHEL9.2 で作る簡単Linuxルーター #RHEL - Qiita [2023-09-01]
- ファイアウォールおよびパケットフィルターの設定 Red Hat Enterprise Linux 9 | Red Hat Customer Portal
- AlmaLinux 9 : DHCP サーバーの設定 : Server World
- AlmaLinux 9 : NTP : サーバーの設定 : Server World
にほんブログ村
0 件のコメント:
コメントを投稿