ミニPCをUbuntuで無線LANルーター化

概要

メルカリで購入した中古のGK45というLANポートが2つあるミニPCに、Ubuntuをいれて無線LANルータにしてみたのでその記録

動機

NAS自宅サーバ+ルータの機能が一台でできたら機器も減って、きっと省電力のはず。拠点間のVPNとかも簡単にはれそうだし。あとルータ回りでトラブルよくわかるけど、原因自分では深く追えないし、いっそのこと自分で構築する?みたいなところからスタートしています。

ひとまずは実家のルータ+NASにと、Celeron J4105のLANポートが二つついているミニPC「Kodlix GK45」にSSDを追加して、仕上げてみました。

導入したOS

Ubuntu Server 20.04.3 LTS

完成イメージ

2つあるLANポートのうち、一つをWAN側に、もう一つをLAN側にします。
LANのアドレスは
192.168.1.0/24
Wifiの親機としても動いて、WiFiで接続してきた子機も同じLANに繋ぎます。
(よくある無線LANルータの設定)

インターフェース名の調べ方

対応するポートがなんというインターフェース名か(OSでなんという名前で扱われているか)は
ip a
と入力して調べます。LANポートの場合抜き差しすると状態がかわるので、LANポートが複数ある場合は、ポートに抜き差しして、どのインターフェースに変化があるかをしらべて、インターフェース名を特定します。

自分のGK45では下記のようなインターフェース名でしたので、以下、下記の名前で設定していきます。

  • WAN用のポートにする有線LANインターフェース:eno1
  • LAN用のポートにする有線LANインターフェース:enp3s0
  • WiFiインターフェース:wlo2

ルーターに仕立てる設定1:netplan

最近のUbuntuはネットワークの設定をするのはnetplanを使うのが流儀のようです。
netplanで設定していきます。

netplanの設定ファイルは
/etc/netplan/
にあるすべてのファイルを辞書順に読んでいくようです。

ディレクトリにあるすべてのファイルを別の場所に移し、こちらに以下の内容のファイルをつくります。

network:
        ethernets:
                eno1:
                        dhcp4: true
                enp3s0:
                        dhcp4: false
                        optional: true
        bridges:
                br0:
                        interfaces: [enp3s0]
                        addresses: [192.168.1.1/24]
                        nameservers:
                                addresses: [8.8.8.8, 8.8.4.4]
                        optional: true
        version: 2

そのうえで

sudo netplan apply

を実行します。

ここで行っているのは以下の設定です。
eno1はDHCPでアドレスを取得する。
enp3s0ではDHCPでアドレスを取得しない。
br0というブリッジを作り
 そこにenp3s0をつなげる
 IPアドレスを192.168.1.1
 DNSを8.8.8.8, 8.8.4.4

ここで注意ですが、WiFiはnetplanでは扱いません。
(最初はNetplanでやろうとしていたのですが、うまくいかずやめました)
後ほどここで作ったbr0というブリッジにWiFiもつなげます。

ルーターに仕立てる設定2:DHCPサーバ

DHCPサーバを立てます。isc-dhcp-serverを使います。
インストール

sudo apt install isc-dhcp-server

設定ファイルの記述
通常起動したときに監視するインターフェースを指定します。
編集ファイル:/etc/default/isc-dhcp-server

INTERFACESv4="br0"
INTERFACES="br0"

(INTERFACESv4だけでもいいかもしれませんが、一応念のため)

DHCPで払い出す内容の設定:/etc/dhcp/dhcpd.conf

option domain-name-servers 8.8.8.8, 8.8.4.4;
default-lease-time 600;
max-lease-time 7200;
subnet 192.168.1.0 netmask 255.2ip55.255.0 {
  option routers 192.168.1.1;
  option broadcast-address 192.168.1.255;
  option subnet-mask 255.255.255.0;
  range 192.168.1.100 192.168.1.254;
}

適用

sudo systemctl enable isc-dhcp-server
sudo systemctl start isc-dhcp-server

ルーターに仕立てる設定3:NAT

ufwを使用して設定するのが最近の推奨みたいなので、ufwで設定します。
参考:
ufwでNATとポートフォーワード - Qiita

ポートフォワード有効化
/etc/default/ufw

DEFAULT_FORWARD_POLICY=“ACCEPT"

/etc/ufw/sysctl.conf

net/ipv4/ip_forward=1

/etc/ufw/before.rules (最後に追記)

# NAT
*nat
:POSTROUTING ACCEPT [0:0]
:PREROUTING ACCEPT [0:0]
-F
-A POSTROUTING -s 192.168.1.0/24 -o eno1 -j MASQUERADE
COMMIT

(LANからきた通信を、eno1にとおします)

ufw有効化
ufwを有効化すると、基本すべてのポートの通信ができなくなるので、あらかじめ必要なポートを開放しておきます。
ここでは、22番ポート(SSH)と、LAN内からの通信はすべてOKの設定にします。

sudo ufw allow ssh
sudo ufw allow in on br0 to any

有効化

sudo ufw enable

(iptables-persistentなどをインストールしてしまっていると、再起動時にufwが無効化されるので注意(はまった))

ルータに仕立てる設定4:WiFi

hostapdを使います。
インストール

sudo apt install hostapd

設定ファイルの場所を記述
/etc/default/hostapd

DAEMON_CONF="/etc/hostapd/hostapd.conf"

設定ファイルの内容例
/etc/hostapd/hostapd.conf

interface=wlo2
bridge=br0
channel=7
logger_syslog=-1
logger_syslog_level=1
auth_algs=1
wpa=2
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP
ssid=myssid
wpa_passphrase=myoasswd
hw_mode=g
ieee80211n=1
ieee80211ac=0

bridge=br0
とすることで、このWiFiAPをbr0ブリッジに接続されるようになります。
また、
ieee80211n=1
ieee80211ac=1
などと書かないと、11n, 11ac通信が使えません。
hw_modeは、2.4gHz帯ならばg、5gHz帯ならばaになります。
(手元のGK45は5gHz帯に2.4gHz帯で設定していますs。

sudo enable hostapd
sudo start hostapd


ここまでで、よくある無線LANルータの設定になりました。
ここから色々VPNで他拠点とつないだりとか、NASとしての機能を設定したり、Jenkinsなどをたてて自宅サーバとして色々させてみたりとか、やりたいことがUbuntuなので簡単にネットで検索して実現できそうです。
さらにニッチな設定については機会があれば別記事で。