我新买的、闪亮的家用 NAS 电脑运行着 Ubuntu 20.04,具有千兆有线连接和 ath-9k 芯片组双频(2.5/5 GHz)wifi 卡。我当前的无线 AP 只有一个 2.5 GHz 无线电,而在我所在的地区,2.5 GHz 相当拥挤。我想使用新电脑从局域网桥接到新的 5 GHz 无线网络,但目前使用与局域网/Wifi 相同的 DHCP 服务器/默认网关/DNS 服务器。这是因为我有一台单板计算机作为默认网关,透明地拦截广告(以及其他功能)。我只需禁用 ISP 提供的路由器上的 DHCP 服务器并使用我自己的服务器(它也是网关,将数据包路由到路由器作为其上唯一的设备)即可实现此目的
以下是我所拥有内容的简短 ascii-art 描述:
+----+ +------------------+
| WAN+------+ISP Router |
+----+ +------------------+ +--------------------+
|1000-Base-T +---------+LAN |
|2.4 GHz (WPA2/PSK)+-------+ +--------------------+ +-----------------+
+------------------+ | |SBC DHCPd / DNS / GW+----+Wired clients (*)|
| +--------------------+ +-----------------+
|
| +-----------------------+
+-+2.4GHz Wireless clients|
+-----------------------+
我认为我想将计算机配置为有线连接和 wifi 之间的第 2 层桥接器。我不想使用它,hostapd
因为我不想让它进行 NAT 和路由——我可能想从有线设备 ssh 到可能与其关联的无线设备。我还希望设备能够在 2.4 GHz 和 5 GHz 之间无缝切换——我相信这样做就像拥有相同的 SSID、身份验证方法(即 WPA2/PSK)和密钥一样简单。
简而言之,我认为我想改变上面的图表以在标记 (*) 的节点处包含“5 GHz 无线客户端”。
我的卡支持 AP 模式和很多其他功能:这是的输出lshw
和(非常长的!)的输出iw list
:
*-network
description: Wireless interface
product: AR93xx Wireless Network Adapter
vendor: Qualcomm Atheros
physical id: 0
bus info: pci@0000:03:00.0
logical name: wlp3s0
version: 01
serial: 14:cc:20:10:a6:fa
width: 64 bits
clock: 33MHz
capabilities: pm msi pciexpress bus_master cap_list rom ethernet physical wireless
configuration: broadcast=yes driver=ath9k driverversion=5.4.0-39-generic firmware=N/A latency=0 link=no multicast=yes wireless=IEEE 802.11
resources: irq:101 memory:fc900000-fc91ffff memory:fc920000-fc92ffff
----
# iw list
Wiphy phy0
max # scan SSIDs: 4
max scan IEs length: 2257 bytes
max # sched scan SSIDs: 0
max # match sets: 0
max # scan plans: 1
max scan plan interval: -1
max scan plan iterations: 0
Retry short limit: 7
Retry long limit: 4
Coverage class: 0 (up to 0m)
Device supports RSN-IBSS.
Device supports AP-side u-APSD.
Device supports T-DLS.
Supported Ciphers:
* WEP40 (00-0f-ac:1)
* WEP104 (00-0f-ac:5)
* TKIP (00-0f-ac:2)
* CCMP-128 (00-0f-ac:4)
* CCMP-256 (00-0f-ac:10)
* GCMP-128 (00-0f-ac:8)
* GCMP-256 (00-0f-ac:9)
* CMAC (00-0f-ac:6)
* CMAC-256 (00-0f-ac:13)
* GMAC-128 (00-0f-ac:11)
* GMAC-256 (00-0f-ac:12)
Available Antennas: TX 0x7 RX 0x7
Configured Antennas: TX 0x7 RX 0x7
Supported interface modes:
* IBSS
* managed
* AP
* AP/VLAN
* monitor
* mesh point
* P2P-client
* P2P-GO
* outside context of a BSS
Band 1:
Capabilities: 0x11ef
RX LDPC
HT20/HT40
SM Power Save disabled
RX HT20 SGI
RX HT40 SGI
TX STBC
RX STBC 1-stream
Max AMSDU length: 3839 bytes
DSSS/CCK HT40
Maximum RX AMPDU length 65535 bytes (exponent: 0x003)
Minimum RX AMPDU time spacing: 8 usec (0x06)
HT TX/RX MCS rate indexes supported: 0-23
Bitrates (non-HT):
* 1.0 Mbps
* 2.0 Mbps (short preamble supported)
* 5.5 Mbps (short preamble supported)
* 11.0 Mbps (short preamble supported)
* 6.0 Mbps
* 9.0 Mbps
* 12.0 Mbps
* 18.0 Mbps
* 24.0 Mbps
* 36.0 Mbps
* 48.0 Mbps
* 54.0 Mbps
Frequencies:
* 2412 MHz [1] (20.0 dBm)
* 2417 MHz [2] (20.0 dBm)
* 2422 MHz [3] (20.0 dBm)
* 2427 MHz [4] (20.0 dBm)
* 2432 MHz [5] (20.0 dBm)
* 2437 MHz [6] (20.0 dBm)
* 2442 MHz [7] (20.0 dBm)
* 2447 MHz [8] (20.0 dBm)
* 2452 MHz [9] (20.0 dBm)
* 2457 MHz [10] (20.0 dBm)
* 2462 MHz [11] (20.0 dBm)
* 2467 MHz [12] (20.0 dBm)
* 2472 MHz [13] (20.0 dBm)
* 2484 MHz [14] (disabled)
Band 2:
Capabilities: 0x11ef
RX LDPC
HT20/HT40
SM Power Save disabled
RX HT20 SGI
RX HT40 SGI
TX STBC
RX STBC 1-stream
Max AMSDU length: 3839 bytes
DSSS/CCK HT40
Maximum RX AMPDU length 65535 bytes (exponent: 0x003)
Minimum RX AMPDU time spacing: 8 usec (0x06)
HT TX/RX MCS rate indexes supported: 0-23
Bitrates (non-HT):
* 6.0 Mbps
* 9.0 Mbps
* 12.0 Mbps
* 18.0 Mbps
* 24.0 Mbps
* 36.0 Mbps
* 48.0 Mbps
* 54.0 Mbps
Frequencies:
* 5180 MHz [36] (23.0 dBm)
* 5200 MHz [40] (23.0 dBm)
* 5220 MHz [44] (23.0 dBm)
* 5240 MHz [48] (23.0 dBm)
* 5260 MHz [52] (23.0 dBm) (no IR, radar detection)
* 5280 MHz [56] (23.0 dBm) (no IR, radar detection)
* 5300 MHz [60] (23.0 dBm) (no IR, radar detection)
* 5320 MHz [64] (23.0 dBm) (no IR, radar detection)
* 5500 MHz [100] (disabled)
* 5520 MHz [104] (disabled)
* 5540 MHz [108] (disabled)
* 5560 MHz [112] (disabled)
* 5580 MHz [116] (disabled)
* 5600 MHz [120] (disabled)
* 5620 MHz [124] (disabled)
* 5640 MHz [128] (disabled)
* 5660 MHz [132] (disabled)
* 5680 MHz [136] (disabled)
* 5700 MHz [140] (disabled)
* 5745 MHz [149] (30.0 dBm)
* 5765 MHz [153] (30.0 dBm)
* 5785 MHz [157] (30.0 dBm)
* 5805 MHz [161] (30.0 dBm)
* 5825 MHz [165] (30.0 dBm)
Supported commands:
* new_interface
* set_interface
* new_key
* start_ap
* new_station
* new_mpath
* set_mesh_config
* set_bss
* authenticate
* associate
* deauthenticate
* disassociate
* join_ibss
* join_mesh
* remain_on_channel
* set_tx_bitrate_mask
* frame
* frame_wait_cancel
* set_wiphy_netns
* set_channel
* set_wds_peer
* tdls_mgmt
* tdls_oper
* probe_client
* set_noack_map
* register_beacons
* start_p2p_device
* set_mcast_rate
* connect
* disconnect
* channel_switch
* set_qos_map
* set_multicast_to_unicast
Supported TX frame types:
* IBSS: 0x00 0x10 0x20 0x30 0x40 0x50 0x60 0x70 0x80 0x90 0xa0 0xb0 0xc0 0xd0 0xe0 0xf0
* managed: 0x00 0x10 0x20 0x30 0x40 0x50 0x60 0x70 0x80 0x90 0xa0 0xb0 0xc0 0xd0 0xe0 0xf0
* AP: 0x00 0x10 0x20 0x30 0x40 0x50 0x60 0x70 0x80 0x90 0xa0 0xb0 0xc0 0xd0 0xe0 0xf0
* AP/VLAN: 0x00 0x10 0x20 0x30 0x40 0x50 0x60 0x70 0x80 0x90 0xa0 0xb0 0xc0 0xd0 0xe0 0xf0
* mesh point: 0x00 0x10 0x20 0x30 0x40 0x50 0x60 0x70 0x80 0x90 0xa0 0xb0 0xc0 0xd0 0xe0 0xf0
* P2P-client: 0x00 0x10 0x20 0x30 0x40 0x50 0x60 0x70 0x80 0x90 0xa0 0xb0 0xc0 0xd0 0xe0 0xf0
* P2P-GO: 0x00 0x10 0x20 0x30 0x40 0x50 0x60 0x70 0x80 0x90 0xa0 0xb0 0xc0 0xd0 0xe0 0xf0
* P2P-device: 0x00 0x10 0x20 0x30 0x40 0x50 0x60 0x70 0x80 0x90 0xa0 0xb0 0xc0 0xd0 0xe0 0xf0
Supported RX frame types:
* IBSS: 0x40 0xb0 0xc0 0xd0
* managed: 0x40 0xd0
* AP: 0x00 0x20 0x40 0xa0 0xb0 0xc0 0xd0
* AP/VLAN: 0x00 0x20 0x40 0xa0 0xb0 0xc0 0xd0
* mesh point: 0xb0 0xc0 0xd0
* P2P-client: 0x40 0xd0
* P2P-GO: 0x00 0x20 0x40 0xa0 0xb0 0xc0 0xd0
* P2P-device: 0x40 0xd0
software interface modes (can always be added):
* AP/VLAN
* monitor
valid interface combinations:
* #{ managed } <= 2048, #{ AP, mesh point } <= 8, #{ P2P-client, P2P-GO } <= 1,
total <= 2048, #channels <= 1, STA/AP BI must match
HT Capability overrides:
* MCS: ff ff ff ff ff ff ff ff ff ff
* maximum A-MSDU length
* supported channel width
* short GI for 40 MHz
* max A-MPDU length exponent
* min MPDU start spacing
Device supports TX status socket option.
Device supports HT-IBSS.
Device supports SAE with AUTHENTICATE command
Device supports low priority scan.
Device supports scan flush.
Device supports AP scan.
Device supports per-vif TX power setting
P2P GO supports CT window setting
Driver supports full state transitions for AP/GO clients
Driver supports a userspace MPM
Device supports active monitor (which will ACK incoming frames)
Driver/device bandwidth changes during BSS lifetime (AP/GO mode)
Device supports configuring vdev MAC-addr on create.
Supported extended features:
* [ RRM ]: RRM
* [ FILS_STA ]: STA FILS (Fast Initial Link Setup)
* [ CQM_RSSI_LIST ]: multiple CQM_RSSI_THOLD records
* [ CONTROL_PORT_OVER_NL80211 ]: control port over nl80211
* [ TXQS ]: FQ-CoDel-enabled intermediate TXQs
* [ AIRTIME_FAIRNESS ]: airtime fairness scheduling
我尝试过这样做bridge-utils
,即通过直接桥接接口:
$ brctl addbr br0
$ brctl addif br0 enp4s0 wlp3s0
不幸的是,这导致计算机上的所有 DNS 解析停止(!)并导致一些我无法理解的“有趣”路由错误:例如,我可以ping 8.8.8.8
但不能dig @8.8.8.8 google.com
。即使这样做
$ brctl br0 down
$ brctl delbr br0
仍然导致重新启动/etc/init.d/networking
。
我不明白为什么这不起作用。我也尝试过使用 Ubuntu 的网络管理器 GUI,创建一个新的“共享”AP——它只是打开了hostapd
,也广泛搜索了谷歌,但找不到明确的答案。我知道具有多个无线网桥的网络拓扑确实存在——配置它的最简单方法是什么?
答案1
有几个复杂因素值得考虑。
最简单的一个是?hostapd 不执行路由或 DHCP,并且可能可以自行顺利运行。
最简单、最小的 hostapd 配置文件如下所示
#change wlan0 to your wireless device
interface=wlan0
driver=nl80211
ssid=test
channel=1
全部它关心的是 wifi,由于各种原因我记得的唯一的低级网络选项是 vlan 标记。
关于如何运行整个堆栈,我有一个很长的答案,并且您实际上有不同的工具来执行 nat masqurade(您的防火墙)、DNS(如果您很厉害,则使用 Bind9,如果您很懒,则使用 DNSMASQ)、DHCP(DHCPd 或 DNSMASQ)、桥接(在您的情况下,是网络管理器,但 systemd/networkd - 可以使用 netplan 作为可选工具来配置,也可以使用 bridgectl 进行经典网络设置...)。ip 可以进行路由,但我从未明确触及过它。
实际上,每种情况都有 2-3 种工具,它们都是可选的,并且可以在同一个盒子上运行,也可以不运行。
但简单的答案是打开带有网络管理器 GUI 的共享 AP 就可以了,并且大概会选择您正在运行的 dns 和 dhcp 堆栈。
答案2
经过一个多月的试验,我想发布我(作为 OP)如何设法找到解决方案。我发现的主要问题是许多基于网络管理器的 GUI 工具会尝试在绑定接口上启动 DHCP 服务器,而我发现“自动”会做什么的解释非常不清楚。
最终,以下方法奏效了。
物理层
首先,我创建了一个适当修改的hostapd
配置文件,以便创建一个无线接入点:
cp /usr/share/doc/hostapd/examples/hostapd.conf /etc/hostapd/hostapd.conf
对于我的 TP-Link TL-WDN4800 N900 PCI-e 卡,这需要modprobe
-ingath9k
驱动程序(如果尚未),然后调整(非常详细!)关于接口的配置文件(wlp3s0
对我来说),明确告知它我们想要创建一个桥接器(bridge=br0
)并设置country_code
、ssid
和hw_mode=a
5 GHz 802.11ac(如果启用了 VHT,则在下面)。通过启用 VHT、80 MHz 通道和各种其他设置,我实际上已经设法获得了 780 MiB/s 的链接速度(在附近的 MacbookPro 上),超过了盒子宣传的链接速度。如果它对其他人有帮助,我将整个文件作为要点这里。
整个过程都需要运行,最好是在启动时运行,因此,我们需要明确启用它(如果你愿意的话!一个更“手动”的选项是在 shell 中调用它,或者使用-B
守护进程选项):
sudo systemctl unmask hostapd
sudo systemctl enable hostapd
sudo systemctl start hostapd
到目前为止,正如 Journeyman Geek 所说,您有一个广播 SSID,设备可以对其进行身份验证。但是,它们的数据包无处可去。
创建桥梁
经过一番折腾,我最终意识到我之前的“困境”如下:(a)我没有意识到网桥本身需要在两个网段上具有相同的 IP(显然),此外,各个物理接口也需要因此关闭(b)由于某些我无法理解的原因,systemd-resolvconf
未能解决任何事物一旦桥建好。
让我们偷懒并使用过时但方便的brutils
包:
apt install bridge-utils #If required
brctl addbr br0 #Create the bridge
brctl addif br0 enp4s0 #Add interfaces to it
brctl addif br0 wlp3s0
然后,我们为网桥分配一个 IP(10.0.0.105
在我的网络上),并将其从其他接口中删除:
ifconfig br0 10.0.0.105 netmask 255.255.255.0
ifconfig enp4s0 0.0.0.0
ifconfig wlp3s0 0.0.0.0
最后,启动网桥:对我来说,这会破坏默认路由表,因为默认路由信息与硬件enp4s0
接口相关联。因此,让我们直接重新添加它和路由器(10.0.0.130
):
ifconfig br0 up
route add default gateway 10.0.0.130
现在,到了这一步,一切——正如我之前所想的——应该可以工作,但令人恼火的是,呃,没有。剩下什么?路由(正确)和 DNS。路由很简单:我们需要明确启用它,然后添加一些iptables
规则来强调这一点:
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -i enp4s0 -j ACCEPT
iptables -A INPUT -i wlp3s0 -j ACCEPT
iptables -A INPUT -i br0 -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
DNS 问题更大。尽管我花了很长时间研究 systemd-resolvconf,但我的所有 DNS 查询都会神秘地消失在以太中,就好像它正在向(现在不起作用的)硬件 enp4s0 接口发送数据包一样。
到目前为止,对我来说最快的事情是禁用 systemd-resolve(systemctl disable systemd-resolve
),然后编辑/etc/resolv.conf
为一个文件(而不是符号链接),其中包含我本地网络的 DNS 服务器(也是10.0.0.130
)和域信息。
突然,一切都正常了!我有一个快速、可配置、透明的无线桥接“范围扩展器”(利用我的千兆网络)。
为了方便以后参考,这是对 Linux 中存在的各种虚拟网络形式的一个很好的介绍——其中一个很好的概述是这里(archive.org链接)希望它能给地球上的其他人带来些许帮助。