我正在构建自己的基于 Linux 的路由器,在连接 wifi 和 LAN 网络时遇到了问题。该盒子以前运行 pfSense,但由于无法使用我的内部 wifi 适配器,我决定在 CentOS 7 上构建自己的路由器。
该盒子只有一个以太网端口,因此我设置了一个管理型交换机来创建两个 VLAN:
- enp3s0.10:局域网
- enp3s0.99:广域网
我设置了 hostapd,连接到 wifi 接入点,但发现我的设备无法从 DHCP 服务器获取 IP。连接到我的网络的 wifi 设备需要能够访问有线 LAN 上的其他设备,例如我的 DHCP 和 DNS 服务。
我尝试过将 enp3s0.10 与 wifi 适配器 (wls4) 桥接,但这只会导致我的 LAN 端口无法从外部访问。是否可以使用无线适配器桥接 VLAN,或者是否有更好的方法来实现这一点?廉价的消费级路由器如何实现这一点?
网络拓扑结构
根据要求(感谢 Damiano Verzulli),我添加了我的网络拓扑图。由于我的声誉点数不足 10,我被迫提供一个链接。
笔记:
- 路由器 Linux 盒(图中的“路由器”)有一个以太网端口(enp3s0)和一个内部 wifi 适配器(wls4)
- 除了 enp3s0.99(从我的电缆调制解调器接收其地址/子网)外,我的 LAN 上的所有其他设备的地址都在 192.168.1.0/24 空间中
答案1
我设法解决了我的问题,并想与将来可能遇到类似问题的人分享。
我的网络
- enp3s0-物理以太网适配器
- enp3s0.10-VLAN;连接到 LAN
- enp3s0.99-VLAN;连接到 WAN(电缆调制解调器)
- wls4-无线适配器
解决方案
定义每个网络接口(包括名为br0)
设置值/etc/sysconfig/网络脚本/ifcfg-enp3s0到:
TYPE=Ethernet BOOTPROTO=none DEVICE=enp3s0 ONBOOT=yes
设置值/etc/sysconfig/网络脚本/ifcfg-br0到:
DEVICE=br0 TYPE=Bridge IPADDR=192.168.1.1 NETMASK=255.255.255.0 ONBOOT=yes BOOTPROTO=none
设置值/etc/sysconfig/network-scripts/ifcfg-enp3s0.10到:
DEVICE=enp3s0.10 BOOTPROTO=none ONBOOT=yes BRIDGE=br0 VLAN=yes
设置值/etc/sysconfig/network-scripts/ifcfg-enp3s0.99到:
DEVICE=enp3s0.99 BOOTPROTO=dhcp ONBOOT=yes VLAN=Yes
重启网络
[admin@router ~]$ sudo service network start
设置 hostapd
设置值/etc/hostapd/hostapd.conf到:
# # For more information: # # https://wireless.wiki.kernel.org/en/users/Documentation/hostapd # https://w1.fi/cgit/hostap/plain/hostapd/hostapd.conf # # Wireless Interface interface=wls4 driver=nl80211 # Wireless Environment ssid=[router_ssid_here] hw_mode=g channel=1 # Authentication and Encryption macaddr_acl=0 auth_algs=1 ignore_broadcast_ssid=0 wpa=2 wpa_passphrase=[ap_password_here] wpa_key_mgmt=WPA-PSK wpa_pairwise=TKIP rsn_pairwise=CCMP # Country country_code=US ieee80211d=1 # IEEE 802.11ac (req hw_mode=a) # ieee80211ac=1 # IEEE 802.11n ieee80211n=1 # WMM wmm_enabled=1
创建 systemd 服务以添加wls4到桥上br0并启动 hostapd。我这样做的原因如下:
- wls4偶尔会从桥上掉下来br0当我在 hostapd.conf 中添加桥接声明时
- 在 hostapd 成功启动之前,我首先需要调用
rfkill unblock wlan
创造/root/launch_hostapd.sh(必须以 root 身份执行)
#!/bin/bash # Set 4addr on wifi adapter iw dev wls4 set 4addr on # Add wifi adapter to bridge br0 ip link set wls4 master br0 # Unblock wlan rfkill unblock wlan # Launch hostapd systemctl start hostapd
制作/root/launch_hostapd.sh可执行文件
[admin@router ~]$ sudo chmod +x /root/launch_hostapd.sh
创造/etc/systemd/system/launch_hostapd.service(必须以 root 身份执行)
[Unit] Description=Runs "rfkill unblock wlan" and then launches hostapd After=network.target [Service] Type=simple ExecStart=/root/launch_hostapd.sh TimeoutStartSec=0 [Install] WantedBy=default.target
重新加载 systemctl 守护进程
[admin@router ~]$ sudo systemctl daemon-reload
启用/启动 launch_hostpad 服务
[admin@router ~]$ sudo systemctl enable launch_hostapd [admin@router ~]$ sudo systemctl start launch_hostapd
结论
我希望这可以帮助那些想要桥接他们的 LAN 和 WLAN 接口并尝试通过 hostapd 托管 AP 的人。