2013年3月12日 星期二

使用 notebook 上的無線網卡來當無線 AP - arch linux 篇

以 notebook 上的無線網卡來當 ap ,讓其他行動裝置可以透過 notebook 上網
wireless ap 伺服器使用 hostapd 。
而自動配發 ip 的 dhcp server 使用 dnsmasq ,比較簡單設定。
步驟如下:
1. 設定 hostapd
2. 設定 dhcp server
3. 設定網路及 nat
4. 啟動
5. 以行動裝置連線測試

 

1. hostapd:

安裝 hostapd:

$ sudo pacman -S hostapd

設定 hostapd:

$ sudo vi /etc/hostapd/hostapd.conf
interface=wlan0
ssid=天氣很好喲
hw_mode=g
channel=1
wpa=2
wpa_psk=7a540b13963e1c4c5e1ad037dca81f12158c87b1b09b1a850e55dfa496d7b4c3
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP

只要注意以上這幾個選項,其他的可以暫時不用管,基本上 hostapd 可以很複雜,配合 radius server 可以讓使用者先連上,再開啟瀏覽器來做認證的方式,這裡不使用那種方式。

#1 - wpa only
#2 - wpa2 only
#3 - both
wpa=3
允許的話,直接用 wpa2 是最好的,若是某些行動裝置並不支援 wpa2,可以將 wpa 也打開或甚至是用 wep,不過,你知道的,鄰居也可以跟你一起用。
wep_default_key=0
wep_key0=123456789a

ssid 可以使用中文耶。這裡設定認證方式為 WPA2,而密碼可以用 wpa_psk 或 wpa_passphrase 來設定,建議以 wpa_psk 的方式,因為有編碼過,無法從設定檔裡直接看到。
wpa_passphrase=this is a passphrase
以 wpa_passphrase 指令來產生 wpa_psk,以 ssid 加上密碼產生出的一段文字
$ wpa_passphrase 天氣很好喲 123456789a
network={
ssid="天氣很好喲"
    #psk="123456789a"
psk=7a540b13963e1c4c5e1ad037dca81f12158c87b1b09b1a850e55dfa496d7b4c3
}

因此,取出 psk= 後面的這串文字放到設定檔中即可
wpa_psk=7a540b13963e1c4c5e1ad037dca81f12158c87b1b09b1a850e55dfa496d7b4c3

 

2. dhcp server 設定:

dhcp server 這裡是使用 dnsmasq,因為比較簡單,若要改用 isc dhcp server 當然也行,請自行設定。

 

安裝 dnsmasq:

$ sudo pacman -S dnsmasq

 

設定 dnsmasq:

$ grep -v -e ^# -e ^$ /etc/dnsmasq.conf
port=0
dhcp-option=6,168.95.192.1,168.95.1.1
interface=wlan0
listen-address=192.168.199.254
dhcp-range=192.168.199.101,192.168.199.150,12h
port=0
dns server listen 的埠,預設是 53,設為 0 表示將 dns server 關閉,dnsmasq 有 dns server 及 dhcp server 的功能,而我們只要用到 dhcp server。
dhcp-option=6,168.95.192.1,168.95.1.1
將 dns server 設成 168.95.192.1 及 168.95.1.1 (hinet dns server) 並送給 dhcp client

 

3.網路設定及 nat 功能:


新增一個設定檔,內容如下:
$ sudo vi /etc/network.d/hostapd
CONNECTION='none'
CONNECTION='ethernet'
DESCRIPTION="wireless ap in master mode with hostapd"
IP="static"
ADDR="192.168.199.254"
INTERFACE=wlan0
SKIPNOCARRIER="yes"

POST_UP="iptables -I FORWARD -s 192.168.199.0/24 -j ACCEPT; iptables -I FORWARD -d 192.168.199.0/24 -j ACCEPT; iptables -t nat -I POSTROUTING -o ppp0 -s 192.168.199.0/24 -j MASQUERADE; sysctl -w net.ipv4.ip_forward=1; iptables -I INPUT -i wlan0 -p udp --dport 67 -j ACCEPT; systemctl start hostapd; systemctl start dnsmasq"

POST_DOWN="systemctl stop hostapd; systemctl stop dnsmasq; iptables -D FORWARD -s 192.168.199.0/24 -j ACCEPT; iptables -D FORWARD -d 192.168.199.0/24 -j ACCEPT; iptables -t nat -D POSTROUTING -o ppp0 -s 192.168.199.0/24 -j MASQUERADE; sysctl -w net.ipv4.ip_forward=0; iptables -D INPUT -i wlan0 -p udp --dport 67 -j ACCEPT"


由於我們 wireless 的設定在 hostapd 中,所以在 netcfg 這邊,完全不要動 wireless 的部份,設成 CONNECTION='none',而系統預設沒有 none 這種 connections,所以我們自己手動建立。
$ cat << EOF > /tmp/none
#!/bin/bash
exit 0
EOF
按 ctrl-d

$ sudo chmod 755 /tmp/none
$ sudo chown root:root /tmp/none
$ sudo mv /tmp/none /usr/lib/network/connections/none

這樣即可產生 none 的 connections,內容是不做任何事,傳回 0
因此設成 CONNECTION='ethernet',將 wlan0 當做 ethernet 來啟動就好,不要套一些 wireless 的設定,如設定 essid 的東西。但由於 ethernet 的 script 中會去偵測網路線是否有插上,可是 wlan0 是無法取得目前狀態是否有插網路線,因此會失敗,無法完成,所以設定檔中要加上 SKIPNOCARRIER 來跳過偵測。

這裡範例對外介面為 ppp0,對內介面為 wlan0,表示在啟動 wlan0 介面後,再將 hostapd 及 dnsmasq 啟動,並設定好 firewall(包含打開 nat 功能、 kernel ip_forward 功能及 dhcp server listen udp port 67);於 wlan0 停止後,自動關閉 dnsmasq 及 hostapd,並關閉 nat 及相關功能。

 

4. 啟動及關閉:


啟動:
$ sudo netcfg hostapd
$ sudo systemctl start netcfg@hostapd

關閉:
$ sudo netcfg down hostapd
$ sudo systemctl stop netcfg@hostapd

開機時啟動:
$ sudo systemctl enable netcfg@hostapd

若無錯誤訊息,此時 wlan0 介面已經起來,hostapd 及 dnsmasq daemon 已在背景跑。

 

5. 連線測試:

這時以手機、平板或另一個無線裝置來連看看,若沒問題的話,應該就可以上網了。
基本上,只有幾個步驟而已,不過要注意的是,若同時有 network-manager 之類的工具,可能會來搶 wlan0,因此要注意將 network-manager 先關閉再進行測試比較不會出狀況。

總結:

arch linux 的 netcfg 功能非常強大且完整,在設定寫了一堆指令,看起來滿亂的,其實可以寫成另外的 script,再由設定檔中呼叫。這裡是為了解說方便,因此全部擠在一起。
原本是直接使用 wireless ad-hoc mode,不用額外裝 daemon,但是後來發現 android 不支援 ad-hoc mode,根本掃描不到 ap,無法使用。因此才改用 hostapd。結果用了 hostapd 後,才發現 hostapd 好強大,不過目前還沒用到其他功能就是。

使用 notebook 上的無線網卡來當無線 AP - debian wheezy 篇


以 notebook 上的無線網卡來當 ap ,讓其他行動裝置可以透過 notebook 上網
wireless ap 伺服器使用 hostapd 。
而自動配發 ip 的 dhcp server 使用 dnsmasq ,比較簡單設定。

步驟如下:
1. 設定 hostapd
2. 設定 dhcp server
3. 設定網路及 nat
4. 啟動
5. 以行動裝置連線測試


1. hostapd:


安裝 hostapd:

$ sudo apt-get install hostapd
$ sudo cp -p /usr/share/doc/hostapd/examples/hostapd.conf.gz /etc/hostapd/
$ sudo gzip -d /etc/hostapd/hostapd.conf.gz

debian wheezy上 hostapd 預設是不會啟動,要修改 /etc/default/hostapd 指定設定檔位置才行。
DAEMON_CONF="/etc/hostapd/hostapd.conf"

設定 hostapd:

$ sudo vi /etc/hostapd/hostapd.conf
interface=wlan0
ssid=天氣很好喲
hw_mode=g
channel=1
wpa=2
wpa_psk=7a540b13963e1c4c5e1ad037dca81f12158c87b1b09b1a850e55dfa496d7b4c3
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP

只要注意以上這幾個選項,其他的可以暫時不用管,基本上 hostapd 可以很複雜,配合 radius server 可以讓使用者先連上,再開啟瀏覽器來做認證的方式,這裡不使用那種方式。

#1 - wpa only
#2 - wpa2 only
#3 - both
wpa=3
允許的話,直接用 wpa2 是最好的,若是某些行動裝置並不支援 wpa2,可以將 wpa 也打開或甚至是用 wep,不過,你知道的,鄰居也可以跟你一起用。
wep_default_key=0
wep_key0=123456789a

ssid 可以使用中文耶。這裡設定認證方式為 WPA2,而密碼可以用 wpa_psk 或 wpa_passphrase 來設定,建議以 wpa_psk 的方式,因為有編碼過,無法從設定檔裡直接看到。

wpa_passphrase=this is a passphrase
以 wpa_passphrase 指令來產生 wpa_psk,以 ssid 加上密碼產生出的一段文字
$ wpa_passphrase 天氣很好喲 123456789a
network={
ssid="天氣很好喲"
    #psk="123456789a"
psk=7a540b13963e1c4c5e1ad037dca81f12158c87b1b09b1a850e55dfa496d7b4c3
}
因此,取出 psk= 後面的這串文字放到設定檔中即可

wpa_psk=7a540b13963e1c4c5e1ad037dca81f12158c87b1b09b1a850e55dfa496d7b4c3


2. dhcp server 設定:

dhcp server 這裡是使用 dnsmasq,因為比較簡單,若要改用 isc dhcp server 當然也行,請自行設定。

安裝 dnsmasq:

$ sudo apt-get install dnsmasq

設定 dnsmasq:

$ grep -v -e ^# -e ^$ /etc/dnsmasq.conf
port=0
dhcp-option=6,168.95.192.1,168.95.1.1
interface=wlan0
listen-address=192.168.199.254
dhcp-range=192.168.199.101,192.168.199.150,12h


port=0
dns server listen 的埠,預設是 53,設為 0 表示將 dns server 關閉,dnsmasq 有 dns server 及 dhcp server 的功能,而我們只要用到 dhcp server。

dhcp-option=6,168.95.192.1,168.95.1.1
將 dns server 設成 168.95.192.1 及 168.95.1.1 (hinet dns server) 並送給 dhcp client


3.網路設定及 nat 功能:

debian 本身有很完整的網路設定機制。
直接編輯 /etc/network/interfaces 檔案,然後以 ifupdown 來啟動或關閉介面即可。

$ sudo vi /etc/network/interfaces
iface wlan0 inet static
    address 192.168.199.254
netmask 255.255.255.0

post-up /etc/init.d/hostapd start
post-up /etc/init.d/dnsmasq start
    post-up iptables -I FORWARD -s 192.168.199.0/24 -j ACCEPT; iptables -I FORWARD -d 192.168.199.0/24 -j ACCEPT; iptables -t nat -I POSTROUTING -o ppp0 -s 192.168.199.0/24 -j MASQUERADE; sysctl -w net.ipv4.ip_forward=1; iptables -I INPUT -i wlan0 -p udp --dport 67 -j ACCEPT

post-down /etc/init.d/dnsmasq stop
    post-down /etc/init.d/hostapd start
post-down iptables -D FORWARD -s 192.168.199.0/24 -j ACCEPT; iptables -D FORWARD -d 192.168.199.0/24 -j ACCEPT; iptables -t nat -D POSTROUTING -o ppp0 -s 192.168.199.0/24 -j MASQUERADE; sysctl -w net.ipv4.ip_forward=0; iptables -D INPUT -i wlan0 -p udp --dport 67 -j ACCEPT

這裡範例對外介面為 ppp0,對內介面為 wlan0,表示在啟動 wlan0 介面後,再將 hostapd 及 dnsmasq 啟動,並設定好 firewall(包含打開 nat 功能、 kernel ip_forward 功能及 dhcp server listen udp port 67);於 wlan0 停止後,自動關閉 dnsmasq 及 hostapd,並關閉 nat 及相關功能。


4. 啟動及關閉:

啟動:
$ sudo ifup wlan0

關閉:
$ sudo ifdown wlan0

若要開機啟動,在 /etc/network/interfaces 中加上:
auto wlan0

若無錯誤訊息,此時 wlan0 介面已經起來,hostapd 及 dnsmasq daemon 已在背景跑。


5. 連線測試:

這時以手機、平板或另一個無線裝置來連看看,若沒問題的話,應該就可以上網了。

基本上,只有幾個步驟而已,不過要注意的是,若同時有 network-manager 之類的工具,可能會來搶 wlan0,因此要注意將 network-manager 先關閉再進行測試比較不會出狀況。



總結:


debian 的 ifupdown 功能非常強大且完整,在設定寫了一堆指令,看起來滿亂的,其實可以寫成另外的 script,再由設定檔中呼叫。這裡是為了解說方便,因此全部擠在一起。

原本是直接使用 wireless ad-hoc mode,不用額外裝 daemon,但是後來發現 android 不支援 ad-hoc mode,根本掃描不到 ap,無法使用。因此才改用 hostapd。結果用了 hostapd 後,才發現 hostapd 好強大,不過目前還沒用到其他功能就是。

2013年3月6日 星期三

遠端即時顯示 console 或 terminal 的工具

有時候,我們必須透過網路,由遠端以語音或文字來指示某人操作某些指令來達成一些事或者幫朋友除錯、排除故障,可是又無法使用 ssh 登入該主機或是根本沒帳號。由於看不到目前遠端的螢幕,無法詳細知道目前狀況,所以要一直請對方執行幾個指令,並將結果 post 上來,實在有點麻煩;或有時對方並沒有確實按照你的指令來做,有漏掉一些,這都會導致無法順利分析出問題來,所以介紹 gems 這個可以即時顯示遠端 console 的工具。

我知道可以開個帳號,二邊都以 ssh 登入,然後使用 “screen -x” or “tmux attach” 來分享畫面,但是,有時只是為了幾個指令就開個帳號什麼的,太麻煩了啦。

gems 是採 client server 架構,可執行 gems-server 於 console 下或 terminal 中,接著可以在本機或別台機器以 gems-client 連過來,即可看到所有 gems-server 中所看到的 console 或 terminal 中的東西,client 只能觀看,無法操作,就類似是 vnc 開啟觀看模式,但是沒有整個圖形介面,只有 console 或 terminal 中的內容。


安裝:

 

debian, ubuntu 安裝:

$ sudo apt-get install gems

在 debian 中的 gems-server 必須以 root 來執行,因為 lock 檔放在 /var/lock 中,可以簡單的以 root 執行,再 su 到一般使用者,或者對 /usr/bin/gems-server 設定成 setuid 即可用一般 user 來執行,不過這樣很危險,萬一 gems-server 有漏洞,就可以遠端取得 root 了;最好的方式是,直接修改原始碼,將 /var/lock/gems-server.6666 改到 /var/tmp/gems-server.6666,重編即可。

於原始碼中 server/source/defaults.h
change
#define LOCK_PREFIX "/var/lock/gems-server."
to
#define LOCK_PREFIX "/var/tmp/gems-server."
重編再安裝即可

更新: (2013/03/10)
debian 或 ubuntu 的 /var/lock 是連結到 /run/lock,而 /run/lock 權限是 1777, 所以任何人都可以寫入,所以以一般使用者執行 gems 即可。
而 arch linux 的 /run/lock 755,因此只有 root 可以寫入,所以在底下 arch linux 中有用 sed 將 /var/lock/gems-server.6666 改到 /var/tmp/gems-server.6666,這樣就可以用一般使用者來執行。

arch linux 安裝:

由於 gems 並不在 arch 中,連 aur 也沒有,所以這裡提供 PKGBUILD,請自行編出並安裝。
產生 PKGBUILD 檔案

$ cat < PKGBUILD
# Author: Diego Essaya
# Author: Emiliano Castagnari (aka Torian)

pkgname=gems
pkgver=1.1.1
pkgrel=1
pkgdesc="The gems system is a client/server application that allows one to show a single console session in different computers or terminals in real time. "
arch=('any')
url="http://gforge.lug.fi.uba.ar/projects/gemsd/"
license=(GPL)
# because the homepage can not be reached, so grab source from debian.
source=(http://ftp.de.debian.org/debian/pool/main/g/gems/$pkgname"_"$pkgver.orig.tar.gz)

build() {
cd $srcdir/$pkgname-$pkgver/
sed -i 's/lock/tmp/' server/source/defaults.h
make PREFIX=/usr MANPATH=/usr/share/man
}

package() {
cd $srcdir/$pkgname-$pkgver/
make PREFIX=/usr MANPATH=$pkgdir/usr/share/man DESTDIR=$pkgdir install
}

md5sums=('1b4eb9b19c7c7bb570721354ffde74f7')
# vim:set ts=2 sw=2 et:
EOF

由於年代久遠,官方網站已連不上,所以原始碼是從 debian 那裡來。


以 PKGBUILD 來下載並編譯
$ makepkg

安裝打包好的 package
$ sudo pacman -U gems-1.1.1-1-any.pkg.tar.xz


使用:

 

伺服器端:

$ gems-server

gems-server 會 listen tcp port 6666,所以要開啟給客戶端連。
預設最多可同時25個 client 連線,可用 -maxconn 調整

結束 gems-server
於 gems-server session 中打指令 exit 或按鍵 ctrl-d 都可結束
也可直接使用 kill pid 的方式,從別的地方結束 gems-server
$ kill $(cat /var/tmp/gems-server.6666)

客戶端:

$ gems-client server-address

如果有如下錯誤:
gems-client: Terminal size too small (minimum required: 65x32).

使用 -i 參數來忽略終端機大小。
$ gems-client -i server-address

在任何時間按 ‘q’ 可結束客戶端程式。

gems 除了能傳送 console 及 terminal 外,也可用來即時傳輸其他資料,只要下 -noscript 參數即可。


註:gems 傳輸過程並沒有加密,使用上請注意,不要傳輸密碼或隱私資料。