Edited at

有線/無線LANルーターを作ろう!~前編. ルーター構成と必要知識

今家にルーターが欲しくて自作したので、せっかくだから共有します。

ご家庭に埋もれたPCやラズパイ、無線/有線併用のルーターにしませんか?


記事の構成

前後編に分けてまとめて行きたいと思います。ハマったところは主にPC環境構築です。


  • その1. ルーター構成と必要知識の紹介

本記事です。ここではルーターの構成と、その構成要素として必要な技術を紹介します。


  1. ルーター構成の説明


    1. どんなものか?ユースケースの紹介

    2. 構成概要



  2. 必要技術: LANを構築する。


    1. bridgeインターフェイス

    2. NATからの外部アクセス

    3. DHCP

    4. DNS



  3. 必要技術: LAN側デバイスを立ち上げる。


    1. ethernetデバイス

    2. 無線デバイス




  • その2. 作成ソフトウェアの紹介と導入例

次回まとめます。⇒まとめました

実際に作成したソフトウェア、導入機材その構成要素として必要な技術を紹介します。


  1. ソフトウェア説明・使い方

  2. ソフトウェアの導入: 必要機材

  3. ソフトウェアの導入: PC環境構築


1. ルーター構成の説明


ユースケース


  • ご家庭内で、スマホやPC等、複数のマシンをインターネットにつなぎたい!(LANを構築したい)

  • 間取り上プロバイダの無線も有線も使いたい!

  • 余ってるPCで遊びたい!

そんなケースで役に立つルーターです。今もそのルーターを使って書き込みをしています。

市販の無線ルーターを買えばいいのでは


構成概要

次回のソフトウェア構成も入っていますがこんな感じ。

base.png

緑の部分がソフトで何かしないといけないもの。これらを実現するために最初に記載した技術が必要です。

どれもLinuxのコマンドで簡単に出来ます。

余談:bridgeを使うのでwifi, ethernet以外にもデバイスがあるぜ!というコアな方もプラグインを作ればLANに追加可能です。このあたりは次回


2. 必要技術: LANを構築する。

ここではLAN制御の為に使用するコマンドを紹介します。全てroot権限での実行です。


bridgeインターフェイス

複数のデバイス全部に別ネットワークを構築するのは大変なので、bridgeインターフェイスという仮想インターフェイスを作成してLANネットワークをまとめ上げます。

今回は図のようにethernet, wifiをまとめます。


事前準備

brctlというコマンドを使います。もし環境にない場合は、bridge-utilsパッケージをインストールをしてください。

apt install bridge-utils

#or
yum install bridge-utils

また、インターフェイス設定にifconfigを使いたいけどipしかないという方はnet-toolsをインストールしてください。

apt/yumのコマンドは以降省略


設定手順

1.インターフェイスを作成する。ここではbr0を作成します。

brctl addbr br0

2.インターフェイスにIPアドレスを振る。ip addr addifconfig等でIPを振ってください。

ifconfig br0 192.168.1.1 netmask 255.255.255.0

3.立ち上がっているネットワークインターフェイスを追加する。

brctl addif br0 eth0

※追加するネットワークインターフェイスにIPが振られているとうまく動作しないので注意です。

ifconfig eth0 0.0.0.0

設定の確認はbrctl showで出来ます。

うちの設定はこんなの。interfacesに追加したデバイスがあればOK

$ brctl show

bridge name bridge id STP enabled interfaces
br0 8000.503eaa726d10 no enp0s20u4c2
wlp2s0


NATからの外部アクセス

外部ネットワークとアクセスするための転送設定を行います。


事前準備

iptablesというコマンドを使います。もし環境にない場合は、iptablesパッケージをインストールをしてください。


設定手順

1.ipv4の転送設定を有効にする。

sysctl -w net.ipv4.ip_forward=1

#or
echo "1" > /proc/sys/net/ipv4/ip_forward

2.iptablesの設定に以下を追加する。ざっくりいうと「NAT側のパケットをeth0に転送しますよ」って感じなので、コマンドのwan0はWAN側のインターフェイスになります。

iptables -t nat -A POSTROUTING -o wan0 -j MASQUERADE

これで固定IPで接続したとしても外部アクセスとしてping 8.8.8.8くらいは届くようになると思います。


DHCP

固定IPだけだと使いにくいので、DHCPサーバーを導入しましょう。


DHCP && DNS

外部サイトにアクセスするためにDNSサーバーも導入したいので、dnsmasqというコマンドを使います。これはDHCP, DNSの両方が使えるコマンドです。

dnsmasqというコマンドをインストール。DNSサーバーとして動作させるならdnsmasqと実行するだけ。DHCPとしても使う場合は、/etc/dnsmasq.confに以下のような設定をしてあげます。

#192.168.1.100~254を割り振り。IPアドレスのリース時間は最後に

dhcp-range=192.168.1.100,192.168.1.254,86400
#こんな感じにネットマスクもまとめて設定できます。
#dhcp-range=192.168.1.100,192.168.1.254,255.255.255.0,86400

Linux環境設定/dnsmasqをDHCPサーバとして使う場合の最小限の設定例


DHCPのみ

dhcpサーバーのみの場合。今回はdhcpdというコマンドを使用しています。dhcpdパッケージをインストールをしてください。

1.設定ファイルを作成。192.168.1.1がルーター&&DNS。下100~254をアドレスとして使用可能にした場合の例です。


dhcpd.conf

#IPアドレスのリース時間とその最大値(秒)

default-lease-time 86400 ;
max-lease-time 86400 ;
#syslog出力レベル
log-facility local7;

#mainの設定。
subnet 192.168.1.0 netmask 255.255.255.0 {
#192.168.1.100~254を割り振り
range 192.168.1.100 192.168.1.254;
#netmask指定
option subnet-mask 255.255.255.0;
#default gateway指定
option routers 192.168.1.1;
#DHCPで割り当てるDNSサーバー指定
option domain-name-servers 192.168.1.1;
}


2.起動。systemctl start dhcpdでもいいんですが、IF指定したいので敢えて直実行方法を記載。こんな感じでIF指定可能です。

/usr/sbin/dhcpd -f -cf /etc/dhcpd.conf -user dhcpd -group dhcpd --no-pid br0

※最初はVirtualBox環境内、Ubuntuで構築しようとしていたのですが、VirtualBoxとの導通がうまく取れなかったので断念。


3. 必要技術: LAN側デバイスを立ち上げる。


ethernetデバイス

これだけです、簡単。今回はIPアドレスの初期化(ifconfig eth0 0.0.0.0)を忘れずに

#立ち上げ

ifconfig eth0 up
#停止
ifconfig eth0 down


無線LANデバイス

こちらは無線アクセスポイントを立ち上げる必要があります。これもコマンドで実行できます。

ものによってはdriverの追加も必要なのですが、私の環境はいらなかったのでdriver追加は省略。


事前準備

wpa_supplicantというコマンドを使います。もし環境にない場合は、wpa_supplicantパッケージをインストールをしてください。

hostapdというコマンドでもAP動作可能です。


設定方法

1.設定ファイルを作成。mode=2がアクセスポイントの意味。これは2437MHzの周波数帯でssid "testssid"をWPA2-PSKのパスワード"testpassword"で起動しています。ctrl_interfaceは後で使います。


wpa_supplicant.conf

ctrl_interface=/var/run/wpa_supplicant_lan

network={
ssid="testssid"
mode=2
proto=WPA2
psk="testpassword"
frequency=2437
}

2.起動。うまくいけば数秒でスマホ等からもSSIDが見えるようになります。

/sbin/wpa_supplicant -i wlan0 -b br0 -c /usr/local/share/wpa_supplicant.conf -d nl80211

ちなみに、無線のネットワークインターフェイスはwpa_supplicant実行前でもいることはいるので、ifconfig -aで名前の確認をした上でコマンド実行してください。

また、nl80211はドライバ名ですので、非サポートのデバイスなら別のドライバを指定する必要があります。

3.状態を確認。wpa_cliというコマンドで、confに記載したctrl_interfaceにアクセスします。

$wpa_cli -p /var/run/wpa_supplicant_lan/ status

Selected interface 'wlan0'
wpa_state=DISCONNECTED
...


前編まとめ

ルーターを作るというとちょっとハードルが高く見えるけど、そのための情報・ソフトウェアは世の中に転がっていますね。

導通した時の達成感は中々のものですので、皆さんも試してみてはいかがでしょうか?

後編でこれらを使った自作ソフトウェアと導入、環境構築について説明しますので、手番が多くて面倒という方のお役に立てれば幸いです。

2018/08/05 dnsmasqでのDHCPサーバー構築手順を追加しました。


参考情報

必要パッケージまとめ

bridge-utils

net-tools

iptables

dhcpd (/usr/sbin/dhcpdを直打ちしています)

dnsmasq

wpa_supplicant(無線用)

記事素材: いらすとや


  • bridgeインターフェイス

いますぐ実践! Linux システム管理 / Vol.162 brctl でLinuxマシンをHUBにする


  • NATからの外部アクセス

natテーブルを利用したLinuxルータの作成

設定ファイル直書きはやだなと思って調べた結果sysctl -w net.ipv4.ip_forward=1に行きついたサイト

7.4. FORWARD と NAT のルール


  • DHCP

設定ファイルはインストール時の/etc/dhcp/dhcpd.confに書かれていた、「/usr/share/doc/dhcp-4.2.5/dhcpd.conf.example」を参考にしました。

インターフェイス指定コマンド実行の参考

centos7 dhcpd interfaceの記述の件

VMのUbuntuでdhcpを試した時の参考はこちら

Ubuntuのデフォルト、udhcpd

dnsmasqの参考予定

dnsmasqをDHCPサーバとして使う場合の最小限の設定例


  • 無線LANデバイス

地味にNATの話も書いてあっておおって思った

WiFi access point with wpa_supplicant