Ad-hoc networking
Independent Basic Service Set(独立基本服务集),缩写是 IBSS,也被称为自组网络,是一种不使用中心控制节点,就能让一组设备相互通讯的方法。是点对点网络的一种,网络中的设备直接通讯,不需要中转。自组网络可以用来进行网络共享。
要求[编辑 | 编辑源代码]
所有要连接到网络的设备都具有兼容 [1] 的无线网卡。
Wifi 链路层[编辑 | 编辑源代码]
因为 IBSS 网络是点对点网络,所有设备都应该使用相同的 wifi 连接设置。
提示:可以设置更复杂的网络拓扑,Linux 无线文档 包含更高级的示例。
手动设置[编辑 | 编辑源代码]
警告: 此方法创建的是 非加密 自组网络,要创建加密网络,请参考 #wpa_supplicant.
详细信息请参考网络配置/Wireless#iw。请先安装软件包 iw包。
设置操作模式为 ibss:
# iw interface set type ibss
启动接口(可能需要额外的 rfkill unblock wifi
):
# ip link set interface up
现在可以创建自组网络了,将 your_ssid 替换为实际的网络,frequency 替换为以 MHz 为单位的频率。频道和频率的对应关系,请参考, 这里。
# iw interface ibss join your_ssid frequency
wpa_supplicant[编辑 | 编辑源代码]
确保已经安装了 wpa_supplicant包,并进行了配置(参考 wpa_supplicant).
/etc/wpa_supplicant-adhoc.conf
ctrl_interface=DIR=/run/wpa_supplicant GROUP=wheel # use 'ap_scan=2' on all devices connected to the network # this is unnecessary if you only want the network to be created when no other networks are available ap_scan=2 network={ ssid="MySSID" mode=1 frequency=2432 proto=RSN key_mgmt=WPA-PSK pairwise=CCMP group=CCMP psk="secret passphrase" }
所有连接到网络的设备运行下面 wpa_supplicant 命令:
# wpa_supplicant -B -i interface -c /etc/wpa_supplicant-adhoc.conf -D nl80211,wext
网络配置[编辑 | 编辑源代码]
最后一步是给网络中的所有设备分配 IP 地址,有多种方法:
- 分配静态 IP 地址,参考:网络配置#Static IP address.
- 在一个设备上运行 DHCP,参考 dhcpd 或 dnsmasq.
- 运行 avahi-autoipd. 参考 Avahi#Obtaining IPv4LL IP address.
要向自组网络共享外网连接,请参考 Internet sharing.
技巧[编辑 | 编辑源代码]
使用 NetworkManager[编辑 | 编辑源代码]
如果使用 NetworkManager,可以使用 nm-applet 进行自组网络配置,不用使用手动方法。详情参考 NetworkManager#Sharing internet connection over Wi-Fi。
自定义 systemd 服务(使用 wpa_supplicant 和静态 IP)[编辑 | 编辑源代码]
可以使用下面模板启用无线自组网络:
/etc/conf.d/network-wireless-adhoc@interface
addr=192.168.0.2 mask=24
/etc/systemd/system/network-wireless-adhoc@.service
[Unit] Description=Ad-hoc wireless network connectivity (%i) Wants=network.target Before=network.target BindsTo=sys-subsystem-net-devices-%i.device After=sys-subsystem-net-devices-%i.device [Service] Type=oneshot RemainAfterExit=yes EnvironmentFile=/etc/conf.d/network-wireless-adhoc@%i # perhaps rfkill is not needed for you ExecStart=/usr/bin/rfkill unblock wifi ExecStart=/usr/bin/ip link set %i up ExecStart=/usr/bin/wpa_supplicant -B -i %i -D nl80211,wext -c /etc/wpa_supplicant-adhoc.conf ExecStart=/usr/bin/ip addr add ${addr}/${mask} dev %i ExecStop=/usr/bin/ip addr flush dev %i ExecStop=/usr/bin/ip link set %i down [Install] WantedBy=multi-user.target