【Ubuntu 24.04】【UFW】【NAPT】netplan によるネットワーク設定 (IPv4/IPv6)

ネットワーク設定情報

NICインタフェースを複数持ち、片方をインターネット用、もう片方を内部ネットワークとして設定を行う。
この時インタフェース名称が MAC アドレスから生成されて分かりにくい為、別名に変更を行う。また、内部ネットワークがインターネット可能なように Source NAPT を行う。

役割インターネット用内部ネットワーク用
物理インタフェースenx000000aaaaaaenx000000bbbbbb
インタフェースの別名en0en1
IPv4 AddressDHCPv4192.168.254.254/24
GatewayDHCPv4
DNS Server (search)DHCPv4192.168.254.254 (net.home)
Static Routes (nexthop)192.168.64.0/18 (192.168.254.32)
IPv6 AddressRAfd00:0:0:fe::fe/64
※SLAACによる一時アドレス停止
GatewayRA
DNS Server (search)RAfd00:0:0:fe::fe (net.home)
Static Routes (nexthop)fd00:0:0:40::/58 (fd00:0:0:fe::20)
インタフェース設定

Source NAT は UFW を使用して行う。このポリシー情報は以下となる。

ActionSource AddressDestination AddressIN Device
IPv4 ポリシーAllow IN192.168.0.0/16Anyen1
Route Allow IN192.168.0.0/16Anyen1
IPv6 ポリシーAllow INfd00::/8Anyen1
Route Allow INfd00::/8Anyen1
UFW 設定

設定前のハードウェア情報を確認する。

$ sudo lshw -C network -short
H/W path             Device     Class          Description
==========================================================
/0/100/1c.1/0        wlp6s0           network        Wireless 7265
/10                  enx000000aaaaaa  network        Ethernet interface
/11                  enx000000bbbbbb  network        Ethernet interface

インタフェース設定

Netplan の config 設定を行う。この時、初期設定ファイルが存在するとインタフェース名でエラーが発生するため、コメントアウトを行う。
【/etc/netplan/50-cloud-init.yaml】

# 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:
    version: 2
    #ethernets:
        #enx000000aaaaaa:
            #dhcp4: true
        #enx000000bbbbbb:
            #dhcp4: true

作成するファイルは適用順番を考慮し、番号を大きくする。この時【accept-ra: false】により、IPv6 固定アドレスに加えて SLAAC による IPv6 アドレス自動構成される事を無効化する。
【/etc/netplan/55-network.yaml】

network:
  version: 2
  ethernets:
    enx000000aaaaaa:
      match:
        macaddress: 00:00:00:aa:aa:aa
      set-name: en0
      dhcp4: true
      dhcp6: false
      accept-ra: true
    enx000000bbbbbb:
      match:
        macaddress: 00:00:00:bb:bb:bb
      set-name: en1
      dhcp4: false
      dhcp6: false
      accept-ra: false
      addresses:
        - 192.168.254.254/24
        - fd00:0:0:fe::fe/64
      routes:
        - to: 192.168.64.0/18
          via: 192.168.254.32
        - to: fd00:0:0:40::/58
          via: fd00:0:0:fe::20
      nameservers:
        addresses:
          - 192.168.254.254
          - fd00:0:0:fe::fe
        search:
          - net.home

設定を反映する。問題なければ制限時間以内に【Enter】キーを押す。

$ sudo netplan try
Do you want to keep these settings?


Press ENTER before the timeout to accept the new configuration


Changes will revert in 116 seconds

【Enter】
Configuration accepted.

設定が反映されたことを確認する。

$ sudo netplan status
     Online state: online
    DNS Addresses: 127.0.0.53 (stub)
       DNS Search: net.home

●  1: lo ethernet UNKNOWN/UP (unmanaged)
      MAC Address: 00:00:00:00:00:00
        Addresses: 127.0.0.1/8
                   ::1/128

●  2: en1 ethernet UP (networkd: enx000000bbbbbb)
      MAC Address: 00:00:00:bb:bb:bb (Lenovo)
        Addresses: 192.168.254.254/24
                   fd00:0:0:fe::fe/64
                   fe80::0000:02ff:febb:bbbb/64 (link)
    DNS Addresses: 192.168.254.254
                   fd00:0:0:fe::fe
       DNS Search: net.home
           Routes: 192.168.64.0/18 via 192.168.254.32 (static)
                   192.168.254.0/24 from 192.168.254.254 (link)
                   fd00:0:0:40::/58 via fd00:0:0:fe::20 metric 1024 (static)
                   fd00:0:0:fe::/64 metric 256
                   fe80::/64 metric 256

●  3: en0 ethernet UP (networkd: enx000000aaaaaa)
      MAC Address: 00:00:00:aa:aa:aa (Apple, Inc.)
        Addresses: 172.20.10.9/28 (dhcp)
                   240b:xxxx:xxxx:xxxx:0200:00ff:feaa:aaaa/64
                   fe80::0200:00ff:feaa:aaaa/64 (link)
    DNS Addresses: 172.20.10.1
                   fe80::xxxx:xxff:fexx:xxxx
           Routes: default via 172.20.10.1 from 172.20.10.9 metric 100 (dhcp)
                   172.20.10.0/28 from 172.20.10.9 metric 100 (link)
                   172.20.10.1 from 172.20.10.9 metric 100 (dhcp, link)
                   240b:xxxx:xxxx:xxxx::/64 metric 100 (ra)
                   fe80::/64 metric 256
                   default via fe80::xxxx:xxff:fexx:xxxx metric 100 (ra)

1 inactive interfaces hidden. Use "--all" to show all

UFW の設定

ルーティング許可設定

ルーティングを行えるように Sysctl の設定を行う。これは UFW から設定を実施する。
【/etc/ufw/sysctl.conf】

net/ipv4/ip_forward=1
net/ipv6/conf/all/forwarding=1

NAPT 設定

UFW のNAPT設定を行う。以下を最後に追記する。
【/etc/ufw/before.rules】

*nat
-F
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 192.168.0.0/16 -o en0 -j MASQUERADE
COMMIT

【/etc/ufw/before6.rules】

*nat
-F
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s fd00::/8 -o en0 -j MASQUERADE
COMMIT

Firewall 設定

UFW の通信許可設定を行う。内部からのトラフィック許可、およびルーティングの許可を実施。

$ sudo ufw disable
$ sudo ufw allow in on en1 from 192.168.0.0/16 to any
$ sudo ufw allow in on en1 from fd00::/8 to any
$ sudo ufw route allow in on en1 from 192.168.0.0/16 to any
$ sudo ufw route allow in on en1 from fd00::/8 to any

設定値を確認し、問題なければ適用を行う。

$ sudo ufw show added
Added user rules (see 'ufw status' for running firewall):
ufw allow in on en1 from 192.168.0.0/16
ufw route allow in on en1 from 192.168.0.0/16
ufw allow in on en1 from fd00::/16
ufw route allow in on en1 from fd00::/8

$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup

状態確認

適用後の状態を確認する。

$ sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), deny (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
Anywhere on en1            ALLOW IN    192.168.0.0/16
Anywhere (v6) on en1       ALLOW IN    fd00::/8

Anywhere                   ALLOW FWD   192.168.0.0/16 on en1
Anywhere (v6)              ALLOW FWD   fd00::/8 on en1
$ sudo ufw status numbered
Status: active

     To                         Action      From
     --                         ------      ----
[ 1] Anywhere on en1            ALLOW IN    192.168.0.0/16
[ 2] Anywhere                   ALLOW FWD   192.168.0.0/16 on en1
[ 3] Anywhere (v6) on en1       ALLOW IN    fd00::/8
[ 4] Anywhere (v6)              ALLOW FWD   fd00::/8 on en1
$ sudo nft list table ip nat
# Warning: table ip nat is managed by iptables-nft, do not touch!
table ip nat {
	chain POSTROUTING {
		type nat hook postrouting priority srcnat; policy accept;
		ip saddr 192.168.0.0/16 oifname "en0" counter packets 1790 bytes 372527 masquerade
	}
}

$ sudo nft list table ip6 nat
# Warning: table ip6 nat is managed by iptables-nft, do not touch!
table ip6 nat {
	chain POSTROUTING {
		type nat hook postrouting priority srcnat; policy accept;
		ip6 saddr fd00::/8 oifname "en0" counter packets 37 bytes 3432 masquerade
	}
}

【参考URL】
18.04 – How to disable temporary/privacy IPv6 addresses?
How to rename a network interface in 20.04
netplanによってネットワークインターフェース名を変更
【Ubuntu】 /etc/netplan/50-cloud-init.yamlを編集するの止めろ
See configured rules even when inactive
NAT and FORWARD with Ubuntu’s ufw firewall