Fedora 21 で PPPoE クライアント + 無線 LAN ルーターを構築する

　IdeaPad S205 (Lenovo, 2011) にインストールした Fedora 21 で PPPoE クライアントと無線Wi-Fiルーターを構築した手順の記録です。

---

　ルーティングとPPPoE接続ができないVDSL宅内装置を有線でラップトップに接続して、ラップトップをWi-Fiアクセスポイント、ルーター、さらにファイアウォールとして構築を試します。ブリッジは使用せず、NAT（DHCPサーバーとIPフォワーディング）を利用する方法で以下のRPMパッケージを使用します。

- [rp-pppoe](https://www.roaringpenguin.com/products/pppoe) PPPoEクライアント
- [hostapd](http://w1.fi/hostapd/) アクセスポイント
- [dhcp](http://isc.org/products/DHCP/) DHCPサーバー
- [iptables](http://www.netfilter.org/) NAT、ファイアウォール

# 1. PPP通信を確立する

　まず、ラップトップをインターネットに繋げるところからはじめます。`pppoe-setup`で ISP から提供されたユーザ名とパスワードを設定して、`pppoe-start`で接続を開始します。

# 2. 無線ネットワークインタフェースを有効化する

　無線LAN側のゲートウェイを用意します。`ip addr add <IFADDR> dev <DEVICE>`で無線ネットワークインタフェースにIPアドレスを設定した後、`ip link set <DEVICE> up`でネットワークインタフェースを有効化します。利用できるネットワークインタフェース名は`iw dev`コマンドで一覧を表示できます。

　下の例では、クラスBのプライベートアドレス `172.16.1.1/24` をネットワークインタフェース `wlp3s0` に割り当てています。

```
$ sudo ip addr add 172.16.1.1/24 dev wlp3s0
$ sudo ip link set wlp3s0 up
$ ifconfig wlp3s0

wlp3s0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.16.1.1  netmask 255.255.255.0  broadcast 0.0.0.0
        ether 94:39:e5:66:2e:b6  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
```

# 3. Wi-Fiアクセスポイントデーモンを起動する

　hostapdの設定ファイル `/etc/hostapd/hostapd.conf` にSSID、パスフレーズ等を設定します。設定ファイルの用意ができたら `sudo service hostapd start` でデーモンを起動します。

```
$ iw dev wlp3s0 info
Interface wlp3s0
	ifindex 3
	wdev 0x1
	addr 94:39:e5:66:2e:b6
	ssid Kalakaua Avenue
	type AP
	wiphy 0
	channel 1 (2412 MHz), width: 20 MHz (no HT), center1: 2412 MHz

$ iw dev wlp3s0 station dump
Station 64:a7:69:7f:4c:f2 (on wlp3s0)
        inactive time:  339 ms
        rx bytes:       145278
        rx packets:     1081
        tx bytes:       222035
        tx packets:     659
        tx retries:     35
        tx failed:      0
        signal:         -35 dBm
        signal avg:     -36 dBm
        tx bitrate:     54.0 MBit/s
        rx bitrate:     54.0 MBit/s
        authorized:     yes
        authenticated:  yes
        preamble:       short
        WMM/WME:        no
        MFP:            no
        TDLS peer:      no
Station 00:24:6b:5b:97:80 (on wlp3s0)
        inactive time:  6764 ms
        rx bytes:       81346
        rx packets:     559
        tx bytes:       247239
        tx packets:     381
        tx retries:     48
        tx failed:      0
        signal:         -55 dBm
        signal avg:     -44 dBm
        tx bitrate:     48.0 MBit/s
        rx bitrate:     6.0 MBit/s
        authorized:     yes
        authenticated:  yes
        preamble:       long
        WMM/WME:        no
        MFP:            no
        TDLS peer:      no
```

　この時点で子機がアクセスポイントに接続できるようになります。ただし、IPはまだ採番されません。

# 4. DHCPデーモンを起動する

　DHCPの設定ファイル `/etc/dhcp/dhcpd.conf` にネットワークアドレス、ブロードキャストアドレス、ネットワークマスク等を設定します。DHCPデーモンは `sudo service dhcpd start` で起動します。

```
DHCPDARGS="wlp3s0";

subnet 172.16.1.0 netmask 255.255.255.0 {
  range 172.16.1.2 172.16.1.254;
  option routers 172.16.1.1;
  option broadcast-address 172.16.1.255
  option domain-name-servers 8.8.8.8, 8.8.4.4;
  default-lease-time 600;
  max-lease-time 7200;
}
```

　DHCPが起動すると、IP採番待ちをしていた子機にアドレスがふられるようになります。

```
$ sudo arp
Address                  HWtype  HWaddress           Flags Mask            Iface
172.16.1.2               ether   00:24:6b:5b:97:80   C                     wlp3s0
172.16.1.4               ether   64:a7:69:7f:4c:f2   C                     wlp3s0
```

　ここまでで無線LANだけは構築できましたが、まだLANとWANが繋がっていません。後続の手順で、プライベートネットワークからインターネットへ接続できるようにiptablesのNAT機能を設定します。

# 5. 無線LANとPPPoEのパケットを転送する

　IPフォワーディングの有効化を確認します。IPフォワーディングを一時的に有効化する場合のコマンドは`sudo sysctl net.ipv4.ip_forward=1`。永続的に有効化する場合は `/etc/sysctl.conf` に `net.ipv4.ip_forward=1` を追記します。

　有効化の確認後、プライベートネットワークから送信するパケットをPPPoEから送信するようネットワークアドレス変換します。追加したルールを機能させるには、既存のルールとの順序を確認しておく必要があります。

```
# POSTROUTINGチェインに、LANから送られるパケットをWANから送りだすよう変換するルールを追加します
$ sudo iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -o ppp0 -j MASQUERADE
$ sudo iptables -t filter -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
$ sudo iptables -t filter -A FORWARD -i wlp3s0 -o ppp0 -j ACCEPT
```

# 6. デーモンの自動起動を設定する

##### 6-1. 無線ネットワークインタフェースの自動起動

`/etc/sysconfig/network-scripts/ifcfg-<DEVICE>` に設定内容を記載します。

```
BOOTPROTO=none
DEFROUTE=yes
DEVICE=wlp3s0
HWADDR=94:39:e5:66:2e:b6
IPADDR=172.16.1.1
NETMASK=255.255.255.0
NETADDR=172.16.1.0
BROADCAST=172.16.1.255
NM_CONTROLLED=no
ONBOOT=yes
TYPE=Wireless
```

##### 6-2. hostapdの自動起動

`$ sudo systemctl enable hostapd`

##### 6-3. dhcpdの自動起動

`$ sudo systemctl enable dhcpd`

##### 6-4. iptablesのIPフォワーディング

　IPフォワーディングを永続的に有効化するため、`/etc/sysctl.conf`に次の設定値を追記します。

```
net.ipv4.ip_forward=1
```

# 参考

- [ソフトウェアアクセスポイント - ArchWiki](https://wiki.archlinuxjp.org/index.php/%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88)
- [インターネット共有 - ArchWiki](https://wiki.archlinuxjp.org/index.php/%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%8D%E3%83%83%E3%83%88%E5%85%B1%E6%9C%89)
- [Man page of IPTABLES](http://linuxjm.osdn.jp/html/iptables/man8/iptables.8.html)
- [Man page of IPTABLES-EXTENSIONS](http://linuxjm.osdn.jp/html/iptables/man8/iptables-extensions.8.html)