我有一个连接到 Linux 路由器的 WiFi 接入点。路由器本身连接到互联网。出于多种原因(主要是为了控制安全性和服务质量),我想强制所有用户的流量都通过 Linux 路由器,甚至用户之间的流量也是如此。
为此,我禁用了 AP 中的站到站通信(我使用 D-Link DWL-7200 AP)。以下是我配置 AP 的方法:
ssh admin@accesspoint1
D-Link Access Point wlan1 -> set sta2sta disable
D-Link Access Point wlan1 -> reboot
这很好:无线用户无法再相互通信。至少不能直接通信。我的目标是强制流量上行到路由器并返回。
去做那,我在Linux路由器中启用了代理arp:
echo 1 > /proc/sys/net/ipv4/conf/eth1/proxy_arp
这是总体情况。
10.0.0.0/8 subnet
____________________|______________________
/ \
| |
(sta2sta disabled)
UserA----------------AP---------------------Router-------------------Internet
10.0.0.55 / eth1 eth0
/ 10.0.0.1 203.0.113.15
/ proxy-arp enabled
UserB____________/
10.0.0.66
以下是我希望如果用户 A ping 用户 B,将发生以下情况:
- 用户 A 尝试 ping 10.0.0.66
- 因此用户 A 发送 ARP 广播说“谁有 10.0.0.66?”
- 接入点让请求通过路由器(但不通过用户 B,因为 sta2sta 被禁用)
- 路由器收到请求,由于 eth1 上启用了代理 arp,它应该回答“将 10.0.0.66 的数据包发送给我(路由器的 MAC 地址)”。
- 接入点应该收到答案并将其转发给用户A。
- 那么用户 A 应该向路由器的 MAC 地址发送实际的 ping 数据包
- 数据包应该通过 AP 到达路由器
- 路由器应该将其路由回 eth1,通过将目标 MAC 地址更改为 UserB 的 MAC 地址(如果需要,执行 ARP 请求),并将源 MAC 地址更改为其自己的 MAC 地址。
- 数据包应到达 AP 并中继给用户 B。
- 用户B应该回复ping请求。
- 回复应该通过 AP 到达路由器。
- 回复应该路由至用户A。
- 并且它应该通过AP到达用户A。
不幸的是,整个梦想在第 4 步失败了,因为 Linux 路由器收到了 ARP 请求,但未能回答它。从我在互联网上看到的内容来看,这似乎是正常的:代理 ARP 并不是真正设计用于这种设置。更准确地说:路由器不会回答与 ARP 请求来自同一接口的主机的 ARP 请求。在这种情况下,ARP 请求来自 eth1,但它说“谁有 IP 10.0.0.66?”,而主机 10.0.0.66 在接口 eth1 上。
我理解为什么这是一种好的默认行为,因为如果 AP 中未禁用 sta2sta,则用户 A 将收到来自路由器的 ARP 响应和来自用户 B 的另一个 ARP 响应。但就我而言,我相信回答每个 ARP 请求是完全合理的,即使对于同一接口上的主机也是如此。
有什么方法可以解决这个默认的代理 arp 行为吗?
答案1
您想要的实际上是可能的,但需要一个相当新的 Linux 内核(>= 2.6.34,或反向移植)。
您需要的选项是/proc/sys/net/ipv4/conf/*/proxy_arp_pvlan
:
proxy_arp_pvlan - 布尔值 私有 VLAN 代理 arp。 基本上允许代理 arp 回复到同一接口 (从中接收 ARP 请求/请求)。 这样做是为了支持(以太网)交换机功能,例如 RFC 3069,其中各个端口不允许 互相交流,但他们被允许交谈 上游路由器。如 RFC 3069 所述, 允许这些主机通过上游进行通信 router 通过 proxy_arp 来控制。不需要与 代理arp。 这项技术有不同的名称: 在 RFC 3069 中,它被称为 VLAN 聚合。 Cisco 和 Allied Telesyn 称之为私有 VLAN。 惠普称之为源端口过滤或端口隔离。 爱立信称之为 MAC 强制转发 (RFC 草案)。
添加此支持的上游提交是65324144b50bc7022cc9b6ca8f4a536a957019e3。
答案2
我不确定 Linux 代理arp 实现是否可以轻松调整以实现您的目标。您是否考虑过使用子网划分/路由方法?
思路如下:/24
为您的无线网络分配一个地址空间。为了符合您的问题示例,我将使用10.0.0.0/24
。现在将其划分/24
为 62 个/30
子网:10.0.0.4/30
、10.0.0.8/30
、10.0.0.12/30
、 ... 10.0.0.248/30
。
每个/30
都有 2 个可用的 IP 地址,其中一个分配给无线客户端,另一个分配(别名)到eth1
Linux 路由器的接口。具体来说,假设我们从以下系列中分配无线客户端地址:10.0.0.6
、10.0.0.10
、10.0.0.14
、 ... 。并且我们在路由器上将10.0.0.250
以下一系列 IP 别名为: 、、、 ... 。eth1
10.0.0.5
10.0.0.9
10.0.0.13
10.0.0.249
为了完成配置,每个无线客户端都会获得一个网络掩码255.255.255.252
和一个默认网关10.0.0.X-1
(其中X
是客户端 IP 地址的最后一个八位字节)。在路由器上,ip
可以使用以下命令将 IP 地址添加到 eth1,如下所示:
ip addr add 10.0.0.5/30 broadcast 10.0.0.7 dev eth1
ip addr add 10.0.0.9/30 broadcast 10.0.0.11 dev eth1
ip addr add 10.0.0.13/30 broadcast 10.0.0.15 dev eth1
...
...
ip addr add 10.0.0.249/30 broadcast 10.0.0.251 dev eth1
优点:
- 实现预期目标:所有无线客户端流量都通过路由器转发,并且客户端可以相互联系。
- ARP 广播很少发生,因为每个客户端的第一跳始终是路由器。
缺点:
- 配置非常规。静态设置(客户端和路由器)可以相当容易地完成,但动态(DHCP)配置将非常难以建立。