LinuxPCをWiFiアクセスポイントにする

短期出張で来た宿泊先に有線LANのネット環境しかなかったので、PCをWiFiアクセスポイントにしたときの手順。
ほぼ[ここ](http://netbuffalo.doorblog.jp/archives/3895783.html)の手順のコピーです。情報提供感謝。

# 環境
## 構成
PCをWiFiルータとする。WiFiクライアント(スマホ等)は、PC上に立ち上げたアクセスポイントを経由してインターネット接続する。

```
          有線       WiFi
InternetーーーーーPCーーーーースマホ,タブレット
            eth0  wlan0
```

## PC環境
- Linux Mint 17.2(Ubuntuなら同じ手順でいけるはず)
- hostapd 2.1
- dhcpd 4.2.4

# 構築
アクセスポイントとしてhostapdを使用する。

### hostapdインストール
```
$ sudo apt-get install hostapd
```

### hostapdの設定

```
$ sudo vi /etc/hostapd/hostapd.conf
```

ssidがアクセスポイント名、wpa_passphraseがアクセス時のパスワードになるので各自で設定。 
interfaceは大抵はwlan0になるはず。(複数の無線インタフェースを持つようなPCでもない限り)
driverはnl80211で大抵は大丈夫。
その他の項目は必要に応じて変更。

```properties:hostapd.conf
#インタフェース名
interface=wlan0
#無線LANアダプタのドライバ
driver=nl80211
#クライアントに表示される無線LANアクセス・ポイント（SSID）名 
ssid=MYAP
hw_mode=g
channel=7
wpa=2 # WPA2
#認証パスワード 
wpa_passphrase=wifipasswd
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP
```

上記で作成したファイルをhostapdサービス起動時のファイルとして設定。

```
$ sudo vi /etc/default/hostapd
```

以下を設定
```
DAEMON_CONF="/etc/hostapd/hostapd.conf"
```


### NetworkManagerの停止
NetworkManagerが動作しているとhostapd起動時に以下のようなエラーが出て起動できないため停止しておく。

```
nl80211: Could not configure driver mode
nl80211 driver initialization failed.
hostapd_free_hapd_data: Interface wlan0 wasn't started
```

Network-Managerを停止し、自動起動も無効にする。

```
$ sudo stop network-manager
$ echo "manual" | sudo tee /etc/init/network-manager.override
```

### dhcpdのインストール
WiFi接続した機器へのIPアドレス払い出しにdhcpを使用する。

```
$ sudo apt-get install isc-dhcp-server
```

### dhcpdの設定
```
$ sudo vi /etc/dhcp/dhcpd.conf
```

PCの無線LANのIPアドレスを10.0.0.1とし、クライアントに1.0.0.10〜10.0.0.20の範囲でIPアドレスを払い出すよう設定。
8.8.8.8はGoogleパブリックDNSのIPアドレスなのでそのままでOK。

```text:dhcpd.conf
default-lease-time 600;
max-lease-time 7200;
INTERFACES="wlan0";
option domain-name "";
max-lease-time 7200;
log-facility local7;
 
subnet 10.0.0.0 netmask 255.255.255.0 {
    range 10.0.0.10 10.0.0.20;
    option routers 10.0.0.1;
    option domain-name-servers 8.8.8.8;
}
```

### IPフォワーディングの有効化

```
$ sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"
```

# 実行
iptablesにNAPTのチェインを追加。

````
iptables -t nat -A POSTROUTING -s 10.0.0.0/255.255.255.0 -o eth0 -j MASQUERADE
````

PCの無線LAN側インタフェースの起動。dhcpd.confのoption routersに設定したIPアドレスを指定する。

````
ifconfig wlan0 10.0.0.1 netmask 255.255.255.0 up
````

dhcpd、hostapdの起動。

````
service isc-dhcp-server start
service hostapd start
````

この後スマホ等でWiFiのAPを検索すると、hostapd.confに設定したAP名が出てくる。

毎回コマンド打つのも面倒なのでスクリプト化した。

```bash:access_point.sh
#!/bin/bash

INET_IF=eth0
SUBNET=10.0.0.0
NETMASK=255.255.255.0
AP_ADDR=10.0.0.1
WIFI_IF=wlan0

NAT_CHAIN="-s ${SUBNET}/${NETMASK} -o ${INET_IF} -j MASQUERADE"

start() {
    iptables -t nat -A POSTROUTING $NAT_CHAIN
    ifconfig ${WIFI_IF} ${AP_ADDR} netmask ${NETMASK} up

    service isc-dhcp-server start
    if [ $? != 0 ]; then
        echo "failed to start dhcpd."
        return 1
    fi

    service hostapd start
    if [ $? != 0 ]; then
        echo "failed to start hostapd."
        return 1
    fi

    echo "start access-point."
    return 0
}

stop() {
    service hostapd stop
    service isc-dhcp-server stop
    ifconfig ${WIFI_IF} down
    iptables -t nat -D POSTROUTING $NAT_CHAIN

    echo "stop access-point."
    return 0
}

case $1 in
"start" )
    start
    ;;

"stop" )
    stop
    ;;

*)
    echo "usage: $0 start|stop"
    exit 1
esac
```

アクセスポイント起動

```
$ sudo access_point.sh start
```
(事前にスクリプトに実行権を付与しておくこと)


アクセスポイント停止

```
$ sudo access_point.sh stop
```

(追記)
NetworkManagerを停止すると、Wi-Fi環境に戻ったときにネットワーク接続が出来なくなるので、以下の手順でNetworkManagerの起動を有効化する。

```
$ sudo rm /etc/init/network-manager.override
$ sudo start network-manager
```



# 参考
http://netbuffalo.doorblog.jp/archives/3895783.html
http://maruchan-shiro123.hatenablog.com/entry/2015/04/05/175257