短期出張で来た宿泊先に有線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で大抵は大丈夫。
その他の項目は必要に応じて変更。
#インタフェース名
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。
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名が出てくる。
毎回コマンド打つのも面倒なのでスクリプト化した。
#!/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