UbuntuDesktopを無線LANルーターにしてみた①-host構築編


まえがき

 自宅では危機的な状況にありました。それは・・・
  ①自宅の無線LANルーターが古くなってきた
  ②Ubuntuの新しいバージョンがリリースされた
  ③自宅のUbuntuサーバーとの距離が近くなった
といったものであります。(②③は関係ないです)
 ということで、この際Ubuntuを無線LANルーター化してしまえ、と思ったのが今回の話。
 と言ってもネットワークのこと全くわからなかったので、いろいろサイト見てでもできずに諦めて半年以上ほったらかして、ChatGPTのスレッドが「これ以上投稿できません」のような表示が2回出るくらい会話して、コマンド叩きまくって、やっと理解してできました。
 未経験者だと、なかなか一朝一夕にはできないと思いますが、やり方をまとめておきます。
 半年以上ほったらかしておいて再度やる気になったのは①が影響大きかったです。

なぜ無線LANルーターになるのか

 通常のWindowsPCでインターネットに接続するには、有線LANを差し込む口と無線LANデバイス(NICと言います)が入っており、有線、無線、いずれでも接続できるようになっています。(尤も最近のPCは軽量化のため有線デバイスは撤去されていることが多いです。)
 有線、無線のデバイスは、そのデバイスの種類ごとにアドレスが変わります。
 なぜかというと、ルーターからローカルIPアドレスが割り振られて、インターネットに接続できるようにルーターが制御するから、であります。(DHCP(で合っているはず・・・))
 ルーターに接続すると何が出来ようになるか、というと
  ①ルーターを介してインターネット接続が可能になる
  ②ルーターに接続した各デバイス間での通信が出来るようになる
  ③デバイスでネットページを作成し、ポートで公開すると、別のデバイスからそのページにアクセスできるようになる
がメインどころとなります。
 では、どうやったらNICをルーターにできるか、です。
 通常ルーター以外のデバイスは、ステーション(駅)モードでルーターに接続されており、各駅に止まれるようにルーターからの電波を「受信」できるようになっています。
 これを「発信」できるようにアクセスポイントモードに設定してあげることでルーターとして通信が可能になるのです。

UbuntuDesktopのみでルーター化する

 使用環境はUbuntu Desktop24.02 LTSです。
 なるべくnetplanや設定をデフォルトのまま使用することで、他のネットワークの設定に影響が出ないようにすることが目的です。

パッケージをインストールする

  まずは以下のコマンドを実行します。

sudo apt-get install iptables-persistent dbus-x11

 ①iptables-persistentはiptablesのルールを保存する
 ②dbus-x11は後述のNetworkManager上でyamlを保存する
ために必要なものです。

コマンドでNetworkManagerを立ち上げる

 nmcliコマンドでアクセスポイントの設定等も可能ですが、せっかくDesktopモードでUbuntuを立ち上げているのと、netplanに書き込まれるyamlの設定が複雑なので、GUIベースで設定をしていきましょう。
 以下のコードを実行するとNetworkManagerのGUI版が立ち上がります。

sudo nm-connection-editor

GUI上での設定方法

 上記コマンドを立ち上げると以下のような設定画面が立ち上がります。

画像は既に設定された画面になりますが大体同じです

 私の環境ではipv6設定も可能ではあるのですが、ipv6は初心者の私には難しかった(NAT無しで動くって何?状態)、なのでipv4で設定することにしました。
 まずはPPPOE接続設定をします。
 上の画像の左下の「+」マークをクリックすると、プルダウンメニューが表示され、ネットワーク設定を選択できます。
 PPPOE設定を選択すると以下の通り。

ユーザー名はマスキングしています
プロバイダから提供されたユーザー名・パスワードを使用してください

 これで、Ubuntuをインターネットに接続する設定は完了です。
 続いて、アクセスポイントを設定します。
 PPPOEを設定したときのように、AccessPointを選択し、以下のように設定します。
 SSIDは任意のIDを入力してください。

 ホットスポット=アクセスポイントモードなのでOK
 「wlp0」はUbuntu上のアクセスポイントの名称です。
 以下のコマンドを使用すると名称が確認できます。

ip a

 全般の設定は変更しなくても良いかもしれません。

 WiFiのパスワードを入力して

 ipv4/ipv6の設定を以下のようにしましょう。


 これで、Ubuntu上に簡易アクセスポイントを作成可能です。
 設定完了するとnetplanにyamlが自動生成されます。
 rendererがNetworkManagerと入力されたyamlを勉強がてら確認してみましょう。(と言いつつ解説できるほどの技量が無いため、解説はご容赦を…)
 設定ファイルは以下に作成されます。 

/etc/netplan/

コマンドでルーター化する

 次にNetworkManagerを使用しない設定でルーター化します。
 ※NetworkManagerが動作しなくなってから設定する前提です。
  パッケージは必ずインストールしておいてください。

パッケージをインストールする

sudo apt-get install iptables-persistent hostapd dnsmasq pppoe pppoeconf

 ①iptables-persistent:前述の通り
 ②hostapd:無線NICをアクセスポイントモードにしてくれるパッケージ
 ③dnsmasq:dhcpサーバー構築用に導入
       isc-dhcp-serverだと①と干渉
 ④pppoe/pppoeconf:PPPOE接続に必要なパッケージ
 それでは設定していきます。

pppoeconfの設定

 まずNetworkManagerを無効化します。
 ※この時点でインターネットへのアクセスができなくなるので注意

sudo systemctl stop NetworkManager
sudo systemctl disable NetworkManager

 続いてpppoe接続設定を実施します。

sudo pppoeconf

 何個かYES/NOの選択が求められるのですが、全てYESで問題無いかと思います。
 ユーザーネーム、パスワードはプロバイダーから提供されたものを使用してください。
 設定完了すると、以下のあたりにconfigが置かれます。
 接続情報が正しく書き込まれているかもチェック

sudo nano /etc/ppp/pap-secrets(chap-secrets) 
sudo nano /etc/ppp/peers/dsl-provider

netplanの設定

 最近のUbuntuではyaml形式のnetplanの設定を使ってネットワークの設定をしていくのが主流です。
 なのでyamlを書いていきましょう。
 ※このファイルがあることによってdhcpや何からやってくれるわけではありません。設計書、設定ファイルでしか無いのでご注意を。
 netplanの設定ファイルは以下に置かれます。
 適当に01-hoge.yamlと作成しておきましょう。
 ※netplanフォルダに置かれた全てのyamlを読み込もうとするので、元から存在するyamlファイルは別のところにバックアップしましょう。

cd /etc/netplan/
sudo nano 01-hoge.yaml

 それでは書き込む内容になります。
 ※私の環境では以下のように記載したら動きましたが、情報共有として、一部間違っている記述、補足があるのでコメントアウトしながら記載します。

network:
  version: 2
  #NetworkManagerで設定したらrendererが変わる
  renderer: networkd
  #有線LANの設定
  ethernets:
    eno1:
      #外部dhcpからグローバルIPを振られるのでyes
      dhcp4: yes
  #無線LANの設定
  wifis:
    wlp0s:
      #hostにdhcpを立ててwlp0sを起点にAP化するのでno
      dhcp4: no
      #固定のローカルIPを設定する
      addresses: [192.168.1.1/24]
      #以下の設定はいらない(接続先WiFiの設定)
      access-points:
        "YourSSID":
          password: "YourPassword"

 yamlを記載したらhostから参照できるようファイルの閲覧権限を変更します。
 変更したらnetplanの設定を反映します。

sudo chmod 600 01-hoge.yaml
sudo netplan apply

hostapdの設定

hostapdの設定ファイルを作成していきます。
 コメントアウトで補足を記載しております。

sudo nano /etc/hostapd/hostapd.conf
(以下記載)
#無線LANのNICの記載
interface=wlp0
#無線LANのドライバ名、基本これ
driver=nl80211
#SSID設定
ssid=YourSSID
#通信設定、g=2.4ghz、a=5ghz
hw_mode=g
#通信の電波帯?5ghzなら36から
#屋外使用が禁止されているものもあるので注意
channel=6
#無線の暗号化モード?n/ac/axで通信できるよう設定
ieee80211n=1
ieee80211ac=1
ieee80211ax=1
#WPA設定、WPA3 AESで設定出来るようにしてある
wpa=2
wpa_key_mgmt=WPA-PSK SAE
wpa_pairwise=CCMP
rsn_pairwise=CCMP
ieee80211w=1
#ネットワークのパスワード
wpa_passphrase=YourPassword

 作成し終えたら上の設定ファイルをhostapdが読み込めるように記載します。

sudo nano /etc/default/hosapd
(以下コメントアウトを外して記載)
DAEMON_CONF="/etc/hostapd/hostapd.conf"

dnsmasqの設定

 家庭用ルーターの設定、ということでdnsmasqを設定しhost上にdhcpサーバーを作成します。
 まずは、dnsmasqをインストールした後生成される設定ファイルのバックアップです。
 その後、設定ファイルに書き込みます。

sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig

sudo nano /etc/dnsmasq.conf
(以下記載) 
interface=wlp0
dhcp-range=192.168.1.10,192.168.1.20,12h
resolv-file=/etc/resolv.dnsmasq.conf

 今回は意図的にdhcpの範囲を同接11台になるように192.168.1.10-20の範囲で設定していますが、家庭用ルーターであれば必要無いと思います。
 続いてresolvファイルの作成です。


sudo nano /etc/resolv.dnsmasq.conf
(以下記載)
nameserver 8.8.8.8
nameserver 8.8.4.4

 リゾルバファイルはdhcpでローカルIPアドレスが振られた各デバイスが要求してきたDNS名を、どこのグローバルIPを目的地としているのか、をDNSサーバー8.8.8.8、8.8.4.4に問い合わせるためのものです。(長い)

 最後にhostapd、dnsmasqを起動して完了です。
 デフォルトで8.8.8.8、8.8.4.4にアクセスするようにsystemd-resolvedが実行されている&dnsmasqを実行するため53番ポートを開ける必要がある、のでsystemd-resolvedの無効化も併せて行います。
 hostapdはunmaskの必要がある場合があるのでこれも実行しました。

#hostapd起動
sudo systemctl unmask hostapd
sudo systemctl enable hostapd
sudo systemctl start hostapd

#systemd-resolvedを停止、無効化後dnsmasq起動
sudo systemctl stop systemd-resolved
sudo systemctl disable systemd-resolved
sudo systemctl start dnsmasq
sudo systemctl restart networking

iptables/IPv4 パケット転送の設定(共通設定)

転送設定

 Ubuntu内のパケットが外部に転送されるように設定します。

sudo nano /etc/sysctl.conf
(以下のコメントアウトを外す)
net.ipv4.ip_forward=1
(保存後以下のコマンドを実行)
sudo sysctl -p

iptablesの設定

#ppp0をデフォルトで通過するようにする
sudo iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
#wanからlanへのパケットで、INPUT(直接通信)は認めない
sudo iptables -A FORWARD -i ppp0 -o wlp0 -m state --state RELATED,ESTABLISHED -j ACCEPT
#lanからwanはすべてのパケットを認める
sudo iptables -A FORWARD -i wlp0 -o ppp0 -j ACCEPT

 コマンドを入力したら、さらに以下のコマンドを入力してiptablesの設定を保存しましょう。

sudo netfilter-persistent save
sudo netfilter-persistent reload

 デフォルトでは、iptablesの設定は再起動すると消えてしまいますが、iptables-persistentをインストールすることで保存可能です。
 以下のコードを実行して保存されたルールを確認できます。

sudo cat /etc/iptables/rules.v4

 UFW等のネットワークツールでは干渉してiptables-persistentはインストールできない可能性があります。

その他使えるかもしれないコマンドリスト

#port53が実行されているか確認
sudo lsof -i :53

#全ポートの確認
sudo lsof -i

#デバイスとIPアドレスの確認
ip a

#ルーティングの確認
ip route
sudo iptables -t nat -L -v -n
sudo iptables -L -v -n


 以上で解説終わりです…がこの話には穴がある、というのは後々解説します。
 長くなりましたので一旦ここまで。(いや、ホント勉強から構築から長かったんですよ、1年くらいかかってましt⋯)

いいなと思ったら応援しよう!