是否可以使用代理 arp 返回到同一个接口?

是否可以使用代理 arp 返回到同一个接口?

我有一个连接到 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,将发生以下情况:

  1. 用户 A 尝试 ping 10.0.0.66
  2. 因此用户 A 发送 ARP 广播说“谁有 10.0.0.66?”
  3. 接入点让请求通过路由器(但不通过用户 B,因为 sta2sta 被禁用)
  4. 路由器收到请求,由于 eth1 上启用了代理 arp,它应该回答“将 10.0.0.66 的数据包发送给我(路由器的 MAC 地址)”。
  5. 接入点应该收到答案并将其转发给用户A。
  6. 那么用户 A 应该向路由器的 MAC 地址发送实际的 ping 数据包
  7. 数据包应该通过 AP 到达路由器
  8. 路由器应该将其路由回 eth1,通过将目标 MAC 地址更改为 UserB 的 MAC 地址(如果需要,执行 ARP 请求),并将源 MAC 地址更改为其自己的 MAC 地址。
  9. 数据包应到达 AP 并中继给用户 B。
  10. 用户B应该回复ping请求。
  11. 回复应该通过 AP 到达路由器。
  12. 回复应该路由至用户A。
  13. 并且它应该通过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/3010.0.0.8/3010.0.0.12/30、 ... 10.0.0.248/30

每个/30都有 2 个可用的 IP 地址,其中一个分配给无线客户端,另一个分配(别名)到eth1Linux 路由器的接口。具体来说,假设我们从以下系列中分配无线客户端地址:10.0.0.610.0.0.1010.0.0.14、 ... 。并且我们在路由器上将10.0.0.250以下一系列 IP 别名为: 、、、 ... 。eth110.0.0.510.0.0.910.0.0.1310.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)配置将非常难以建立。

相关内容