เคยได้พูดเกี่ยวกับ Wi-Fi access point (AP) ที่หน้า page โดยการใช้ Pi-Point เลยขอทดลองให้ดูกัน ผมมี D-Link DWA-140 RangeBooster N ซึ่งใช้เป็น AP ได้ มันใช้ชิป Ralink RT3072 ถ้าเป็นเครื่องที่ลง Windows ก็สามารถแจกเน็ตด้วยโปรแกรม Connectify ก็ได้ แต่งานนี้ทดลองกับ Raspbian ครับซึ่งเคย sudo apt-get install firmware-ralink มาก่อนใช้แล้วได้ผลครับ
แต่คราวนี้เพื่อที่จะทำ AP โดยใช้ image ของ Pi-Point ซึ่งในเอกสารตัวอย่างของงานนี้ใช้ zd1211-firmware แต่เราใช้ตัวอื่นแล้วจะได้ผลไหมก็ต้องทดลองกัน ทำการ download SD card image ซึ่ง บีบอัดแบบ bzip2 สามารถใช้ bunzip2 ขยายไฟล์ข้างในออกมาแล้วจะได้ไฟล์เกือบ 4GB งานคงต้องใช้ SD card ขนาด 4GiB เพื่อทดลองด้วยนะครับ
แก้ไฟล์ใน SD card ซึ่งคงต้องใช้ Linux เป็นตัวแก้ และต้องได้สิทธิ์ root จึงจะแก้ไขได้ (sudo ก็ได้) และตำแหน่ง path ในการ mount ก็แล้วแต่จะกำหนดด้วยครับคงไม่ได้เริ่มที่ / อีกวิธีแก้ไฟล์ก็คือใช้จาก Raspberry Pi ตัวเองมันเลย มันมี SSH มาให้แล้ว (login:pi password:raspberry เหมือนเดิมครับ) หรือจะต่อกับจอและ keyboard ก็ได้ครับ สำหรับ /etc/network/interfaces ในต้นฉบับใน image ที่ให้มาจะเป็น
auto lo iface lo inet loopback iface eth0 inet dhcp iface wlan0 inet static address 192.168.1.1 netmask 255.255.255.0
ตรง iface eth0 ก็คือ Ethernet บน Raspberry Pi ตั้งให้รับ DHCP จากแหล่งอื่นเหมือนกันครับ ส่วน iface wlan0 ก็คือ Wi-Fi ซึ่งไม่ควรจะตรงกับ network ของ eth0 ที่ให้มาเป็นวง 1 มันซ้ำกับที่ผมใช้งานอยู่ เลยแก้เป็น address 192.168.2.1 จะได้อยู่วง 2 จะได้ไม่ซ้ำครับ ซึ่ง wlan0 จะใช้เป็น pccess point ให้เรา เลยต้องเป็น IP address คงที่ครับ และต้องทำหน้าที่ DHCP server ด้วย
ชื่อ SSID แก้ได้ที่ไฟล์ /etc/hostapd/hostapd.conf
interface=wlan0 driver=nl80211 ssid=test channel=1
โดยที่ให้มาในตอนแรกจะชื่อ test ครับ และ channel ว่าจะใช้ช่องไหนก็แก้ที่ตรงนี้ได้ด้วยเหมือนกัน
ที่ไฟล์ /etc/dnsmasq.conf
# Never forward plain names (without a dot or domain part) domain-needed # Only listen for DHCP on wlan0 interface=wlan0 # create a domain if you want, comment it out otherwise #domain=Pi-Point.co.uk # Create a dhcp range on your /24 wlan0 network with 12 hour lease time dhcp-range=192.168.1.5,192.168.1.254,255.255.255.0,12h # Send an empty WPAD option. This may be REQUIRED to get windows 7 to behave. #dhcp-option=252,"\n"
เนื่องจากเราเปลี่ยนไปใช้วง 2 ต้องแก้ dhcp-range จาก 192.168.1 เป็น 192.168.2 ด้วยนะครับ
และที่ไฟล์ /etc/init.d/pipoint
#!/bin/sh # Configure Wifi Access Point. # ### BEGIN INIT INFO # Provides: WifiAP # Required-Start: $remote_fs $syslog $time # Required-Stop: $remote_fs $syslog $time # Should-Start: $network $named slapd autofs ypbind nscd nslcd # Should-Stop: $network $named slapd autofs ypbind nscd nslcd # Default-Start: 2 # Default-Stop: # Short-Description: Wifi Access Point configuration # Description: Sets forwarding, starts hostap, enables NAT in iptables ### END INIT INFO # turn on forwarding echo 1 > /proc/sys/net/ipv4/ip_forward # enable NAT iptables -F iptables -t nat -A POSTROUTING -j MASQUERADE # start the access point hostapd -B /etc/hostapd/hostapd.conf # restart dhcp #service dnsmasq restart
จะเห็นว่ามีบรรทัด echo 1 > /proc/sys/net/ipv4/ip_forward และ iptables -t nat -A POSTROUTING -j MASQUERADE มาให้เพื่อให้ค้นหาเส้นทางจาก AP ไปยัง Ethernet ได้ และให้เริ่มทำงานเมื่อตอนบูตขึ้นได้
เมื่อบูตขึ้นมาสักพัก ก็มีชื่อ access point test มาให้เห็นแล้วครับ
เมื่อทดลองเข้าใช้งานก็เข้าไปได้ครับ จากนั้นก็ SSH เข้าไปใช้ Raspberry Pi แล้ว ifconfig ดู จะเห็นว่า eth0 อยู่วง 1 และ wlan0 อยู่วง 2
ทำการ traceroute เพื่อดูว่ามันส่งต่อจาก Wi-Fi ไปดึงข้อมูลจาก Ethernet ซึ่งต่อ Internet ได้ไหม ก็ใช้ได้ครับ อาจมีบางจุดสะดุดเล็กน้อย
อันที่จริง อาจต้องหาทางใช้งานแบบ WPA ด้วยละครับเพื่อความปลอดภัย
updated: ถ้าจะใช้แบบเข้ารหัส WPA ก็แก้ไม่ยากครับ ที่ /etc/hostapd/hostapd.conf
interface=wlan0 driver=nl80211 ssid=test hw_mode=g channel=6 macaddr_acl=0 auth_algs=1 ignore_broadcast_ssid=0 wpa=2 wpa_passphrase=mypassword wpa_key_mgmt=WPA-PSK wpa_pairwise=TKIP rsn_pairwise=CCMP
โดยเปลี่ยนที่อยู่ข้างหลัง ssid= เป็นชื่อ SSID อื่น channel= เป็นช่องอื่นๆ และ wpa_passphrase= เป็นรหัสอื่นๆ ตามต้องการ ทดลองแล้วได้ผลใช้งานได้ครับ
ถ้าเป็น Wi-Fi dongle ทั่วๆ ไป คงทำเป็น AP ไม่ได้ แต่อาจทำเป็น Ad-hoc ได้ โดยแก้ที่ /etc/network/interfacesเหมือนกันครับ เพิ่มอีก 4 บรรทัดล่าง
iface wlan0 inet static address 192.168.2.1 netmask 255.255.255.0 wireless-mode ad-hoc wireless-channel 1 wireless-essid test auto wlan0