把树莓派作为Wi-Fi路由器(IPv6 passthrough、5GHz 11ac)
最近刚入手了Raspberry Pi 3B+. 打算当做一个高可玩性的路由器用。
毕竟这代硬件配备了千兆以太网(受限于USB总线带宽只能跑到250Mbps左右),和11ac Wi-Fi(受限于SDIO总线只能跑到110Mbps左右)。
参考资料:https://www.raspberrypi.org/documentation/configuration/wireless/access-point.md
我准备实现以下几个功能:
- Wi-Fi工作在11ac模式(如果你想使用11n模式,建议在hostapd配置部分参考这里),达到433Mbps的Link Speed
- Wi-Fi共享以太网口的网络,IPv4使用NAT模式
- IPv6使用穿透模式(可适用于几乎所有学校和家庭的IPv6环境,甚至你的手机开启个人热点后通过USB连接在Pi上也可以用这种方式使后端设备得到IPv6地址)
接下来开始操作:
0x00. 切换到root用户
sudo su
0x01. 安装必要软件包
apt install hostapd dnsmasq bridge-utils ebtables
0x02. 在sysctl.conf中打开IPv4转发
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sysctl -p
0x03. 给wlan0配置一个静态IP
在做这步操作之前,请先确保你没有使用/etc/network/interface
来配置各个网络接口。
打开/etc/dhcpcd.conf
nano /etc/dhcpcd.conf
粘贴以下内容,然后按Ctrl+X,再按Y,保存并退出。
interface wlan0
static ip_address=192.168.233.1/24
nohook wpa_supplicant
之后重启dhcpcd服务
systemctl restart dhcpcd
其中192.168.233.1可以改成任何你想分给树莓派无线网卡的ip地址,这里相当于路由器的LAN口IP。
/24是子网掩码
0x04. 配置DHCP服务器
直接执行以下两行代码
echo "interface=wlan0" >> /etc/dnsmasq.conf
echo "dhcp-range=192.168.233.100,192.168.233.199,255.255.255.0,24h" >> /etc/dnsmasq.conf
0x05. 配置hostapd
打开hostapd配置文件
nano /etc/hostapd/hostapd.conf
粘贴以下内容,然后按Ctrl+X,再按Y,保存并退出。
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_AP
wpa_passphrase=23336666
ssid
通俗来说就是Wi-Fi的网络名
wpa_passphrase
就是Wi-Fi的密码
ssid
和wpa_passphrase
可以随意更改,但要注意wpa_passphrase
在8字节以上
channel
一般来说不必改,因为中国可用的ISM频段想要连续80MHz频宽,无论怎么调都没法满足两个AP毫无频段重叠。
country_code
一定要有且必须是US,曾经试过改成CN无法启动,不知道为啥。
将配置文件路径写入服务配置文件中,并启动服务
echo "DAEMON_CONF=\"/etc/hostapd/hostapd.conf\"" >> /etc/default/hostapd
启动AP和DHCP服务器
systemctl start hostapd
systemctl start dnsmasq
0x06. 在iptables开启IPv4 NAT与IPv6透传
打开/etc/rc.local
nano /etc/rc.local
在exit 0那一行之前的行加入以下内容,然后按Ctrl+X,再按Y,保存并退出。
#开启IPv4 NAT
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
#开启IPv6透传
ebtables -t broute -A BROUTING -p ! ipv6 -i eth0 -j DROP
brctl addbr ipv6br
ifconfig ipv6br up
brctl addif ipv6br eth0
brctl addif ipv6br wlan0
其中,ebtables -t broute -A BROUTING -p ! ipv6 -j DROP
非常重要。
一定要在连接桥接网卡的两个接口之前先执行。
它使桥接的两个网卡除了IPv6以外的协议不互通。
然后执行rc.local脚本
/etc/rc.local
非教育网用户可以用吗?
现在 drcom.py 不太好使了,一天要重连十几次,暂时采取的方案是寝室路由器全局代理到连接校园网的主机上进行中转,目前来看还是挺稳定的
在CQU,drcom.py还是很好用的,而且我们学校现在似乎可以直接portal登录了