桥接 VLAN 和 Wifi

桥接 VLAN 和 Wifi

我正在构建自己的基于 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-无线适配器

解决方案

  1. 定义每个网络接口(包括名为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
    
  2. 重启网络

    [admin@router ~]$ sudo service network start
    
  3. 设置 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
    
  4. 创建 systemd 服务以添加wls4到桥上br0并启动 hostapd。我这样做的原因如下:

    • wls4偶尔会从桥上掉下来br0当我在 hostapd.conf 中添加桥接声明时
    • 在 hostapd 成功启动之前,我首先需要调用rfkill unblock wlan
  5. 创造/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
    
  6. 制作/root/launch_hostapd.sh可执行文件

    [admin@router ~]$ sudo chmod +x /root/launch_hostapd.sh
    
  7. 创造/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
    
  8. 重新加载 systemctl 守护进程

    [admin@router ~]$ sudo systemctl daemon-reload
    
  9. 启用/启动 launch_hostpad 服务

    [admin@router ~]$ sudo systemctl enable launch_hostapd
    [admin@router ~]$ sudo systemctl start launch_hostapd
    

结论

我希望这可以帮助那些想要桥接他们的 LAN 和 WLAN 接口并尝试通过 hostapd 托管 AP 的人。

相关内容