我需要一个与有线以太网端口桥接的无线访问点,并通过客户端连接作为上行链路连接到另一个wifi互联网路由器。通过wifi或通过有线以太网连接到RasPi的所有设备都应该可以访问Internet,并且应该可以相互连接。

如何用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

评论


这看起来像是一个很好的教程(我没有尝试过,对功能没有任何渴望)。我有两个问题-您似乎以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

#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.servicewpa_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服务定义的ExecStopPostuap@语句对此进行参数化,所以重要的是您的配置中/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客户端连接桥接到上游路由器。