无线 AP,使用 udhcpd 和 NAT

来自 Alpine Linux

设置使用 udhcpd 和 NAT 的无线 AP

(主要基于 树莓派无线路由器指南

依赖关系

安装 hostapd 接入点软件、busybox-extras(用于 udhcpd DHCP 服务器)和 iptables 防火墙管理器。

apk add hostapd busybox-extras iptables

如果您想将客户端连接到互联网,您需要提供某种方式将流量从 AP 重定向到互联网。主要有两种可能性

  • 桥接
  • 网络地址转换

如果您使用桥接并通过 DHCP 获取 IP,您可能很难配置它,以便桥接获得 IP 地址而不会搞砸您的本地互联网连接。

本指南仅涵盖 NAT。有关更多信息,请参阅桥接

配置 hostapd

您需要编写一个配置文件。Alpine 附带了一个示例文件 /etc/hostapd/hostapd.conf,但它对我不起作用(可能是因为我使用了 pre-wireless-N 网卡,由 ath5k 支持?)。

这是一个基于对我有效的示例(我已经更改了 ssid 和 wpa_passphrase)

ctrl_interface=/var/run/hostapd
ctrl_interface_group=0
interface=wlan0
driver=nl80211
logger_syslog=-1
logger_syslog_level=2
logger_stdout=-1
logger_stdout_level=2
ssid=alpine-test
hw_mode=g
channel=6
max_num_sta=32
rts_threshold=2347
fragm_threshold=2346
macaddr_acl=0
auth_algs=3
ignore_broadcast_ssid=0
wpa=2
wpa_passphrase=supertopsecret
wpa_key_mgmt=WPA-PSK WPA-PSK-SHA256
wpa_pairwise=TKIP CCMP

将“interface”更改为匹配您的无线接口。根据需要更改“ssid”和“wpa_passphrase”。如果您想要纯 wpa 和 wpa2,请将“wpa”设置为 3;如果仅想要纯 WPA1,则设置为 1。

软件包中的示例使用 wpa_psk_file(WPS 需要)而不是静态密码。这不会启用 WPS。

您可能需要更改频道以避免与其他本地 AP 冲突。不幸的是,自动频道选择(channel=0)目前在编译时 *未* 启用,因此我们无法使用它。扫描频道

使用中

iwlist wlan0 scanning

或等效命令,在设置之前。

max_num_sta 设置可以连接到您的 AP 的客户端数量限制。将其设置得比您认为可能拥有的数量更高,但不要高太多。

如果您没有将此内容放在 /etc/hostapd/hostapd.conf 中,您将需要更改 /etc/conf.d/hostapd 中的 CONFIGS 行以指向它。我更喜欢这样做,以便默认配置可供参考。

配置 udhcpd

编辑 /etc/udhcpd.conf。默认配置有很好的注释,但实际上并未准备好使用。这是一个骨架,大致基于我的配置

start		192.168.2.2
end		192.168.2.254
max_leases	64
interface	wlan0
static_lease	00:1b:de:ad:be:ef	192.168.2.100
opt	dns	192.168.0.1 8.8.8.8
opt	subnet	255.255.255.0
opt	router	192.168.2.1
opt	lease	864000

注意以下事项

  • max_leases 应设置为至少与您在一个租期内可能拥有的客户端数量一样多。如果您有任何通过桥接连接的客户端,请注意桥接本身会获得一个 DHCP 地址。
  • interface 是客户端将连接到的接口(在本例中为 wlan0 或您的无线接口)
  • router 应该是您为无线接口分配的静态 IP 地址。
  • start 和 end 应与您为 wlan0 配置的 IP 地址在同一子网内,但 wlan0 的地址应在该范围之外。

(例如,192.168.2.1 和 192.168.2.255 都适合作为路由器地址)

  • 将 DNS 选项设置为指向您想要的任何名称服务器。您可以重复它,但限制为 3 个名称服务器。
  • static_lease 接受两个参数:指定特定网络适配器的 MAC 地址,以及应分配给它的 IP 地址。

它可以重复多次,为不同的用户分配不同的地址。如果您可以信任网络用户不进行 MAC 欺骗,这将非常方便打印机。

配置 iptables

我使用了原始 iptables,按如下方式配置它

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT

  1. 这会将状态保存在服务可以从中恢复它的位置

service iptables save

测试

rc-service hostapd start

rc-service udhcpd start

sysctl net.ipv4.ip_forward=1 并尝试从另一台计算机连接。

使更改永久生效

rc-update add hostapd rc-update add udhcpd rc-update add sysctl

配置 ifup

现在,奇怪的部分:iptables 尝试在启动时将 net.ipv4.ip_forward 设置为 1,但在我的经验中,这并不可靠。您 *不* 想启用“iptables”服务。它在网络之前启动,并可能导致您的无线接口未配置。(显然,ifup 认为 wlan0 已启动并跳过了它。这不是我预料到的,但这是我对事情如何运作的唯一解释...)

相反,修改 /etc/network/interfaces,注释掉无线接口的任何配置。然后添加

auto wlan0
iface wlan0 inet static
	address 192.168.2.1
	netmask 255.255.255.0
	up rc-service iptables start
	up sysctl net.ipv4.ip_forward=1
	down rc-service iptables stop

(可以设置所有内容,以便从 wlan0 节启动和停止 hostapd 和 udhcpd。我没有费心这样做。)

收尾工作

(有关替代方案和更多信息,请参阅设置 SSH 服务器)添加 dropbear SSH 服务器,将其配置为仅在无线接口上运行

setup-sshd -c dropbear

编辑 /etc/conf.d/dropbear 以添加

DROPBEAR_OPTS="-p 192.168.2.1:22"

(假设无线接口的 IP 地址为 192.168.2.1,并且您想要在端口 22 上使用 SSH)。这是可选的,但如果您使用无线路由器,它可以帮助您管理它,并且监听所有地址相当危险。

本文未涵盖但最好涵盖的内容

  • 获取更多熵的一些方法(请参阅熵和随机性
  • DNS 服务器,发布设备名称(TinyDNS_Format 看起来最有用)
  • 使用 awall 而不是原始 iptables(和/或切换到 nftables)
  • Setup-acf 管理路由器

这将需要

    • acf-core, acf-alpine-conf, acf-apk-tools
    • acf-iptables,或 acf-awall + 重写
    • acf-ssh + 切换到 openssh,或新的 acf-dropbear
    • acf-dhcp + 切换到 dhcp,或新的 acf-udhcpd
    • 新的 acf-hostapd(可能是最难的部分!)
    • 添加 tinydns 后,添加 acf-tinydns