RPi 3 có sẳn wifi chắc chắn tương thích cao với các software cài đặt trên RPi. Cài đặt access point trên RPi 3 không gặp các lỗi đau đầu như:
- Access point không kết nối được internet
- Access point cấp phát ip không đúng định dạng
Script này cũng có thể chạy trên RPi version 2 trở về trước, nếu không gặp phải việc không tương thích với USB Wifi.
#!/bin/bash if [ $# -eq 0 ]; then echo 'Cài đặt access point với LAN và WiFi' echo "Cú pháp: $(basename $0) AP_ip [LAN_ip]" echo '--------------------------------------------' echo 'Thay đổi ssid và mật khẩu của AP tại /etc/hostapd/hostapd.conf' exit fi [[ "$1" =~ [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3} ]] && ap_ip="$1" [[ "$2" =~ [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3} ]] && et_ip="$2" if [ -z "$ap_ip" ]; then echo 'Cần phải chỉ định ip tĩnh cho access point, thí dụ: 192.168.20.1' echo 'ip LAN là ip động nếu không được chỉ định' exit fi echo '1. Cài đặt dnsmasq, hostapd...' sudo apt-get install -y dnsmasq hostapd echo echo '2. Cấu hình wlan0...' [ -e /etc/dhcpcd.conf.orig ] && sudo cp -f /etc/dhcpcd.conf.orig /etc/dhcpcd.conf || sudo cp -f /etc/dhcpcd.conf /etc/dhcpcd.conf.orig if [ ! -z "$et_ip" ]; then sudo sed -i -r -z 's|interface eth0\nstatic ip_address[^\n]+\n||' /etc/dhcpcd.conf cat <<EOF | sudo tee -a /etc/dhcpcd.conf > /dev/null interface eth0 static ip_address=${et_ip}/24 EOF fi sudo sed -i -r -z 's|interface wlan0\nstatic ip_address[^\n]+\n||' /etc/dhcpcd.conf cat <<EOF | sudo tee -a /etc/dhcpcd.conf > /dev/null interface wlan0 static ip_address=${ap_ip}/24 EOF sudo ifdown wlan0 [ -e /etc/network/interfaces.orig ] && sudo cp -f /etc/network/interfaces.orig /etc/network/interfaces || sudo cp -f /etc/network/interfaces /etc/network/interfaces.orig sudo sed -i -z -r "s/(allow-hotplug wlan0).+$/\1\niface wlan0 inet static\naddress ${ap_ip}\nnetmask 255.255.255.0/" /etc/network/interfaces sudo service dhcpcd restart if [ $( ifconfig wlan0 | grep -Po '(?<=inet addr:)([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})') != $ap_ip ]; then echo 'ERROR: Chưa thể cài đặt ip cho access point!' exit fi cat <<EOF | sudo tee /etc/hostapd/hostapd.conf > /dev/null interface=wlan0 driver=nl80211 ssid=New WAP hw_mode=g channel=1 macaddr_acl=0 auth_algs=1 ignore_broadcast_ssid=0 wpa=2 wpa_key_mgmt=WPA-PSK wpa_passphrase=pAsSw0rD wpa_pairwise=CCMP rsn_pairwise=CCMP EOF sudo sed -i -r 's|#(DAEMON_CONF=)""|\1"/etc/hostapd/hostapd.conf"|' /etc/default/hostapd [ -e /etc/dnsmasq.conf.orig ] && sudo cp -f /etc/dnsmasq.conf.orig /etc/dnsmasq.conf || sudo cp -f /etc/dnsmasq.conf /etc/dnsmasq.conf.orig ext=${ap_ip##*.} dom=${ap_ip%.*} fr=$(( ext += 1 )) to=$(( ext += 18 )) cat <<EOF | sudo tee /etc/dnsmasq.conf > /dev/null interface=wlan0 bind-interfaces server=8.8.8.8 domain-needed bogus-priv dhcp-range=${dom}.${fr},${dom}.${to},12h EOF sudo sed -i -r 's/#(net.ipv4.ip_forward=1)/\1/' /etc/sysctl.conf sudo sh -c 'echo 1 > /proc/sys/net/ipv4/ip_forward' sudo iptables --flush sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE sudo iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT sudo iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT sudo sh -c 'iptables-save > /etc/iptables.ipv4.nat' cat <<EOF ---- mẫu #1 ----- -P PREROUTING ACCEPT -P INPUT ACCEPT -P OUTPUT ACCEPT -P POSTROUTING ACCEPT -A POSTROUTING -o eth0 -j MASQUERADE ----------------- EOF sudo iptables -t nat -S read -n 1 -s -p 'Kiểm tra xem các dòng bên trên có giống mẫu #1 không [Y/n]?' answer echo if [ ! -z $answer ] && [ "${answer,}" != 'y' ]; then echo 'ERROR: có lỗi NAT giữa eth0 và wlan0' fi cat <<EOF ---- mẫu #2 ----- -P INPUT ACCEPT -P FORWARD ACCEPT -P OUTPUT ACCEPT -A FORWARD –i eth0 –o wlan0 –m state --state RELATED,ESTABLISHED –j ACCEPT -A FORWARD –i wlan0 –o eth0 –j ACCEPT ----------------- EOF sudo iptables -S read -n 1 -s -p 'Kiểm tra xem các dòng bên trên có giống mẫu #2 không [Y/n]?' answer echo if [ ! -z $answer ] && [ "${answer,}" != 'y' ]; then echo 'ERROR: có lỗi NAT giữa eth0 và wlan0' fi echo 'iptables-restore < /etc/iptables.ipv4.nat' | sudo tee /lib/dhcpcd/dhcpcd-hooks/70-ipv4-nat > /dev/null sudo service hostapd restart sudo service dnsmasq restart
Chú thích
- Ghi thành file ap_setup trên RPi
- Gán thuộc tính thực thi sudo chmod +x ./ap_setup