Linux开启wifi和热点双用

有些情况下我们需要将连接并认证过的wifi共享出来,这样就无需多个认证达到多人使用了

手动配置

无线网卡是否支持AP模式

无线设备必须兼容 nl80211标准 ,并且支持 AP (Access Point)工作模式。可通过 iw list 命令查看无线网卡设备信息, 输出信息到Supported interface modes 段落中要有 AP 模式:

iw list

输出中包含* AP代表支持AP模式,可开启热点

<!--more-->
Wiphy phy1
...
	Supported interface modes:
...
	 * AP
...
valid interface combinations:
     * #{ managed } <= 2048, #{ AP, mesh point } <= 8, #{ P2P-client, P2P-GO } <= 1,
     total <= 2048, #channels <= 1, STA/AP BI must match
...

注意:#channels <=1 代表开启的热点必须所连wifi用同一信道

创建热点接口

查看无线网卡设备接口

ip a
wlan0: ...
    link/ether ...
    inet ...
    ...

创建虚拟接口

sudo iw dev wlan0 interface add wifi_ap type managed addr 12:34:56:78:ab:cd
# 或
sudo iw phy phy0 interface add wifi_ap type managed addr 12:34:56:78:ab:cd

如需删除接口使用命令sudo iw dev wifi_ap del即可删除

可使用macchanger给虚拟接口生成一个随机Mac地址

sudo macchanger -r wifi_ap

如需恢复Mac地址使用命令macchanger -p wifi_ap

配置热点

安装hostapd

sudo pacman -S hostapd

配置hostapd

sudo vim /etc/hostapd/hostapd.conf
# 添加

# 热点名
ssid=test_wifi_ap
# 配置密码
wpa_passphrase=password
wpa=2
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP CCMP

# 修改

# 接口
interface=wifi_ap
# 信道(保持与wifi一样)
channel=1


# 其它使用默认,也可自行根据注释说明修改

logger_syslog=-1
logger_syslog_level=2
logger_stdout=-1
logger_stdout_level=2
ctrl_interface=/run/hostapd
ctrl_interface_group=0
hw_mode=g
beacon_int=100
dtim_period=2
max_num_sta=255
rts_threshold=-1
fragm_threshold=-1
macaddr_acl=0
auth_algs=3
ignore_broadcast_ssid=0
wmm_enabled=1
wmm_ac_bk_cwmin=4
wmm_ac_bk_cwmax=10
wmm_ac_bk_aifs=7
wmm_ac_bk_txop_limit=0
wmm_ac_bk_acm=0
wmm_ac_be_aifs=3
wmm_ac_be_cwmin=4
wmm_ac_be_cwmax=10
wmm_ac_be_txop_limit=0
wmm_ac_be_acm=0
wmm_ac_vi_aifs=2
wmm_ac_vi_cwmin=3
wmm_ac_vi_cwmax=4
wmm_ac_vi_txop_limit=94
wmm_ac_vi_acm=0
wmm_ac_vo_aifs=2
wmm_ac_vo_cwmin=2
wmm_ac_vo_cwmax=3
wmm_ac_vo_txop_limit=47
wmm_ac_vo_acm=0
eapol_key_index_workaround=0
eap_server=0
own_ip_addr=127.0.0.1

网络设置

可使用网桥或NAT两种模式,网桥模式还得单独取得认证才能上网,而NAT模式则是认证后再将网络转发分享出来

NAT设置

启动包转发

检查包转发配置情况

sudo sysctl -a |grep forward

信息为用于控制每个默认值,每个接口的转发的选项,以及每个接口的IPv4 / IPv6的单独选项

启用临时包转发

sudo sysctl net.ipv4.ip_forward=1

要想选择性地为某一个具体的网卡提供包转发,使用sysctl net.ipv4.conf.interface_name.forwarding=1来代替

永久开启需编辑/etc/sysctl.d/30-ipforward.conf

net.ipv4.ip_forward=1
net.ipv6.conf.default.forwarding=1
net.ipv6.conf.all.forwarding=1

启用NAT

使用iptables配置规则来启用NAT

sudo iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
sudo iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i wifi_ap -o wlan0 -j ACCEPT

# 保存规则
sudo iptables-save > /etc/iptables/iptables.rules

使用nftables启用NAT

sudo nft add table ip nat
sudo nft add chain ip nat prerouting { type nat hook prerouting priority 0 \; }
sudo nft add chain ip nat postrouting { type nat hook postrouting priority 100 \; }

# 永久保存
sudo nft list ruleset > /etc/nftables.conf

配置DHCP

配置DHCP自动分配IP,可通过使用dhcpddnsmasq来启用DHCP服务

DHCP服务器必须允许UDP端口67的传入连接。对于DNS请求,还必须允许到UDP / TCP端口53的传入连接。

iptables -I INPUT -p udp --dport 67 -i net0 -j ACCEPT
iptables -I INPUT -p udp --dport 53 -s 192.168.123.0/24 -j ACCEPT
iptables -I INPUT -p tcp --dport 53 -s 192.168.123.0/24 -j ACCEPT

# 保存规则
sudo iptables-save > /etc/iptables/iptables.rules

使用dhcpd配置

给接口添加静态IP

sudo ip addr add 10.0.0.254/24 dev wifi_ap

配置hdcpd服务
需要安装dhcpd

# 原有的 dhcpd.conf 中包含多个未被注释的示例,所以先将其备份再新建一个
sudo mv /etc/dhcpd.conf /etc/dhcpd.conf.backup
sudo vim /etc/dhcpd.conf

# 添加配置内容
option domain-name-servers 114.114.114.114,8.8.8.8;
option subnet-mask 255.255.255.0;
option routers 10.0.0.254;
subnet 10.0.0.0 netmask 255.255.255.0 {
  range 10.0.0.0 10.0.0.0;
}

# 配置MAC地址绑定固定IP
option domain-name-servers 114.114.114.114,8.8.8.8;
option subnet-mask 255.255.255.0;
option routers 10.0.0.254;
subnet 10.0.0.0 netmask 255.255.255.0 {
  range 10.0.0.0 10.0.0.0;
  host macbookpro{
  	hardware ethernet 11:22:33:aa:bb:cc;
  	fixed-address 10.0.0.10;
  }
}

启动DHCP服务

# 启用IPv4 DHCP
sudo systemctl start dhcpd4

# 启动IPv6 DHCP
sudo systemctl start dhcpd6

开启热点

启动hostapd即可

sudo systemctl start hostapd

使用脚本

安装

详解参考create_ap仓库

ArchLinux系可直接用pacman安装

sudo pacman -S create_ap

使用

添加虚拟网络接口并设置地址

sudo iw dev wlan0 interface add wifi_ap  type managed addr 12:34:56:78:ab:cd

配置热点

sudo create_ap -c 11 wifi_ap\ eth0 SSID passwowd

参考:
Linux连接wifi同时开启热点
Software access point
Linux 设置 wifi 共享(wifi 到 wifi)