IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    Linux 下的 Wi-Fi 分享

    依云发表于 2016-09-13 12:26:24
    love 0

    本文来自依云's Blog,转载请注明。

    首先看看你的网卡和驱动组合是否支持这样的操作。

    >>> iw list | grep -A2 combinations:
            valid interface combinations:
                     * #{ managed } <= 1, #{ AP, P2P-client, P2P-GO } <= 1, #{ P2P-device } <= 1,
                       total <= 3, #channels <= 2
    

    上边这个输出说明支持,并且频道可以不一样。

    然后,添加一个用途 AP 的网络接口,并配置 IP 地址。我的无线网络接口名字是 wlan0,因为我通过创建空 /etc/udev/rules.d/80-net-setup-link.rules 文件的方式禁用了 systemd 的网络接口改名。

    sudo iw dev wlan0 interface add wlan0_ap type __ap
    sudo ifconfig wlan0_ap 192.168.17.1
    

    配置 NAT:

    echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
    sudo iptables -w -t nat -A POSTROUTING -s 192.168.17.0/24 -j MASQUERADE
    

    配置 DHCP。我用的是 dnsmasq。它本来是作为 DNS 缓存用的,但是也支持 DHCP,那就用它了:

    interface=wlan0_ap
    no-dhcp-interface=wlan0
    dhcp-range=192.168.17.50,192.168.17.150,12h
    

    注意不要在其它只提供 DNS 服务的接口上提供 DHCP 服务,以免出现冲突。

    然后就可以开启热点啦。hostapd 配置如下:

    interface=wlan0_ap
    driver=nl80211
    ssid=名字
    channel=1
    hw_mode=g
    ieee80211d=1
    country_code=cn
    ieee80211n=1
    ieee80211h=1
    ignore_broadcast_ssid=0
    auth_algs=1
    wpa=2
    wpa_passphrase=secret
    wpa_key_mgmt=WPA-PSK
    wpa_pairwise=TKIP
    rsn_pairwise=CCMP
    

    最后把它们跑起来就可以了。

    为了方便使用,我创建了个 systemd 服务 wlan0_ap.service:

    [Unit]
    Description=Setup wlan0_ap
    Before=hostapd.service
    After=sys-subsystem-net-devices-wlan0.device
    After=iptables.service
    
    [Service]
    Type=oneshot
    RemainAfterExit=yes
    ExecStart=/usr/bin/iw dev wlan0 interface add wlan0_ap type __ap
    ExecStart=/usr/bin/ip address add dev wlan0_ap 192.168.17.1/24
    ExecStart=/usr/bin/iptables -w -t nat -A POSTROUTING -s 192.168.17.0/24 -j MASQUERADE
    ExecStop=-/usr/bin/iptables -w -t nat -D POSTROUTING -s 192.168.17.0/24 -j MASQUERADE
    ExecStop=/usr/bin/ip address delete dev wlan0_ap 192.168.17.1/24
    ExecStop=/usr/bin/iw dev wlan0_ap del
    
    [Install]
    WantedBy=hostapd.service
    

    systemctl enable wlan0_ap 之后就可以直接 systemctl start hostapd 来启动了~当然也很容易停止服务:systemctl stop hostapd wlan0_ap。我的 dnsmasq 总是开启的,所以就不用加依赖了。还有 ipv4_forward 我也是早就写到配置文件 /etc/sysctl.d/99-sysctl.conf 里的。



沪ICP备19023445号-2号
友情链接