我想在我的 USB 无线网络适配器 9271 Atheros 上创建一个 WiFi 接入点 (AP),hostapd
并dnsmasq
通过我的适配器使用连接到路由器的互联网eth0
。
lsusb
Bus 003 Device 003: ID 0cf3:9271 Atheros Communications, Inc. AR9271 802.11n
9271 Atheros 的 MAC 地址是00:1a:8c:30:08:b1
。
我的 Android 手机的 MAC 地址是f0:79:59:cb:d8:eb
我的无线网卡的数据是:
输出至iw list
::
Supported interface modes:
* IBSS
* managed
* AP
* AP/VLAN
* monitor
* mesh point
* P2P-client
* P2P-GO
内容/etc/network/interfaces
::
auto dsl-provider
iface dsl-provider inet ppp
pre-up /bin/ip link set eth0 up
provider dsl-provider
auto eth0
iface eth0 inet static
address 192.168.22.1
netmask 255.255.255.0
dns-server 114.114.114.114
auto wlan0
iface wlan0 inet dhcp
内容/etc/hostapd/hostapd.conf
::
hw_mode=g
channel=11
driver=nl80211
ssid=test
interface=wlan0
# encryption
wpa=2
wpa_passphrase=password
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP CCMP
rsn_pairwise=CCMP
ctrl_interface=/var/run/hostapd
# Only root can configure hostapd
ctrl_interface_group=0
内容/etc/dnsmasq.conf
:
log-queries
log-facility=/var/log/dnsmasq/dnsmasq.log
interface=wlan0
listen-address=192.168.22.1
dhcp-host=f0:79:59:cb:d8:eb,192.168.22.3,infinite
dhcp-option=3,192.168.22.1
dhcp-option=6,114.114.114.114
要启动 AP,我执行以下操作:
nmcli radio wifi off
rfkill unblock wlan
ifconfig wlan0 192.168.22.2 up
sudo sysctl -w net.ipv4.ip_forward=1
sudo iptables -P FORWARD ACCEPT
sudo iptables --table nat -A POSTROUTING -o wlan0 -j MASQUERADE
service dnsmasq restart
service hostapd restart
hostapd /etc/hostapd/hostapd.conf
test
使用 SSID和密码通过我的 Android 手机连接到 AP password
。
PC控制台上显示的信息是:
hostapd /etc/hostapd/hostapd.conf
Configuration file: /etc/hostapd/hostapd.conf
Using interface wlan0 with hwaddr 00:1a:8c:30:08:b1 and ssid "test"
wlan0: interface state UNINITIALIZED->ENABLED
wlan0: AP-ENABLED
wlan0: STA f0:79:59:cb:d8:eb IEEE 802.11: authenticated
wlan0: STA f0:79:59:cb:d8:eb IEEE 802.11: associated (aid 1)
wlan0: AP-STA-CONNECTED f0:79:59:cb:d8:eb
wlan0: STA f0:79:59:cb:d8:eb RADIUS: starting accounting session 57921245-00000000
wlan0: STA f0:79:59:cb:d8:eb WPA: pairwise key handshake completed (RSN)
test
当我尝试使用 Android 手机的账户名和密码连接到 AP 时password
,它确实连接上了,但是无法在手机的 Firefox 上打开任何网页,
我怀疑这一部分有错误:
sudo sysctl -w net.ipv4.ip_forward=1
sudo iptables -P FORWARD ACCEPT
sudo iptables --table nat -A POSTROUTING -o wlan0 -j MASQUERADE
我该如何继续?
@Fabby,如果hw_mode=n
发生以下错误:
hostapd /etc/hostapd/hostapd.conf
Configuration file: /etc/hostapd/hostapd.conf
Line 2: unknown hw_mode 'n'
1 errors found in configuration file '/etc/hostapd/hostapd.conf'
Failed to set up interface with /etc/hostapd/hostapd.conf
Failed to initialize interface
请观察命令的输出信息hostapd /etc/hostapd/hostapd.conf
。
Configuration file: /etc/hostapd/hostapd.conf
Using interface wlan0 with hwaddr 00:1a:8c:30:08:b1 and ssid "test"
wlan0: interface state UNINITIALIZED->ENABLED
wlan0: AP-ENABLED
wlan0: STA f0:79:59:cb:d8:eb IEEE 802.11: authenticated
wlan0: STA f0:79:59:cb:d8:eb IEEE 802.11: associated (aid 1)
wlan0: AP-STA-CONNECTED f0:79:59:cb:d8:eb
一开始wlan0的mac地址是00:1a:8c:30:08:b1
USB无线网卡的mac地址,后来wlan0的mac地址就变成了f0:79:59:cb:d8:eb
我安卓手机的mac地址,这样操作对吗?
答案1
我看到您允许 iptables 配置的转发表中的流量,但这实际上仅在为相关接口启用 IP 转发时才使用。
默认情况下,ubuntu 以及我见过的大多数 Linux 发行版都会出于安全原因禁用 IP 转发,这实际上是一种合理的默认设置,因为只有当您的机器是路由器时才真正需要此功能,在这种情况下,这正是您正在设置的,所以您必须启用 IP 转发。
在文件 /etc/sysctl.conf 中,您需要取消注释此行:
net.ipv4.ip_forward=1
如果您还想转发 IPv6 流量,则也需要取消注释此行,并使用 ISP 分配的前缀设置正确的 IPv6 配置。
net.ipv6.conf.all.forwarding=1
这些将确保在启动时设置正确的设置,如果您想避免重新启动,您可以使用以下命令立即为当前会话启用转发
对于 IPv4:
sudo sysctl -w net.ipv4.conf.[interface].forwarding=1
对于 IPv6:
sudo sysctl -w net.ipv6.conf.[interface].forwarding=1
其中 [interface] 是要启用转发的接口的名称,需要为连接到互联网的接口启用此功能,以便可以将流量转发回无线网络,并为连接到无线网络的接口启用此功能。
此外,您的 MASQUERADE 规则在我看来是不正确的,它应该对从连接到互联网的接口传出的流量进行 MASQUERADE,而不是对传出到无线客户端的流量进行 MASQUERADE,而这正是您所拥有的。
因此,如果您的互联网路由器通过以太网连接到 PC,您的规则可能看起来像这样:
sudo iptables --table nat -A POSTROUTING -o eth0 -j MASQUERADE
其中 eth0 是连接到互联网的接口。
至于来自 hostapd hw_mode=n 的错误无效,配置应如下:
hw_mode=g
ieee80211n=1
因此,如果两个设备都支持 802.11n,它将自动协商,您可以强制要求 802.11n,但代价是阻止一些不支持它的设备进行连接,方法如下:
require_ht=1
我希望这会有所帮助,如果没有,我可以尝试提供更多帮助,但这是我的配置方式,它可以与我的所有 android 和 fireOS 设备顺利配合使用。
编辑:抱歉,刚刚看到您尝试将 hw_mode=n 改为对评论的回应,您一开始就做对了,但我建议使用 ieee80211n=1 选项允许兼容设备使用 802.11n,因为您的卡支持它,并且只要您不强制执行,它将使支持 n 的设备以更高的速度运行,同时仍支持功能较差的无线客户端(require_ht=1 标志将断开不支持 802.11n 的客户端)。但是,没有任何理由强制执行,因为可以同时支持 802.11n 和 802.11g。