如何用Raspberry Pi实现这一目的?
#1 楼
我们正在讨论接入点以及接口wlan0上与另一个wifi网络(wlan中继器)或Internet路由器的无线客户端连接。如果您希望将接入点与以太网接口eth0一起用于有线上行链路,交换机或Internet路由器,然后查看将Raspberry Pi设置为访问点的简便方法。
在具有Raspberry Pi OS(32位)且桌面2020-08-20更新的Raspberry Pi 4B上进行了测试2020-09-01。带桌面2020-05-27的Raspberry Pi OS(32位)于2020-06-11更新.Raspbian Buster Lite 2020-02-13于2020-03-03更新。
更新用
sudo apt update && sudo apt full-upgrade && sudo reboot
完成。您会在这里找到Raspbian Stretch Lite的最新测试版本。
2020-09-02的重要更新:
我发现Raspberry Pi OS的映像版本内置的WiFi设备带有不稳定的固件。有关更多信息,请参阅我在使用虚拟AP接口时WiFi固件brcmfmac崩溃的错误报告。最后一个稳定版本是固件-brcm80211_20190114-1 + rpt4_all.deb,其中包含图像Raspbian Buster Lite 2020-02-13。
因此,只要未修复该错误,我们就必须将WiFi固件降级到此稳定版本。 。刷新并更新/升级完Raspberry Pi OS映像后,请按照以下步骤进行降级:
rpi ~$ wget http://archive.raspberrypi.org/debian/pool/main/f/firmware-nonfree/firmware-brcm80211_20190114-1+rpt4_all.deb
rpi ~$ sudo dpkg --purge firmware-brcm80211
rpi ~$ sudo dpkg --install firmware-brcm80211_20190114-1+rpt4_all.deb
rpi ~$ sudo apt-mark hold firmware-brcm80211
rpi ~$ sudo systemctl reboot
Raspberry Pi可以用作无线热点,并同时连接到另一个热点作为客户。但是RasPi上的wifi设备具有一般限制。客户端连接无法桥接,因为缺少无线桥接所需的WDS(无线分发系统)。有关更多信息,请参阅服务器的Raspberry Pi WiFi到以太网桥?因此,我们只能将路由用于将wifi客户端连接到Internet路由器。但是wifi热点和有线以太网端口可以桥接,因此wifi和有线端口上的所有设备都可以在其公用子网上具有相同的广播域。
我假设您已经连接到互联网。所有命令都可以简单地复制并粘贴到RasPi的命令行中。您可以从
cat
incl。中选择带有EOF的块。最后一个EOF
并将其粘贴到RasPis命令行。使用Enter键,它将被复制到没有定界符EOF的文件中。我们将首先设置wifi中继器,因此,如果仅需要此功能的人可以在此时停止设置并使用它。对于需要使用wifi接入点桥接以太网端口的用户,可以继续进行设置。
出于某种原因,我使用systemd-networkd。对于不耐烦的人,首先只能进行设置。
♦设置wifi中继器
此设置的示例:
wifi wifi uplink wan
mobile-phone <~.~.~.~.~> (ap@wlan0)RPi(wlan0) <.~.~.~.~.> router <───> INTERNET
╲ ╱ ╲
(dhcp 192.168.4.1 (dhcp
from RPi) from router)
步骤1:设置systemd-networkd
只需遵循将systemd-networked用于一般联网即可。您可以使用“♦快速步骤”部分。然后回到这里。
步骤2:为访问点安装hostapd
rpi ~$ sudo -Es # if not already done
rpi ~# apt install hostapd
使用您对
ssid=
,country_code=
和wpa_passphrase=
的设置创建此文件。当channel=
选择与wlan0相同的通道wpa_supplicant将连接到您的Internet路由器。这是硬件的限制。无论您在此处设置什么,hostapd
始终将通道设置为与客户端连接相同的值。如果需要其他通道,则必须使用其他USB / WiFi加密狗。rpi ~# cat > /etc/hostapd/hostapd.conf <<EOF
driver=nl80211
ssid=RPiNet
country_code=DE
hw_mode=g
channel=1
auth_algs=1
wpa=2
wpa_passphrase=verySecretPassword
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
EOF
rpi ~# chmod 600 /etc/hostapd/hostapd.conf
使用hostapd为访问点创建服务:
rpi ~# systemctl edit --force --full accesspoint@.service
在空的编辑器中插入以下内容语句,保存它们并退出编辑器:
[Unit]
Description=accesspoint with hostapd (interface-specific version)
Wants=wpa_supplicant@%i.service
[Service]
ExecStartPre=/sbin/iw dev %i interface add ap@%i type __ap
ExecStart=/usr/sbin/hostapd -i ap@%i /etc/hostapd/hostapd.conf
ExecStopPost=-/sbin/iw dev ap@%i del
[Install]
WantedBy=sys-subsystem-net-devices-%i.device
启用服务:
rpi ~# systemctl enable accesspoint@wlan0.service
rpi ~# rfkill unblock wlan
步骤3:为客户端连接设置wpa_supplicant
使用您的设置创建此文件
country=
,ssid=
和psk=
并启用它:rpi ~# cat >/etc/wpa_supplicant/wpa_supplicant-wlan0.conf <<EOF
country=DE
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
ssid="TestNet"
psk="realyNotMyPassword"
key_mgmt=WPA-PSK # see ref (4)
}
EOF
rpi ~# chmod 600 /etc/wpa_supplicant/wpa_supplicant-wlan0.conf
rpi ~# systemctl disable wpa_supplicant.service
用以下内容扩展wpa_supplicant:
rpi ~# systemctl edit wpa_supplicant@wlan0.service
在空编辑器中插入以下语句。保存并退出编辑器:
[Unit]
BindsTo=accesspoint@%i.service
After=accesspoint@%i.service
步骤4:设置静态接口
创建这些文件:
rpi ~# cat > /etc/systemd/network/08-wifi.network <<EOF
[Match]
Name=wl*
[Network]
LLMNR=no
MulticastDNS=yes
# If you need a static ip address, then toggle commenting next four lines (example)
DHCP=yes
#Address=192.168.50.60/24
#Gateway=192.168.50.1
#DNS=84.200.69.80 1.1.1.1
EOF
对于那些想要桥接的人,不需要下一个文件,而必须继续安装Bridge。
rpi ~# cat > /etc/systemd/network/12-ap.network <<EOF
[Match]
Name=ap@*
[Network]
LLMNR=no
MulticastDNS=yes
IPMasquerade=yes
Address=192.168.4.1/24
DHCPServer=yes
[DHCPServer]
DNS=84.200.69.80 1.1.1.1
EOF
设置没有桥接的wifi中继器已完成。您必须
重新启动。
♦设置网桥
如上所述设置wifi中继器。
此设置示例:
(dhcp
from RPi) bridge
╱ wifi ┌──────┐
mobile-phone <~.~.~.~.> │(ap@) │ wifi uplink wan
│ br0│RPi(wlan0) <.~.~.~.~.> router <───> INTERNET
laptop <────────> |(eth0)│╲ ╲
╲ wired └──────┘╱ (dhcp
(dhcp 192.168.4.1 from router)
from RPi)
步骤5 :为网桥配置hostapd
在/etc/hostapd/hostapd.conf中添加以下行
bridge=br0
:rpi ~# echo 'bridge=br0' >> /etc/hostapd/hostapd.conf
步骤6:为网桥设置wpa_supplicant
用以下内容扩展wpa_supplicant:
rpi ~# systemctl edit wpa_supplicant@wlan0.service
在编辑器中添加以下行,使其类似于以下内容。在某些语句中,请注意等号
=-
之后的减号。保存并退出编辑器:[Unit]
BindsTo=accesspoint@%i.service
After=accesspoint@%i.service
[Service]
ExecStartPost=/lib/systemd/systemd-networkd-wait-online --interface=%i --timeout=60 --quiet
ExecStartPost=/bin/ip link set ap@%i up
ExecStopPost=-/bin/ip link set ap@%i up
请注意,
ExecStopPost=-/bin/ip link set ap@%i up
不是错字。停止wpa_supplicant时,必须再次设置接口ap @ wlan0。步骤7:设置静态接口
对于网桥,动态创建ap @ wlan。因此创建以下文件:
rpi ~# cat > /etc/systemd/network/02-br0.netdev <<EOF
[NetDev]
Name=br0
Kind=bridge
EOF
rpi ~# cat > /etc/systemd/network/04-eth0.network <<EOF
[Match]
Name=eth0
[Network]
Bridge=br0
EOF
rpi ~# cat > /etc/systemd/network/16-br0_up.network <<EOF
[Match]
Name=br0
[Network]
IPMasquerade=yes
Address=192.168.4.1/24
DHCPServer=yes
[DHCPServer]
DNS=84.200.69.80 1.1.1.1
EOF
重新启动。
就这样。
♦详细信息
常规
一个问题是我们要使用wifi客户端和接入点使用同一设备。 wifi硬件必须支持此功能。我们可以使用
rpi ~$ sudo iw list | grep -A4 "valid interface combinations:"
valid interface combinations:
* #{ managed } <= 1, #{ P2P-device } <= 1, #{ P2P-client, P2P-GO } <= 1,
total <= 3, #channels <= 2
* #{ managed } <= 1, #{ AP } <= 1, #{ P2P-client } <= 1, #{ P2P-device } <= 1,
total <= 4, #channels <= 1
进行检查重要的部分是
#{ managed } <= 1, #{ AP } <= 1,
,但是您还可以看到这仅在一个通道上是可能的。我发现我们必须按顺序设置它,否则,它将无法正常工作。如果其他应用程序绑定到wifi端口,则无法设置。
为访问点创建虚拟接口
ap@wlan0
使用接口
hostapd
启动访问点守护程序ap@wlan0
为wifi启动
wpa_supplicant
使用接口wlan0
的客户端此命令限制了整个设置。当wpa_supplicant运行时,无法启动hostapd。您必须先停止wpa_supplicant,然后按此顺序启动hostapd和wpa_supplicant。这是由于WiFi驱动程序
brcmfmac
。另一个怪癖是wpa_supplicant在管理接口ap @ wlan0时会禁用它,无论它是启动还是停止。因此,即使从wpa_supplicant开始,我们也必须再次启用ap @ wlan0。
这里主要涉及四个组件:虚拟接口ap @ wlan0,hostapd,wpa_supplicant和设置网桥。
hostapd(步骤2)
这是您可以在网上找到的常规设置。请将通道设置为相同的值,然后将wlan0从路由器连接到wifi。这是硬件的限制,可以避免与通道设置混淆。无论您在此处设置什么,hostapd始终将通道设置为与客户端连接相同的值。
请使用足够长的密码,我至少要说8个字符。据说4个字符太小,hostapd将拒绝接受连接。您不会在手机上找到接入点RPiNet(由于@Leo)。
我们不需要按
/usr/share/doc/hostapd/README.Debian
所述取消屏蔽hostapd.service,因为我们为hostapd创建了自己的accesspoint@.service
。在此服务中,在启动hostapd之前先创建接口ap @ wlan0。遵守开始顺序。由于ap @ wlan0绑定到wlan0,因此它获得了相同的mac地址。您可能考虑为其提供一个唯一的mac地址,但这不是一个好主意。在网络上只能看到来自wlan0的mac地址。如果您给ap @ wlan0自己的mac地址,则在网络上看不到arp请求,并且找不到与ap @ wlan0的连接的IP地址并卡住。您必须将ap @ wlan0设置为混杂模式才能正常工作。
停止hostapd之后,还将删除ap @ wlan0,以便可以在下一次启动hostapd时再次创建它。
wpa_supplicant(步骤3)
像往常一样为wlan0设置wpa_supplicant。您可以考虑使用
p2p_disabled=1
中的/etc/wpa_supplicant/wpa_supplicant-wlan0.conf
禁用p2p,以避免出现与iw dev
不必要的混淆P2P设备。在此配置中,请勿使用虚拟AP接口(例如ap @ wlan0)执行此操作。它将wpa_supplicant弄糊涂,当它刚刚连接到上行链路路由器时,它将立即与上行链路路由器断开连接。它无限地连接和断开连接。它的扩展单元是严格将wpa_supplicant绑定到hostapd,以便它将按正确的顺序启动和停止。我们这样做是因为在没有hostapd的情况下运行wpa_supplicant非常复杂,并且可能导致brcmfmac wifi驱动程序彻底崩溃,我已经在测试中看到了这一点。
设置静态接口(第4步)
这里我们定义接口wlan0和虚拟接口ap @ wlan0,我们需要一个wifi中继器。对于wlan0,我们从互联网路由器通过DHCP获取IP地址。可选,您可以设置一个静态IP地址,但是您还必须定义所有其他设置,例如网关和DNS服务器,因为您不再从DHCP服务器获取它们。
接口ap @ wlan0需要一个静态IP地址因为它是wifi网络的DHCP服务器的访问点和源。不需要连接到Internet路由器的客户端也必须连接到接入点上的客户端。因此,我们可以使用简化设置的NAT(IPMasquerade = yes)。然后,我们不必配置静态路由,也不需要使用静态值(IP地址,网关,DNS服务器等)配置wlan0。
用于桥接的hostapd(第5步)
我们在步骤2中设置了hostapd。现在,我们只需要将
bridge=br0
附加到其配置中,以便它可以动态地设法将ap @ wlan0添加到网桥。网桥的wpa_supplicant(第6步)
当启动wpa_supplicant时,它还会弹出接口wlan0。每次对其进行管理时,无论它是启动还是停止,它都会停止ap @ wlan0,因为它不是真正的接口,并且直接取决于wlan0。
ap接口只能在wlan0“获得载波”和链接准备就绪(3)。这将在wpa_supplicant启动后几秒钟或更长时间发生。有一个帮助程序systemd-networkd-wait-online可以同步进行此操作。我们使用它的超时时间为60秒。如果您的网络连接启动时间超过60秒,则应相应增加超时时间。使用
journalctl -b -e
可以检查Starting Bring up wifi interface ap@wlan0...
和Started Bring up wifi interface ap@wlan0.
是否覆盖wlan0: Gained carrier
。这非常重要,因为否则,该桥将无法通过未定义的行为正常工作。您可以使用/lib/systemd/systemd-networkd-wait-online --help
来检查帮助程序选项。 7)这些文件定义了网桥。 ap @ wlan0将由hostapd动态添加。 eth0和ap @ wlan0是网桥的从站,不需要IP地址。网桥br0本身也不需要IP地址,但是这里有一个静态IP地址,因为绑定到br0的DHCP服务器需要它,因此DHCP服务器在网桥的子网上可用(接口eth0,ap @ wlan0) 。
结论
更新2020-07-22:Bassline Soup进行了一些有趣的测试,可能有助于排除设置故障。
您现在可以启动,停止和重新启动hostapd和wpa_supplicant。
您应该在手机中看到接入点,这里是RPiNet,并应该获得IP地址以连接到该接入点。如果将带有电缆的笔记本电脑连接到以太网端口,并且可以ping通手机,则还应该从同一子网获得IP地址。
使用此设置,您在启动和停止时具有以下依赖性:
hostapd │ wpa_supplicant wpa_supplicant │ hostapd
───────────┼────────────────────────────────────┼──────────
starting │ starts starting │ starts
stopping │ stops stopping │ ----
restarting │ restarts restarting │ starts
这是因为启动的顺序严格(请参见“常规”部分)。您不能在没有hostapd的情况下运行wpa_supplicant,但是可以通过启动hostapd然后停止wpa_supplicant来在没有wpa_supplicant的情况下运行hostapd。
如果由于某种原因(例如,延迟到小规模或其他原因)而停止通信,通常足以用以下命令踢ap @ wlan0
/bin/ip link set ap@wlan0 up
。参考文献:
[1]如何通过动态故障转移从网络迁移到systemd-networked
[2] man systemd.unit
[3] systemd-networkd无线桥接-需要等待运营商
[4]在Pi 3 B +上设置WiFi
#2 楼
不考虑此答案进行设置。对于安装程序,请从安装程序wifi中继器开始,查看此问题的其他答案。这主要用于故障排除,并逐步说明如何使用详细的命令和检查点,但没有背景信息。我想您有一个连接到Raspberry Pi的显示器,键盘和鼠标,并且在本地无线网络上运行着DHCP服务器。此检查中的ip地址和其他设置就是示例。您必须使用您的。您可以随时查看journalctl -b -e
以获取记录的信息。Download ZIP
将Raspbian Stretch Lite 2018-11-13镜像到您的linux pc。检查点1:将校验和与以下内容进行比较下载站点。
pc ~$ sha256sum 2018-11-13-raspbian-stretch-lite.zip
47ef1b2501d0e5002675a50b6868074e693f78829822eef64f3878487953234d 2018-11-13-raspbian-stretch-lite.zip
下一步:将图像刻录到附带的SD卡。我假设它连接到
/dev/sdb
。用lsblk
查找SD卡所连接的设备文件。pc ~$ unzip -p 2018-11-13-raspbian-stretch-lite.zip | sudo dd of=/dev/sdb bs=4M conv=fsync
检查点2:检查SD卡上的分区:
pc ~$ sudo parted /dev/sdb print
sudo parted /dev/sdb print
Model: Mass Storage Device (scsi)
Disk /dev/sdb: 3965MB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags
1 4194kB 50,2MB 46,0MB primary fat32 lba
2 50,3MB 1866MB 1816MB primary ext4
下一步:挂载启动分区并创建一个
wpa_supplicant.conf
文件:pc ~$ mkdir boot/
pc ~$ sudo mount /dev/sdb1 boot/
pc ~$ sudo editor boot/wpa_supplicant.conf
将其与您对
country=
,ssid=
的设置一起插入到空编辑器中和psk=
,保存并退出编辑器:country=DE
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
ssid="your wifi network"
psk="YourSecretPassword"
}
pc ~$ sudo umount boot/
将SD卡放入RasPi并启动。
检查点3:登录后,检查wifi连接和互联网访问。 wlan0接口必须具有ip地址:
rpi ~$ ip -4 addr show dev wlan0
3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
inet 192.168.10.112/24 brd 192.168.10.255 scope global wlan0
valid_lft forever preferred_lft forever
rpi ~$ ping -I wlan0 -c3 google.com
PING google.com (216.58.210.14) from 192.168.10.112 wlan0: 56(84) bytes of data.
64 bytes from fra16s07-in-f14.1e100.net (216.58.210.14): icmp_seq=1 ttl=57 time=213 ms
64 bytes from fra16s07-in-f14.1e100.net (216.58.210.14): icmp_seq=2 ttl=57 time=14.2 ms
64 bytes from fra16s07-in-f14.1e100.net (216.58.210.14): icmp_seq=3 ttl=57 time=12.2 ms
--- google.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2001ms
rtt min/avg/max/mdev = 12.215/79.965/213.461/94.399 ms
直到现在,我们仅完成了默认设置。如果遇到问题,则说明网络存在一般性问题。检查如何设置网络/ WiFi /静态IP地址?并修复它。
下一步:完全升级并重新启动:
rpi ~$ sudo apt update
rpi ~$ sudo apt full-upgrade
rpi ~$ sudo systemctl reboot
重新启动并登录后,切换到systemd-networked:
rpi ~$ sudo -Es
rpi ~# systemctl mask networking.service
rpi ~# systemctl mask dhcpcd.service
rpi ~# sudo mv /etc/network/interfaces /etc/network/interfaces~
rpi ~# sed -i '1i resolvconf=NO' /etc/resolvconf.conf
rpi ~# systemctl enable systemd-networkd.service
rpi ~# systemctl enable systemd-resolved.service
rpi ~# ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
使用您的设置为接口wlan0和ap0创建以下文件:
rpi ~# cat > /etc/systemd/network/08-wlan0.network <<EOF
[Match]
Name=wlan0
[Network]
IPForward=yes
DHCP=yes
EOF
rpi ~# cat > /etc/systemd/network/12-ap0.network <<EOF
[Match]
Name=ap0
[Network]
Address=192.168.4.1/24
DHCPServer=yes
[DHCPServer]
DNS=84.200.69.80 84.200.70.40
EOF
重命名/etc/wpa_supplicant/wpa_supplicant.conf,使其与接口设置匹配并重新启动:
rpi ~# mv /etc/wpa_supplicant/wpa_supplicant.conf /etc/wpa_supplicant/wpa_supplicant-wlan0.conf
rpi ~# systemctl disable wpa_supplicant@wlan0.service
rpi ~# systemctl reboot
检查点4:重新启动并登录后,检查与systemd-networkd的wifi连接:
rpi ~$ sudo systemctl start wpa_supplicant@wlan0.service
rpi ~$ systemctl status wpa_supplicant@wlan0.service
● wpa_supplicant@wlan0.service - WPA supplicant daemon (interface-specific version)
Loaded: loaded (/lib/systemd/system/wpa_supplicant@.service; disabled; vendor preset: enabled)
Active: active (running) since Tue 2019-01-29 11:07:53 GMT; 24s ago
Main PID: 415 (wpa_supplicant)
CGroup: /system.slice/system-wpa_supplicant.slice/wpa_supplicant@wlan0.service
└─415 /sbin/wpa_supplicant -c/etc/wpa_supplicant/wpa_supplicant-wlan0.conf -Dnl80211,wext -iwlan0
Jan 29 11:07:53 raspberrypi systemd[1]: Started WPA supplicant daemon (interface-specific version).
Jan 29 11:07:53 raspberrypi wpa_supplicant[415]: Successfully initialized wpa_supplicant
Jan 29 11:07:53 raspberrypi wpa_supplicant[415]: p2p-dev-wlan0: CTRL-EVENT-REGDOM-CHANGE init=USER type=COUNTRY alpha2=DE
Jan 29 11:07:56 raspberrypi wpa_supplicant[415]: wlan0: Trying to associate with 34:31:c4:c7:f2:74 (SSID='wlan@hoeft-online.de' freq
Jan 29 11:07:56 raspberrypi wpa_supplicant[415]: wlan0: Associated with 34:31:c4:c7:f2:74
Jan 29 11:07:56 raspberrypi wpa_supplicant[415]: wlan0: WPA: Key negotiation completed with 34:31:c4:c7:f2:74 [PTK=CCMP GTK=CCMP]
Jan 29 11:07:56 raspberrypi wpa_supplicant[415]: wlan0: CTRL-EVENT-CONNECTED - Connection to 34:31:c4:c7:f2:74 completed [id=0 id_st
Jan 29 11:07:56 raspberrypi wpa_supplicant[415]: p2p-dev-wlan0: CTRL-EVENT-REGDOM-CHANGE init=COUNTRY_IE type=COUNTRY alpha2=DE
rpi ~$ ip -4 addr show dev wlan0
3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
inet 192.168.10.112/24 brd 192.168.10.255 scope global wlan0
valid_lft forever preferred_lft forever
rpi ~$ ping -I wlan0 -c3 google.com
PING google.com (172.217.21.238) from 192.168.10.112 wlan0: 56(84) bytes of data.
64 bytes from fra16s13-in-f238.1e100.net (172.217.21.238): icmp_seq=1 ttl=56 time=14.1 ms
64 bytes from fra16s13-in-f238.1e100.net (172.217.21.238): icmp_seq=2 ttl=56 time=13.4 ms
64 bytes from fra16s13-in-f238.1e100.net (172.217.21.238): icmp_seq=3 ttl=56 time=13.2 ms
--- google.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 13.203/13.602/14.142/0.418 ms
检查点5:重要!此时,它必须能够设置和删除虚拟接口ap0,而不会出现错误消息:
rpi ~$ sudo iw dev wlan0 interface add ap0 type __ap
rpi ~$ sudo iw dev ap0 info
Interface ap0
ifindex 5
wdev 0x5
addr b8:27:eb:06:e8:8b
type AP
wiphy 0
channel 1 (2412 MHz), width: 20 MHz, center1: 2412 MHz
txpower 31.00 dBm
rpi ~$ sudo iw dev ap0 del
rpi ~$
下一步:安装hostapd和helper
rpi ~$ sudo -Es
rpi ~# apt install hostapd rng-tools
rpi ~# systemctl stop hostapd.service
rpi ~# systemctl disable hostapd.service
使用您对
ssid=
和wpa_passphrase=
的设置创建此文件:rpi ~# cat > /etc/hostapd/hostapd.conf <<EOF
interface=ap0
driver=nl80211
ssid=RPiNet
hw_mode=g
channel=1
wmm_enabled=0
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_passphrase=verySecretPassword
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
EOF
rpi ~# chmod 600 /etc/hostapd/hostapd.conf
设置DAEMON_CONF =“ / etc / hostapd / hostapd.conf在/ etc / default / hostapd中,带有:
rpi ~# sed -i 's/^#DAEMON_CONF=.*$/DAEMON_CONF="\/etc\/hostapd\/hostapd.conf"/' /etc/default/hostapd
在INIT INFO部分的/etc/init.d/hostapd中,您必须在
# Should-Start: $network
到## Should-Start: $network
的行注释: rpi ~# sed -i 's/^\(# Should-Start:\s*$network\)$/#/' /etc/init.d/hostapd
用
systemctl edit hostapd.service
编辑hostapd.service并在空的编辑器中插入它,然后保存并退出:/>重新启动。
重新启动并登录后,请检查客户端连接以及访问点。
/sbin/wpa_supplicant
在/sbin/hostapd
之后开始非常重要。否则,wifi驱动程序将崩溃,您必须重新启动。 检查点6:接口wlan0必须具有
state DOWN
,而ap0必须具有state UP
。[Service]
ExecStartPre=/sbin/iw dev wlan0 interface add ap0 type __ap
ExecStopPost=-/sbin/iw dev ap0 del
检查点7:检查手机上的wifi。您应该找到
RPiNet
并可以连接到它。您的手机无法进入互联网,因为尚未配置路由。下一步:在
wpa_supplicant
之后启动hostapd
:rpi ~$ ip link show dev wlan0
3: wlan0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN mode DEFAULT group default qlen 1000
link/ether b8:27:eb:06:e8:8b brd ff:ff:ff:ff:ff:ff
rpi ~$ sudo systemctl start hostapd.service
rpi ~$ ip -4 addr show dev ap0
4: ap0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
inet 192.168.4.1/24 brd 192.168.4.255 scope global ap0
valid_lft forever preferred_lft forever
检查点8:接口wlan0和ap0必须具有
state UP
,并且您可以从RasPi ping google.com:rpi ~$ sudo systemctl start wpa_supplicant@wlan0.service
下一步:启用网络地址转换(NAT),以便路由包可以返回到接入点上的设备。用以下内容扩展wpa_supplicant:
rpi ~$ ip -4 addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
inet 192.168.10.112/24 brd 192.168.10.255 scope global dynamic wlan0
valid_lft 25393sec preferred_lft 25393sec
4: ap0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
inet 192.168.4.1/24 brd 192.168.4.255 scope global ap0
valid_lft forever preferred_lft forever
rpi ~$ ping -c3 google.com
PING google.com (172.217.21.238) 56(84) bytes of data.
64 bytes from fra16s13-in-f238.1e100.net (172.217.21.238): icmp_seq=1 ttl=56 time=13.7 ms
64 bytes from fra16s13-in-f238.1e100.net (172.217.21.238): icmp_seq=2 ttl=56 time=14.1 ms
64 bytes from fra16s13-in-f238.1e100.net (172.217.21.238): icmp_seq=3 ttl=56 time=15.9 ms
--- google.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 13.775/14.608/15.908/0.936 ms
在空的编辑器中插入这些语句。在某些语句中,请注意等号
=-
之后的减号。保存并退出编辑器:rpi ~$ sudo systemctl stop wpa_supplicant@wlan0.service
rpi ~$ sudo systemctl edit wpa_supplicant@wlan0.service
再次启动wpa_supplicant:
[Service]
ExecStartPost=/sbin/iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
ExecStopPost=-/sbin/iptables -t nat -D POSTROUTING -o wlan0 -j MASQUERADE
检查点9:现在,您应该可以用手机上网。
就这样。
如果遇到麻烦,可以尝试以下尝试:
rpi ~$ sudo systemctl daemon-reload
rpi ~$ sudo systemctl start wpa_supplicant@wlan0.service
这不是有效的安装。如我的其他答案所示,您必须编辑
hostapd.service
和wpa_supplicant@wlan0.service
。#3 楼
这是对Ingo出色说明的补充。在这里,我们想使用Raspbian的默认网络系统(假设以前已经配置过),而不是用systemd-networkd替换它。提到了在Raspbian / Raspberry Pi OS中配置TCP / IP的标准网络模式。在相关文档中。在撰写本文时,使用了dhcpcd(dhcpcd5软件包)。该模式代替了以前的Debian Networking(ifupdown软件包),该配置在/ etc / network / interfaces中完成。该文档还介绍了如何通过配置
/etc/wpa_supplicant/wpa_supplicant.conf来通过wpa_supplicant设置Wi-Fi客户端/ Wi-Fi站点,以在其默认wlan0接口上将Raspberry Pi连接到现有的无线LAN。或者,它描述了如何在同一wlan0接口(而不是Wi-Fi站)上设置路由无线访问点。
我们将使用最后一个文档作为参考,仅将其更改为配置同一无线板以启用wlan0接口(Wi-Fi客户端/站,连接到另一个wifi网络或互联网路由器)以及名为uap0的Wi-Fi接入点(例如,定义wlan中继器):
我们创建hostapd服务配置的副本,添加ExecStartPre和ExecStopPost设置以通过iw添加/删除“类型AP”虚拟接口;我们宁愿使用此方法,也不愿在/etc/udev/rules.d中添加规则。
我们使用dhcpcd为创建的接口设置静态IP地址,同时修改wlan0配置,以充当DHCP客户端(无需静态寻址)
作为DNS转发器和DHCP服务器,我们将保留dnsmasq,用于先前提到的Raspberry配置。我们还将保留DNS多播(libnss-mdns)和Zeroconf / Apple Bonjour(avahi-daemon)。我们将不使用systemd-resolved。
值得注意的是,我们假设未使用较早的ifupdown模式,这意味着/ etc / network / interfaces保留为默认配置,未定义任何节,除了
source-directory /etc/network/interfaces.d
之外,其他任何注释或语句都通过初始#
注释掉了, /etc/network/interfaces.d目录保留为空。我们还假设sudo systemctl status dhcpcd
返回了服务处于活动状态。此设置的示例:
(dhcp 192.168.1.3 from router) +----------------------+ (192.168.1.1
\ | | / +DHCP server)
wifi (eth0) wifi uplink | /
mobile-phone <~.~.~.~.~> (ap0)RPi(wlan0) <.~.~.~.~.> router <───> INTERNET
╲ ╱ ╲ wan
(dhcp 192.168.50.50 (192.168.50.1 (dhcp 192.168.1.2
from RPi) +DHCP server) from router)
安装dnsmasq和hostapd(类似于Raspberry的文档):
sudo -Es
apt install -y dnsmasq hostapd
为访问点配置hostapd:
test -f /etc/hostapd/hostapd.conf || cat > /etc/hostapd/hostapd.conf <<\EOF
ctrl_interface=/var/run/hostapd
driver=nl80211
country_code=IT # Use your country code
ssid=YourSessionIdentifier
hw_mode=g
channel=7
auth_algs=1
wpa=2
wpa_passphrase=verySecretPassword
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
EOF
chmod 600 /etc/hostapd/hostapd.conf
# edit /etc/hostapd/hostapd.conf and verify it
在wlan0上测试uap0虚拟设备的创建和删除:
/sbin/iw dev wlan0 interface add uap0 type __ap
/sbin/iw dev uap0 del
不会产生错误。
如果第一个该命令失败,设备或资源繁忙(-16),这意味着设备驱动程序不允许创建其他“类型AP”接口,这些接口正忙于其他服务(例如,AP或P2P-GO组已处于活动状态,并且必须删除才能激活此新服务。)
检查以下命令:
iw list | grep "Supported interface modes" -A 8
它应该返回包括AP在内的一行。如果仅返回STA和Managed,则开发板的设备驱动程序(或硬件本身)不允许创建AP接口。
Raspberry Pi 4的输出:
Supported interface modes:
* IBSS
* managed
* AP
* P2P-client
* P2P-GO
* P2P-device
使用此功能命令以检查允许的组合选项:
iw list | grep "valid interface combinations" -A 8
每行都包含其他组合。使用Raspberry Pi 4 B中包含的Broadcom BCM2711 SoC,我得到以下信息:
valid interface combinations:
* #{ managed } <= 1, #{ P2P-device } <= 1, #{ P2P-client, P2P-GO } <= 1,
total <= 3, #channels <= 2
* #{ managed } <= 1, #{ AP } <= 1, #{ P2P-client } <= 1, #{ P2P-device } <= 1,
total <= 4, #channels <= 1
Device supports scan flush.
Device supports randomizing MAC-addr in sched scans.
Supported extended features:
* [ 4WAY_HANDSHAKE_STA_PSK ]: 4-way handshake with PSK in station mode
这意味着不能同时配置一个以上的AP或P2P-GO接口。
如果创建和删除uap0虚拟设备的测试成功,则可以继续,在wlan0上启动uap0 AP虚拟接口:
SYSTEMD_EDITOR=tee systemctl edit --force --full uap@.service <<\EOF
[Unit]
Description=IEEE 802.11 %p%i AP on wlan%i with hostapd
After=network.target
[Service]
Type=forking
PIDFile=/run/hostapd.pid
Restart=on-failure
RestartSec=2
Environment=DAEMON_CONF=/etc/hostapd/hostapd.conf
EnvironmentFile=-/etc/default/hostapd
ExecStartPre=/sbin/iw dev wlan%i interface add %p%i type __ap
ExecStart=/usr/sbin/hostapd -i %p%i -P /run/hostapd.pid -B $DAEMON_OPTS ${DAEMON_CONF}
ExecStopPost=-/sbin/iw dev %p0 del
[Install]
WantedBy=multi-user.target
EOF
systemctl stop hostapd # if the default hostapd service was active before
systemctl disable hostapd # if the default hostapd service was enabled before
systemctl enable uap@0.service
rfkill unblock wlan
以后,您可能想使用以下方法手动编辑它:
sudo -Es
#export SYSTEMD_EDITOR=vi # uncomment this if you like "vi", otherwise "edit" will be used
export SYSTEMD_EDITOR=vi systemctl edit --full uap@.service
exit
某些配置(尤其是相关的到旧的ifupdown模式),请考虑在/etc/udev/rules.d中添加静态规则以调出uap0 AP接口,例如
ACTION=="add", SUBSYSTEM=="ieee80211", KERNEL=="phy0", RUN+="/sbin/iw phy %k interface add uap0 type __ap"
;因为我们使用ExecStartPre
服务定义的ExecStopPost
和uap@
语句对此进行参数化,所以重要的是您的配置中/etc/udev/rules.d中不要包含此类规则。现在我们为客户端连接设置wpa_supplicant。
我们需要通过编辑/etc/dhcpcd.conf来更新dhcpcd(默认的DHCP客户端),并在最后添加以下内容(这些设置替换了Raspberry网站中建议的配置,该配置将静态地址改为wlan0) DHCP客户端;参考“定义无线接口IP配置”):
interface wlan0 # these two lines are not strictly needed, as wlan0 uses the default configuration
dhcp
interface uap0 # this defines static addressing to uap0 and disables wpa_supplicant for this interface
static ip_address=192.168.50.1/24
ipv4only
nohook wpa_supplicant
与Raspberry站点中的描述相比,请注意,除了删除静态地址外,我们将在下面不使用
nohook wpa_supplicant
接口wlan0,以便通过默认的dhcpcd钩子激活wpa_supplicant。要验证此钩子,请检查/ lib / dhcpcd / dhcpcd-hooks目录中包含的文件:其中之一是10-wpa_supplicant,这是负责用于激活wpa_supplicant新界面。当dhcpcd发现新接口时,它将自动运行。
wpa_supplicant(Wi-Fi站点代理)使用的文件是默认文件:/etc/wpa_supplicant/wpa_supplicant.conf。我们假设它已经配置并且可以运行;否则,您可以使用模板进行配置:
test -f /etc/wpa_supplicant/wpa_supplicant.conf || cat >/etc/wpa_supplicant/wpa_supplicant.conf <<\EOF
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=IT
network={
ssid="TestNet"
psk="realyNotMyPassword"
key_mgmt=WPA-PSK
}
EOF
# edit /etc/wpa_supplicant/wpa_supplicant.conf and verify it
chmod 600 /etc/wpa_supplicant/wpa_supplicant.conf
systemctl disable wpa_supplicant.service # not used, as the agent is hooked by dhcpcd
然后我们可以按照Raspberry的文档来启用路由和IP伪装:
sudo DEBIAN_FRONTEND=noninteractive apt install -y netfilter-persistent iptables-persistent
使用以下命令创建文件,其内容如下:
test -f /etc/sysctl.d/routed-ap.conf || cat >/etc/sysctl.d/routed-ap.conf <<\EOF
# https://www.raspberrypi.org/documentation/configuration/wireless/access-point-routed.md
# Enable IPv4 routing
net.ipv4.ip_forward=1
EOF
# edit /etc/sysctl.d/routed-ap.conf and verify it
更新防火墙规则:
# Add firewall rules
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
sudo iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
sudo iptables -A FORWARD -i wlan0 -o uap0 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i uap0 -o wlan0 -j ACCEPT
sudo netfilter-persistent save
dnsmasq配置遵循Raspberry的示例:
-override“> cat >> /etc/dnsmasq.conf <<\EOF
# disables dnsmasq reading any other files like /etc/resolv.conf for nameservers
no-resolv
interface=uap0
no-dhcp-interface=lo,wlan0
domain-needed
bogus-priv
server=8.8.8.8
dhcp-range=192.168.50.50,192.168.50.199,12h
dhcp-option=3,192.168.50.1
EOF
# edit /etc/dnsmasq.conf and verify it
配置完成。必须在测试之前重新引导。
reboot
uap@0.service上的systemctl命令允许禁用,启用和监视AP功能。 ;例如,要停止AP,删除虚拟接口并释放设备驱动程序资源,可以发出:
sudo systemctl stop uap@0
要重新启动该服务:
sudo systemctl stop dhcpcd && sudo systemctl start uap@0 && sudo systemctl start dhcpcd
请注意,在两种情况下,wlan0链接都会断开几秒钟,然后又重新上升;反过来,wlan0上的活动TCP连接也不会丢失。
需要在启动uap0之前暂时停止dhcpcd才能停止wpa_supplicant(由dhcpcd挂掉);这是为了避免Broadcom驱动程序问题“无法启用fw请求者”(出于某些奇怪的原因,设备驱动程序尝试为此接口重新加载已经加载的固件请求者)。
如果配置了wlan1来代替Raspberry Pi的默认wlan0 Wi-Fi功能(例如,支持访问点模式的USB无线加密狗),将wlan0替换为wlan1,将uap @ 0替换为uap @ 1,将uap0替换为uap1,每次“ wlan0”,“ uap @ 0”和“ uap0”被提及。
要为AP接口使用与uap不同的根名称(例如,引用uap0),请在每次提及时使用新名称进行更改。
Raspberry的文档描述了如何将Raspberry Pi设置为桥接无线接入点。以太网接口用于将Raspberry连接到上游路由器(例如,具有Internet访问功能并具有DHCP服务器的功能)。在这种配置下,Raspberry Pi本身可以通过其br0无线接口访问,但不能通过其以太网接口访问,该以太网接口参与桥接功能,并且未分配IP地址。同样,为避免重置活动会话,不得将以太网接口与上游路由器断开连接。如Ingo所述,无法将Wi-Fi客户端连接桥接到上游路由器。
评论
这看起来像是一个很好的教程(我没有尝试过,对功能没有任何渴望)。我有两个问题-您似乎以root用户身份登录; Raspbian没有根账户,也没有解释。当您只列出文件(并使用sudo复制)时,为什么选择“#cat> /etc/wpa_supplicant/wpa_supplicant-wlan0.conf << EOF”?
–地铁
18-10-9在23:06
@Milliways有几个命令,它们都必须以sudo开头。为了简化它,我喜欢在具有用户权限但具有root权限的shell中工作。您可以简单地使用sudo -Es调用它。您将在步骤中找到它,并且还将找到一个出口(如果不重新启动)。
– Ingo
18-10-9在23:29
我试了一下,就像梦一样(没有桥梁)。我是在Rasp Zero W上完成的。谢谢!
–grimpp
19 Mar 1 '19 at 8:43
@thewebjackal要将wpa_suppliant作为服务进行管理,例如启动,停止,重新启动,启用,禁用等,我将使用systemd。这样,systemd始终会成为服务状态。管理wpa_supplicant的详细信息,例如动态添加网络,强制连接到特定热点等,我将使用wpa_cli。通常,如果可能,请使用systemctl。
– Ingo
20-2-24在8:13
@Chiwda最近,我已使用systemd名称解析更新了安装程序。也许有问题?我会检查一下,请稍等...
– Ingo
20年5月9日在17:46