原文链接: https://www.right.com.cn/forum/forum.php?mod=viewthread&tid=268398
树莓派3自带有线网卡和无线网卡,手里暂时没有路由器使用,就想着用树莓派配置成一个无线路由器。原理就是把无线网卡作为热点,把入网的有线网分享出来。当然,这样无线网卡就只能发网络信号,不能用来连接其他WiFi信号了。之前参考其他网上教程要不就是写的不够详细,要不就原本是错误的,或者是与我的系统版本不对应。本教程会把我配置过程中网上其他教程中错误指出,避免大家走弯路
工具/原料:树莓派Raspb Pi 3、系统版本:stretch、用ssh软件工具连接树莓派
一、树莓派stretch版本系统的下载及安装、设置就不啰嗦了,大家自行百度。
先下载软件包:
sudo apt-get install hostapd dnsmasq
hostapd的功能是创建热点,dnsmasq功能是实现网址自动分配和域名解析功能,不过这里只是使用它的网址分配功能。
二、设置IP地址
这一步骤是最容易出错的了,网上教程也多为错误的。
修改配置文件:sudo vim /etc/network/interfaces
我的配置如下:
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet dhcp
# address 192.168.0.197
# netmask 255.255.255.0
# gateway 192.168.0.1
# dns-nameservers 223.5.5.5
auto wlan0
allow-hotplug wlan0
iface wlan0 inet static
address 192.168.2.1
netmask 255.255.255.0
broadcast 192.168.2.255
network 192.168.2.0
说明:
1. auto eth0,auto表示开机自动加载eth0有线网卡,有的教程没有写上auto eth0,导致eth0未启动。
2.eth0上网方式是dhcp,若要设置成静态上网,就将dhcp改成static,其内容参考图中#注释掉的部分(IP地址改成自己路由器的)。静态方式配置中,有些教程未写上dns-nameservers,导致不能上外网。233.5.5.5是阿里云的解析服务,当然也可以改成其他的。
3.有教程提示要在 /etc/hdcpcd.conf 文件中配置静态网卡,经多次检验后,这样会带来问题:重启后 eth0 和 wlan0 只有一个起作用(通常是eth0不起作用,表现为eth0加载不了,或者没有被分配到IP地址),即使用ifdown和ifup命令也解决不了问题。
4.配置完成,不着急往下走。
sudo reboot 重启树莓派后,用 ifconfig 命令查看 eth0 和 wlan0 网卡是否都在,且被分配了IP地址。若都正确,可继续往下一步骤操作。
5.若重启后,无法ssh连上树莓派,说明出错了,可能是eth0没启动或未配置好(前提是你使用了正确的IP地址连接的,注意检查下)。这样的话,可参考 https://zhidao.baidu.com/question/1865922724521505427.html ;当然不也可以重装系统,重新操作。
三、编辑 sudo vim /etc/dhcpcd.conf
在首行 添加
denyinterfaces wlan0
四、编辑 sudo vim /etc/hostapd/hostapd.conf
添加下面横线里内容,不包括横线。
interface=wlan0
driver=nl80211
# 设置无线网络名
ssid=raspberryA
hw_mode=g
# 设置信道
channel=6
ieee80211n=1
wmm_enabled=1
ht_capab=[HT40][SHORT-GI-20][DSSS_CCK-40]
macaddr_acl=0
auth_algs=1
# 是否隐藏无线网络名
ignore_broadcast_ssid=0
# 使用WPA2
wpa=2
wpa_key_mgmt=WPA-PSK
# 设置无线网络的密码
wpa_passphrase=12345678
rsn_pairwise=CCMP
说明:无线网络名和密码 改为想要的。
五、编辑 sudo vim /etc/default/hostapd
将 #DAEMON_CONF=" “所在行的内容改为:
DAEMON_CONF="/etc/hostapd/hostapd.conf"
六、配置DHCP服务
我们先备份下dnsmasq的原配置文件
sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.bak
编辑 sudo vim /etc/dnsmasq.conf
#使用网卡接口
interface=wlan0
#监听地址
listen-address=192.168.2.1
#绑定接口
bind-interfaces
#dns服务器地址
server=223.5.5.5
domain-needed
bogus-priv
#地址范围,从50-150、租用时间为12小时。
dhcp-range=192.168.2.50,192.168.2.150,12h
七、配置网络转发
首先我们来开启内核的IPv4包转发,编辑 sudo vim /etc/sysctl.conf:
在最后一行添加
net.ipv4.ip_forward=1
然后执行sudo sysctl -p让其生效
接下来,执行下面命令设置转发规则:
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
#下面两个命令是为了防止pi默认开启了防火墙,若无不执行也可以。
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 vim /etc/rc.local
在rc.local 文件中的 exit 0 所在行的前面添加(第二和第三命令可选,我是只添加了第一个命令):
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 ACCEP
九、
sudo reboot
大功告成!!!!!!
------------------------------------------------------------------------------------
<1>
pi@raspberrypi3:~ $ cat /etc/rc.local
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
printf "My IP address is %s\n" "$_IP"
fi
iptables-restore < /etc/iptables.ipv4.nat
exit 0
<2>
pi@raspberrypi3:~ $ cat /etc/iptables.ipv4.nat
# Generated by iptables-save v1.6.0 on Mon Jul 8 05:59:14 2019
*filter
:INPUT ACCEPT [5:600]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [9:1521]
-A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i wlan0 -o eth0 -j ACCEPT
COMMIT
# Completed on Mon Jul 8 05:59:14 2019
# Generated by iptables-save v1.6.0 on Mon Jul 8 05:59:14 2019
*nat
:PREROUTING ACCEPT [1:79]
:INPUT ACCEPT [1:79]
:OUTPUT ACCEPT [8:493]
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -o eth0 -j MASQUERADE
COMMIT
# Completed on Mon Jul 8 05:59:14 2019