使用 iptables 和 hostapd 创建隔离的客户 AP

使用 iptables 和 hostapd 创建隔离的客户 AP

我正在尝试将我的 Raspberry Pi 设置为访客能够连接的接入点,这样他们就可以访问互联网但不能访问我的其余网络,Pi 也是我的 DHCP 和 DNS 服务器,我为其使用了 hostapd、dnsmasq 和 iptables,它们都在 alpine linux 上运行。

我的网络接口创建了一个网桥并为其分配了以太网端口以及静态 IP:

auto lo
iface lo inet loopback

auto br0
iface br0 inet static
        bridge_ports eth0
        gateway 192.168.1.1
        address 192.168.1.32
        netmask 255.255.255.0

然后 HostAPd 使用 USB WiFi 适配器设置接入点,并将其添加到网桥

interface=wlan0
driver=nl80211
ssid=myssid

bridge=br0
channel=6
hw_mode=g
macaddr_acl=0

DNSmasq 分配 100-200 范围内的 DHCP IP 地址

dhcp-range= 192.168.1.100, 192.168.1.200, 24h

到目前为止,一切正常,我可以连接到 AP 并拥有完全的互联网访问权限。但是,我也拥有完全的私有网络访问权限,我想要实现的是仍然可以访问互联网,但阻止内部网络访问,除了 DHCP/DNS,我已尝试了以下 iptables 规则:

--append INPUT --protocol tcp -m physdev --physdev-in wlan0 --sport 22 --dst 192.168.1.32 --jump DROP
--append INPUT --protocol tcp -m physdev --physdev-in wlan0 --sport 22 --dst 192.168.1.1 --jump DROP
--append INPUT --protocol all -m physdev --physdev-in wlan0 --dst 192.168.1.32 --jump ACCEPT
--append INPUT --protocol all -m physdev --physdev-in wlan0 --dst 192.168.1.1 --jump ACCEPT
--append INPUT --protocol all -m physdev --physdev-in wlan0 --dst 192.168.1.0 --jump DROP
--append INPUT --protocol all -m physdev --physdev-in wlan0 --dst 0.0.0.0 --jump ACCEPT

我也尝试过使用 IP 地址范围

--append INPUT --protocol tcp -m iprange --src-range 192.168.1.100-192.168.1.200 --sport 22 --dst 192.168.1.32 --jump DROP
--append INPUT --protocol tcp -m iprange --src-range 192.168.1.100-192.168.1.200 --sport 22 --dst 192.168.1.1 --jump DROP
--append INPUT --protocol all -m iprange --src-range 192.168.1.100-192.168.1.200 --dst 192.168.1.32 --jump ACCEPT
--append INPUT --protocol all -m iprange --src-range 192.168.1.100-192.168.1.200 --dst 192.168.1.1 --jump ACCEPT
--append INPUT --protocol all -m iprange --src-range 192.168.1.100-192.168.1.200 --dst 192.168.1.0 --jump DROP
--append INPUT --protocol all -m iprange --src-range 192.168.1.100-192.168.1.200 --dst 0.0.0.0 --jump ACCEPT

我的想法是放弃 ssh,允许所有其他到网关和 DNS/DHCP 服务器的连接,并放弃任何其他内部连接,允许所有其他网络连接。

但尽管如此,我仍然可以访问内部服务,所以我现在有点困惑,不知道该怎么做

我已经启用br_netfilterecho 1 > /proc/sys/net/bridge/bridge-nf-call-iptables

答案1

我认为这里让您困惑的是桥接接口。

一旦你创建了桥接接口,并将两个端口桥接在一起,iptables 就会决不限制这些端口之间的流量。

桥接接口本质上是第 2 层连接,这意味着 wlan0 上的 wifi 主机实际上连接到交换机,而所有主机都位于 eth0 接口上。这里不进行路由;甚至不检查 IP 数据包头 — 流量仅根据 MA​​C 层帧头转发。

Iptables 能够阻止到 pi 本身的 ssh 连接,因为它是目的地,它会查看 IP 数据包头,从而发现它有一条阻止此类流量的规则。它还能够阻止任何试图离开网络的东西,因为它是网关,必须在那里进行路由。但是,对于不属于这两个类别之一的任何流量,它什么也做不了。

一些普通的家用 Wi-Fi 路由器具有此功能,您可以阻止 Wi-Fi 客户端访问有线网络,即使它们共享相同的地址范围,但我不知道它们如何实现此功能的细节。
但是,如果使用您现有的设置可以做到这一点,我怀疑这是通过桥接本身的一些配置来实现的,而不是 iptables。

看一眼问题,看看这些回复中是否有你想要的。我自己不熟悉 ebtables/nftables,但它似乎可能是你正在寻找的。

相关内容