Skip to content

Set Raspberry as WiFi Router

将树莓派3B+改成一个wifi无线路由器

实现以下功能:

1. WiFi工作在802.11ac模式,433Mbps的Link Speed
2. WiFi共享以太网口的网络,IPv4采用NAT
3. 外接USB免驱网卡作为LAN口

1. 更新并安装必要软件

sudo apt-get update && upgrade
sudo apt-get install hostapd dnsmasq

2. 打开IPv4转发

echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sysctl -p

3. 为网卡配置静态IP

需要确保没有使用/etc/network/interface配置网卡

(1) 打开/etc/dhcpcd.conf

sudo vim /etc/dhcpcd.conf

(2) 在文件最后添加以下内容,保存退出

interface eth0

interface wlan0
static ip_address=192.168.3.1/24
nohook wpa_supplicant

interface eth1
static ip_address=192.168.4.1/24
nohook wpa_supplicant

(3) 重启dhcpcd服务

sudo systemctl restart dhcpcd.service
- eth0自动获取IP地址,wlan0和eth1分别设置为192.168.3.1,192.168.4.1

4. 配置DHCP服务器

(1) 打开/etc/dnsmasq.conf

sudo vim /etc/dnsmasq.conf

(2) 在文件最后添加以下内容,保存退出

interface=wlan0
dhcp-range=192.168.3.100,192.168.3.200,255.255.255.0,24h
interface=eht1
dhcp-range=192.168.4.100,192.168.4.200,255.255.255.0,24h

5. 配置hostapd

(1) 打开/etc/hostapd/hostapd.conf

sudo vim /etc/hostapd/hostapd.conf

(2) 输入以下内容,保存退出

interface=wlan0
driver=nl80211
hw_mode=a
ieee80211n=1
ieee80211ac=1
ieee80211d=1
ieee80211h=1
require_ht=1
require_vht=1
wmm_enabled=1
country_code=US
vht_oper_chwidth=1
channel=149
vht_oper_centr_freq_seg0_idx=155
ht_capab=[HT40-][HT40+][SHORT-GI-40][DSSS_CCK-40]
wpa=2
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP
ssid=PI_WIFI
wpa_passphrase=password
  • ssid通俗来说就是Wi-Fi的网络名

  • wpa_passphrase就是Wi-Fi的密码

  • ssid和wpa_passphrase可以随意更改,但要注意wpa_passphrase在8字节以上

  • channel一般来说不必改,因为中国可用的频段想要连续80MHz频宽,无论怎么调都没法满足两个AP毫无频段重叠。

  • country_code一定要有且必须是US,曾经试过改成CN无法启动。

(3) 将配置文件路径写入服务配置文件

echo "DAEMON_CONF=\"/etc/hostapd/hostapd.conf\"" >> /etc/default/hostapd

(4) 启动hostapd和dnsmasq

sudo systemctl start hostapd
sudo systemctl start dnsmasq

6. 在iptables中开启IPv4 NAT

(1) 打开/etc/rc.local

sudo vim /etc/rc.local

(2) 在Exit 0之前加入下列内容,保存退出

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE  
iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT  
iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT
iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT

(3) 执行rc.local脚本

sudo /etc/rc.local

7. 关于IPv6

(1)额外需要安装软件

sudo apt-get install bridge-utils ebtables radvd -y

(2)设置IPv6转发

编辑配置文件/etc/sysctl.conf,把下面一行的注释去掉

net.ipv6.conf.all.forwarding=1

(3)根据实际网口获得的全局唯一IPv6,编写配置文件

vim /etc/radvd.conf

interface wlan0
{
    AdvSendAdvert on;
    prefix 2001:da8:7001:251::/64
    {
        AdvOnLink on;
        AdvAutonomous on;
        AdvRouterAddr on;
    };
};
- 2001:da8:7001:251::/64为通过ifconfig获取的Scope:Global对应的IPv6地址

(4)配置开机自启动

编辑/etc/rc.local

iptables -t nat -A POSTROUTING -s 10.0.0.0/8 -o ppp0 -j MASQUERADE
service radvd start
ebtables -t broute -A BROUTING -p ! ipv6 -j DROP 
brctl addbr br0
ifconfig br0 up
brctl addif br0 eth0
brctl addif br0 wlan0
- 此处存在一个兼容性问题ebtables,需要对ebtables进行设置

在命令行中输入update-alternatives --set ebtables /usr/sbin/ebtables-legacy,主要问题在于新版本的ebtalbes对命令的不兼容,需要切换到老版本程序

(5)WARNING!

开启IPv6透传后,存在有网络问题,问题原因未知

现象主要为docker网络全挂(可能因为采用Host的网络设置,可能使用Bridge就好了)

8. 一键安装教程 IPv4 Only

参考Haoran.Qi/RaspberryPi