Script cài đặt access point trên RPi 3

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

Leave a Comment

Filed under Software

Leave a Reply