メインコンテンツまでスキップ

基本的な IPv4 NAT ルーター

DHCP WAN、LAN アドレス、DHCPv4 サーバー、NAT44 を持つ小さな IPv4 ルーター

これは、テスト用 LAN の端末がルーターから DHCP(アドレスを自動で配る仕組み)で private IPv4 アドレスを受け取り、ルーターが WAN 側の IPv4 へ NAT(アドレスの書き換え)して 外へ出す例です。最初は 隔離した Ubuntu Server VM と VM コンソールで試してください。

完全な YAML は examples/example-basic-ipv4-nat.yaml にあります。

本番用の安全設計ではありません

この例にはファイアウォール用リソースも含まれますが、routerd の ファイアウォール機能は現在も土台を整えている段階です。 インターネットに公開するルーターや、家・学校・職場の唯一の防御としては 使わないでください。

構成

テスト用上流ネットワーク
|
ens18 (WAN, DHCPv4)
|
[ routerd VM ]
|
ens19 (LAN, 192.168.10.1/24)
|
テスト用クライアント
場所役割主なリソース
WAN上流から IPv4 を DHCP で受けるInterface/wanDHCPv4Client/wan-dhcpv4
LANルーター自身の IPv4 と DHCP の範囲Interface/lanIPv4StaticAddress/lan-baseDHCPv4Server/lan-dhcpv4
NATLAN の IPv4 が WAN に出るときだけ書き換えるNAT44Rule/lan-to-wan

VM の NIC 名、LAN の番号、DHCP の範囲は例です。管理用 NIC と重ならない値に 変えてください。

要点となる設定

WAN は、最初は外部のネットワーク設定が所有します。LAN は routerd が管理します。

- apiVersion: net.routerd.net/v1alpha1
kind: Interface
metadata:
name: wan
spec:
ifname: ens18
adminUp: true
managed: false
owner: external

- apiVersion: net.routerd.net/v1alpha1
kind: Interface
metadata:
name: lan
spec:
ifname: ens19
adminUp: true
managed: true
owner: routerd

- apiVersion: net.routerd.net/v1alpha1
kind: IPv4StaticAddress
metadata:
name: lan-base
spec:
interface: lan
address: 192.168.10.1/24

LAN の DHCP サーバーは、LAN のアドレスをゲートウェイとしてクライアントへ配ります。

- apiVersion: net.routerd.net/v1alpha1
kind: DHCPv4Server
metadata:
name: lan-dhcpv4
spec:
interface: lan
addressPool:
start: 192.168.10.100
end: 192.168.10.199
leaseTime: 12h
gatewayFrom:
resource: IPv4StaticAddress/lan-base
field: address
# この学習用の例では、routerd 自身ではなく外部 DNS を配る。
dnsServers:
- 1.1.1.1
- 1.0.0.1

NAT44Rule の形

NAT の項目名は typeegressInterfacesourceRanges です。

- apiVersion: net.routerd.net/v1alpha1
kind: NAT44Rule
metadata:
name: lan-to-wan
spec:
type: masquerade
egressInterface: wan
sourceRanges:
- 192.168.10.0/24
excludeDestinationCIDRs:
- 10.0.0.0/8
- 172.16.0.0/12
- 192.168.0.0/16

sourceRanges は NAT してよい送信元だけを示します。 excludeDestinationCIDRs は、ほかのプライベートネットワークへの通信を うっかり NAT しないための例です。実際の上流や VPN と重なる範囲は、 自分の構成に合わせて見直します。

DNS は何を配るか確認する

この例の DHCP は、外部 DNS (1.1.1.11.0.0.1) をクライアントへ配ります。 利用を許可された DNS を自分のネットワークに合わせて選んでください。routerd 自身を DNS サーバーとして配りたいときは、先に DNSResolver などの DNS サービスを追加します。

daemon の前に確認する

例をコピーして NIC 名とアドレスを直したら、サービスを起動する前に確認します。

cp examples/example-basic-ipv4-nat.yaml ./router.yaml
LAB_DIR="$(mktemp -d)"
sudo routerd validate --config ./router.yaml
sudo routerd apply --config ./router.yaml --once --dry-run --skip-service-manager \
--state-file "$LAB_DIR/state.db" \
--ledger-file "$LAB_DIR/ledger.db" \
--status-file "$LAB_DIR/status.json"
sudo sed -n "1,160p" "$LAB_DIR/status.json"

dry-run の出力で、WAN と LAN の名前、DHCP の範囲、NAT の送信元が正しいことを 確認します。管理用 NIC や、普段のネットワークの範囲が入っていたら先へ進みません。

サービス起動後の確認

VM コンソールを開いたまま設定を標準の場所に置き、サービスを起動した後でrouterctl を使います。

sudo install -m 0600 ./router.yaml /usr/local/etc/routerd/router.yaml
sudo systemctl enable --now routerd.service
sudo systemctl is-active routerd.service
sudo routerctl get status
sudo routerctl describe DHCPv4Client/wan-dhcpv4
sudo routerctl describe NAT44Rule/lan-to-wan
sudo nft list table ip routerd_nat

LAN クライアントには DHCP を受けさせるか、手動で 192.168.10.x/24 と ゲートウェイ 192.168.10.1 を設定します。DNS は例の外部アドレスを使うか、 自分の LAN 用 DNS を設定してから確認します。

関連項目