先日、衝動的に買った 4 つの NIC を搭載したミニ PC [1] に、CentOS 8 をインストールしました。IP マスカレードの設定についてしっかり理解をしたいというのがそもそもの動機です。ちょっと贅沢な動機ですが、いまどきのやり方を身に着けるための投資と考えています。
firewalld で IP マスカレードを設定
てはじめに、下記のような構成のネットワークを作ってみました。
- 一番目の ETH0 (enp1s0) は、ケーブルテレビ会社からレンタルしているルータ (BCW720J) と接続したネットワーク (192.168.0.0/24)(接続済み)
- 二番目の ETH1 (enp2s0) は、評価用に使うネットワーク (192.168.2.0/24)
今回は学習が目的ですので、前述した複数の NIC を搭載した CentOS 8 サーバーを家庭内 LAN 内に繋げて、さらにプライベートな LAN を構成しました。この CentOS 8 サーバーに繋がっているネットワークデバイスのインターフェイス enp1s0(家庭内 LAN 側)と enp2s0(プライベートな LAN)の間に IP マスカレードを設定します。
なお、設定の方法は、参考書 [2] の「14-3-2 firewalld におけるIPマスカレード(NAT)の設定」472頁~を参考にしました。
CentOS 8
IP フォワーディングの有効化
まず、カーネルパラメータを記述する /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
追加したカーネルパラメータを有効にします。実際に IPv4 のフォワーディングが有効になったかどうかは /proc/sys/net/ipv4/ip_forward の値で確認できます。
[bitwalk@cnction ~]$ sudo sysctl -p
net.ipv4.ip_forward = 1
[bitwalk@cnction ~]$ cat /proc/sys/net/ipv4/ip_forward
1
[bitwalk@cnction ~]$
CentOS 8
ゾーンの設定
IP マスカレードを設定するネットワークデバイスのインターフェイス enp1s0(家庭内 LAN 側)と enp2s0(プライベートな LAN)のゾーンをそれぞれ home と internal に設定します。
[bitwalk@cnction ~]$ sudo firewall-cmd --permanent --zone=home --change-interface=enp1s0
The interface is under control of NetworkManager, setting zone to 'home'.
success
[bitwalk@cnction ~]$ sudo firewall-cmd --permanent --zone=internal --change-interface=enp2s0
The interface is under control of NetworkManager, setting zone to 'internal'.
success
[bitwalk@cnction ~]$
設定したゾーンを確認します。
[bitwalk@cnction ~]$ sudo firewall-cmd --get-active-zones
home
interfaces: enp1s0
internal
interfaces: enp2s0
libvirt
interfaces: virbr0
[bitwalk@cnction ~]$
CentOS 8
IP マスカレードの有効化
インターフェイス enp1s0(家庭内 LAN 側)のゾーン home に対して IP マスカレードを有効にします。そのあとで firewall の設定を再読み込みします。
[bitwalk@cnction ~]$ sudo firewall-cmd --permanent --zone=home --add-masquerade
success
[bitwalk@cnction ~]$ sudo firewall-cmd --reload
success
[bitwalk@cnction ~]$
各ゾーンの設定状況を確認します。
[bitwalk@cnction ~]$ sudo firewall-cmd --list-all --zone=home
home (active)
target: default
icmp-block-inversion: no
interfaces: enp1s0
sources:
services: cockpit dhcpv6-client mdns samba-client ssh
ports:
protocols:
masquerade: yes
forward-ports:
source-ports:
icmp-blocks:
rich rules:
[bitwalk@cnction ~]$ sudo firewall-cmd --list-all --zone=internal
internal (active)
target: default
icmp-block-inversion: no
interfaces: enp2s0
sources:
services: cockpit dhcpv6-client mdns samba-client ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
[bitwalk@cnction ~]$
firewall-config の使用
firewall-config を利用すると、GUI で filrewall の設定ができます。インストールは次のようにします。
[bitwalk@cnction ~]$ sudo dnf install firewall-config
Extra Packages for Enterprise Linux Modular 8 - 16 kB/s | 9.8 kB 00:00
Extra Packages for Enterprise Linux 8 - x86_64 12 kB/s | 9.7 kB 00:00
google-chrome 15 kB/s | 1.3 kB 00:00
依存関係が解決しました。
================================================================================
パッケージ Arch バージョン リポジトリー サイズ
================================================================================
インストール:
firewall-config noarch 0.7.0-5.el8_1.1 AppStream 158 k
トランザクションの概要
================================================================================
インストール 1 パッケージ
ダウンロードサイズの合計: 158 k
インストール済みのサイズ: 1.1 M
これでよろしいですか? [y/N]: y
パッケージのダウンロード:
firewall-config-0.7.0-5.el8_1.1.noarch.rpm 1.0 MB/s | 158 kB 00:00
...
(途中省略)
...
インストール済み:
firewall-config-0.7.0-5.el8_1.1.noarch
完了しました!
[bitwalk@cnction ~]$
firewall-config は以下のように GNOME にアプリ一覧から起動します。アプリ名は「ファイアウォールの設定」になっています。
GNOME のアプリ一覧にある firewall-config(ファイアウォールの設定)
実行例を示しました。さすがに GUI だと設定の変更操作が簡単です。
firewall-config の実行例
動作確認
ゾーン internal にクライアント PC を繋げて動作確認します。
CentOS 8
IP アドレス等の設定
ゾーン home 側のネットワークに繋がっている NIC (enp1s0) は、ケーブルテレビのルータ (BCW720J) の DHCP でアドレスが割り当てられますが、この CentOS 8 サーバーは IP アドレスが 192.168.0.31 固定になるように、ルータ側で設定しています。
CentOS 8: enp1s0 の設定 (192.168.0.31)
ゾーン internal 側のネットワークの NIC (enp2s0) は IP アドレス 192.168.2.1 とサブネットマスク 255.255.255.0 のみ設定しました。
CentOS 8: enp2s0 の設定 (192.168.2.1)
ルーティングテーブルの情報を確認すると以下のようになっています。
[bitwalk@cnction ~]$ netstat -rn
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
0.0.0.0 192.168.0.1 0.0.0.0 UG 0 0 0 enp1s0
192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 enp1s0
192.168.2.0 0.0.0.0 255.255.255.0 U 0 0 0 enp2s0
192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0
[bitwalk@cnction ~]$
Ubuntu 18.04
IP アドレス等の設定(クライアント側)
ゾーン internal 側に一台、クライアント PC を接続し、IP アドレス等を設定しました。OS は Ubuntu 18.04 です。IP アドレスに 192.168.2.2、サブネットマスクは 255.255.255.0、デフォルトゲートウェイを 192,168,2,1 としました。このままでは名前解決ができないので、とりあえず、enp1s0 に設定したもの同じ DNS のアドレスを設定しました。
Ubuntu 18.04: ネットワークの設定 (192.168.2.2)
同じようにルーティングテーブルの情報を確認すると以下のようになっています。
(venv) bitwalk@ubuntu-pc:~$ netstat -rn
カーネルIP経路テーブル
受信先サイト ゲートウェイ ネットマスク フラグ MSS Window irtt インタフェース
0.0.0.0 192.168.2.1 0.0.0.0 UG 0 0 0 enp3s0f2
169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 enp3s0f2
192.168.2.0 0.0.0.0 255.255.255.0 U 0 0 0 enp3s0f2
(venv) bitwalk@ubuntu-pc:~$ route
カーネルIP経路テーブル
受信先サイト ゲートウェイ ネットマスク フラグ Metric Ref 使用数 インタフェース
default _gateway 0.0.0.0 UG 100 0 0 enp3s0f2
link-local 0.0.0.0 255.255.0.0 U 1000 0 0 enp3s0f2
192.168.2.0 0.0.0.0 255.255.255.0 U 100 0 0 enp3s0f2
(venv) bitwalk@ubuntu-pc:~$
169.254.0.0 はリンクローカルアドレスという領域です。DHCP サーバ(プライベート IP アドレスを割り当てる役目を持ったサーバ)が存在しないネットワーク内で使われる、特別なIPアドレスです。なぜ割り当てられたのか不思議ですが、DHCP が使えないローカルのネットワークで APIPA が有効になるのしょうか。このルートがあっても害はなさそうですので、とりあえず放置します。
これで、インターネットへのアクセスができることを確認できました。ゾーン internal から home へのアクセスも大丈夫そうですが、その逆、home から internal への経路が取れません。ひきつづき調査を続けます。
参考サイト
- bitWalk's: ミニ PC を衝動買い [2020-04-21]
- CentOS8 実践ガイド[システム管理編] - インプレスブックス
にほんブログ村