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

今家にルーターが欲しくて自作したので、せっかくだから共有します。
ご家庭に埋もれたPCやラズパイ、無線/有線併用のルーターにしませんか？

## **記事の構成**

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

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

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

1. ルーター構成の説明
    1. どんなものか？ユースケースの紹介
    2. 構成概要
2. 必要技術: LANを構築する。
    1. bridgeインターフェイス
    2. NATからの外部アクセス
    3. DHCP
    4. DNS
3. 必要技術: LAN側デバイスを立ち上げる。
    1. ethernetデバイス
    2. 無線デバイス

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

次回まとめます。⇒[まとめました](https://qiita.com/developer-kikikaikai/items/0d8ea1c057302ad26ea9)
実際に作成したソフトウェア、導入機材その構成要素として必要な技術を紹介します。

1. ソフトウェア説明・使い方
2. ソフトウェアの導入: 必要機材
3. ソフトウェアの導入: PC環境構築

## **1. ルーター構成の説明**

### **ユースケース**

- ご家庭内で、スマホやPC等、複数のマシンをインターネットにつなぎたい！(LANを構築したい)
- 間取り上プロバイダの無線も有線も使いたい！
- 余ってるPCで遊びたい!

そんなケースで役に立つルーターです。今もそのルーターを使って書き込みをしています。
~~市販の無線ルーターを買えばいいのでは~~

### **構成概要**

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

<img width="750" alt="base.png" src="https://qiita-image-store.s3.amazonaws.com/0/252277/cc43a232-9237-947d-fb6f-575156cf668b.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 add`や`ifconfig`等で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サーバとして使う場合の最小限の設定例](http://linux.just4fun.biz/?Linux%E7%92%B0%E5%A2%83%E8%A8%AD%E5%AE%9A/dnsmasq%E3%82%92DHCP%E3%82%B5%E3%83%BC%E3%83%90%E3%81%A8%E3%81%97%E3%81%A6%E4%BD%BF%E3%81%86%E5%A0%B4%E5%90%88%E3%81%AE%E6%9C%80%E5%B0%8F%E9%99%90%E3%81%AE%E8%A8%AD%E5%AE%9A%E4%BE%8B)

#### **DHCPのみ**

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

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

```conf: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は後で使います。

```conf: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にする](http://www.usupi.org/sysad/162.html)

- NATからの外部アクセス

[natテーブルを利用したLinuxルータの作成](http://www.atmarkit.co.jp/ait/articles/0505/17/news131_2.html)
設定ファイル直書きはやだなと思って調べた結果`sysctl -w net.ipv4.ip_forward=1`に行きついたサイト
[7.4. FORWARD と NAT のルール](http://web.mit.edu/rhel-doc/4/RH-DOCS/rhel-sg-ja-4/s1-firewall-ipt-fwd.html)

- DHCP

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

インターフェイス指定コマンド実行の参考
[centos7 dhcpd interfaceの記述の件](http://windbell.dip.jp/?p=625)

VMのUbuntuでdhcpを試した時の参考はこちら
[Ubuntuのデフォルト、udhcpd](http://www.si-linux.co.jp/catwiki/index.php?CAT724_dhcp%E3%82%B5%E3%83%BC%E3%83%90)

dnsmasqの参考予定
[dnsmasqをDHCPサーバとして使う場合の最小限の設定例](http://linux.just4fun.biz/?Linux環境設定/dnsmasqをDHCPサーバとして使う場合の最小限の設定例)

- 無線LANデバイス

地味にNATの話も書いてあっておおって思った
[WiFi access point with wpa_supplicant](http://blog.hoxnox.com/gentoo/wifi-hotspot.html)