Linux
Ubuntu

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

More than 1 year has passed since last update.

短期出張で来た宿泊先に有線LANのネット環境しかなかったので、PCをWiFiアクセスポイントにしたときの手順。
ほぼここの手順のコピーです。情報提供感謝。

環境

構成

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で大抵は大丈夫。
その他の項目は必要に応じて変更。

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。

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名が出てくる。

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

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 start

(追記)
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