はじめに
こんにちは.ネットワークエンジニアの「はむ」です.
最近,IPv4 アドレスの枯渇によって,グローバル IPv4 アドレスが 1 つしか保持できないために,たくさんサーバを構築したいのに構築できないという悩みが多いと思います.そこで今回は Linux を用いた簡易 NAPT ルータを構築して,1 つのグローバル IPv4 アドレスで複数のサーバを実行するための設定を紹介します.
NAPT とは?
まずは,NAPT について説明します.
NAPT とは Network Address Port Translation の略称であり,名前の通り,IP アドレスとポート番号を変換する技術のことです.前述の通り,近年はグローバル IPv4 アドレスが枯渇しており,グローバル IPv4 アドレスを大量に所有することは難しくなってきています.
そこで,IPv4 アドレスではなく IPv6 アドレスを使えば良いのでは?と思う方もいるかもしれません.
たしかに IPv6 アドレスはほぼ無限のアドレス空間を持っているため,IPv6 アドレスを利用することで IPv4 アドレスの枯渇問題は解消します.一方で,IPv4 アドレスでしかアクセスできない Web サイトや IPv6 アドレスのルーティングができないネットワークも存在します.IPv6 アドレスへの移行はコストがかかることや不具合が生じる可能性があるため,なかなか IPv4 から IPv6 への移行が進んでいないのが現実です.(ですが筆者は,今後何十年と時間がかかったとしても,必ず IPv6 アドレスに完全移行する日は来るだろうと思っています.)
では,IPv6 アドレスへの移行が進まない中,現在のネットワークではどのように IPv4 アドレスの枯渇問題をクリアしているのでしょうか?
そう,それが NAPT (Network Address Port Translation) です!
NAPT によって,IPv4 アドレスの枯渇問題をクリアすることができます.
NAPT の仕組みは,グローバル IP アドレスとプライベート IP アドレスを 1 対多で紐づけることです.では,どのように紐づけるのでしょうか?
この記事に辿り着いた方は聞いたことがあると思いますが,NAPT にはポートを用います.具体的にはグローバル IPv4 アドレスと 1 つのポート番号の組み合わせをプライベート IPv4 アドレスに紐づけるという方法によって,NAPT を実現します.
グローバル IP と プライベート IP 間の NAPT 設定
ルータの役割を担うサーバにおける設定
まずは,ルーティングを許可するために,IPv4 Forward を on にします./etc/sysctl.conf ファイル中の net.ipv4.ip_forward=0 のコメントアウトを外し,0 を 1 に変更します.
net.ipv4.ip_forward=1ファイルを編集したら,sudo sysctl -p で変更を適用します.これでルーティング自体の設定は完了です.
NAPT (IP マスカレード) の設定 (iptables による設定)
続いて,NAPT の設定です.ここでは iptables を利用する例を説明します.
まずは,iptables をインストールします.
$ sudo apt install iptables-persistentiptables をインストールし終えたら,いよいよ NAPT の設定をします.
プライベートサブネットとインターネットに疎通している側の I/F を調べます.ここでは,ens160 がインターネットに疎通している I/F であり,ens224 がプライベートサブネットであるとします.
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether XX:XX:XX:XX:XX:XX brd ff:ff:ff:ff:ff:ff
altname enp3s0
inet 172.30.0.2/24 brd 172.30.0.255 scope global ens160
valid_lft forever preferred_lft forever
inet6 fe80::XXXX:XXXX:XXXX:XXXX/64 scope link
valid_lft forever preferred_lft forever
3: ens224: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether XX:XX:XX:XX:XX:XX brd ff:ff:ff:ff:ff:ff
altname enp19s0
inet 172.31.0.1/24 brd 172.31.0.255 scope global ens224
valid_lft forever preferred_lft forever
inet6 240b:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX/64 scope global dynamic mngtmpaddr noprefixroute
valid_lft 2026525sec preferred_lft 39325sec
inet6 fe80::XXXX:XXXX:XXXX:XXXX/64 scope link
valid_lft forever preferred_lft forever設定項目を調べたら,下記のコマンドを実施して NAPT を設定します.
$ sudo iptables -t nat -A POSTROUTING -s 172.31.0.0/24 -o ens160 -j MASQUERADE設定が正しく反映されているかどうかを確認して,正しく NAPT が設定されていれば OK.
$ sudo iptables -t nat -nL
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE 0 -- 172.31.0.0/24 0.0.0.0/0これで NAPT ルータ側の設定は終了です.172.31.0.0/24 や ens224 はご自身の環境に合わせて変更してください.
NAPT (IP マスカレード) の設定 (nftables による設定)
nftables を用いて NAPT を設定する際には,/etc/nftables.conf に以下の記述を加えます.ここで,172.31.1.0/24 はプライベートサブネット,ens160 はインターネットに疎通している I/F です.
table ip nat {
chain postrouting {
type nat hook postrouting priority 100; policy accept;
ip saddr 172.31.1.0/24 oif "ens160" masquerade
}
}ファイルを編集したら,変更内容を nftables に適用します.
$ sudo nft -f /etc/nftables.conf設定が正しく反映されているかどうかを確認して,正しく NAPT が設定されていれば OK.
$ sudo nft list ruleset
table ip nat {
chain postrouting {
type nat hook postrouting priority srcnat; policy accept;
ip saddr 172.31.1.0/24 oif "ens160" masquerade
}
}サービスを提供するサーバにおける設定
続いて,複数のサーバを構築する場合のそのサーバに対して設定していきます.
こちらの設定は簡単で,IP アドレスとデフォルトゲートウェイの設定を変更するだけです./etc/netplan/50-cloud-init.yaml (Ubuntuの場合) ファイルを編集します.
ここでは,サーバの IP アドレスを 172.31.0.2/24,デフォルトゲートウェイを先ほど設定した NAPT ルータの IP アドレスである 172.31.0.1 に設定すれば OK.もちろん,サーバの IP アドレスはデフォルトゲートウェイと同じサブネットに属していればネットワークアドレス (例: 172.31.0.0/24) とブロードキャストアドレス (例: 172.31.0.255) を除いて何でも OK.ubuntu のバージョンによっては,デフォルトゲートウェイの設定がない可能性もあるので,その場合は ip r add default コマンドでデフォルトゲートウェイを設定すれば良いです.
# This file is generated from information provided by the datasource. Changes
# to it will not persist across an instance reboot. To disable cloud-init's
# network configuration capabilities, write a file
# /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following:
# network: {config: disabled}
network:
ethernets:
ens160:
addresses:
- 172.31.0.2/24
nameservers:
search:
- example.com
routes:
- to: default
via: 172.31.0.1
version: 2ファイルを保存したら,変更内容を適用する.ここで,変更内容を適用しようとすると,警告が出るかもしれないが,警告であれば無視しても問題ないのでそのままで OK.
$ sudo netplan apply最後に
今回は NAPT に注目して設定してみましたが,前半パートで設定した IPv4 Forward を on にして,ルーティングテーブルを設定するだけで実はルータのように動作させることができるのです!NAPT は使わないけどサーバ間でルーティングしたい場合にはこの記事を思い出して設定してみてください!
コメント