是否有可能使用代理ARP返回到相同的接口?

我有一个WiFi接入点连接到Linux路由器。 路由器本身连接到互联网。 出于多种原因(主要是为了控制安全性和服务质量),我想强制所有用户的stream量通过Linux路由器,甚至是用户之间的stream量。

为此,我禁用了AP中的站对站通信(我使用D-Link DWL-7200 AP)。 以下是我如何configurationAP:

ssh admin@accesspoint1 D-Link Access Point wlan1 -> set sta2sta disable D-Link Access Point wlan1 -> reboot 

这工作正常:无线用户不能相互沟通了。 至less不是直接的。 我的目标是强制stream量到达路由器并返回。

为此,我在Linux路由器中启用了proxy-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 

这是我希望如果UserA ping UserB发生的事情:

  1. 用户A尝试ping 10.0.0.66
  2. 所以UserA发送ARP广播说“谁有10.0.0.66?”
  3. 访问点让请求通过路由器(但不是给UserB,因为sta2sta被禁用)
  4. 路由器收到这个请求,而且因为在eth1上启用了proxy-arp,它应该回答“为我发送10.0.0.66包(路由器的MAC地址)”。
  5. 接入点应接收答案并将其转发给UserA。
  6. 那么用户A应该将实际的ping数据包发送到路由器的MAC地址
  7. 数据包应该通过AP到路由器
  8. 路由器应该路由回到eth1,通过改变目的地MAC地址到UserB(如果需要的话做一个ARP请求),并且改变它的源MAC地址到它自己。
  9. 数据包应该到达AP并被中继到UserB。
  10. UserB应该回复ping请求。
  11. 应答应通过AP到路由器。
  12. 回复应该被路由到UserA。
  13. 它应该通过AP并到达UserA。

不幸的是,这个整个梦想在步骤4失败,因为Linux路由器收到ARP请求,但没有回答。 从我在互联网上看到的,似乎这是正常的:代理ARP不是真的被devise用于这种设置。 更确切地说,路由器不会回答与ARP请求相同的接口上的主机的ARP请求。 在这种情况下,ARP请求来自eth1,但是它说“谁有IP 10.0.0.66?”,主机10.0.0.66在接口eth1上。

我明白为什么这是一个很好的默认行为,因为如果sta2sta未在AP中被禁用,UserA将收到来自路由器的ARP响应和来自UserB的另一个ARP响应。 但就我而言,我相信,即使是在同一接口上的主机,回答每一个ARP请求也是非常有意义的。

有什么办法可以解决这个默认的代理arp行为?

你想要的实际上是可能的,但需要一个相当新的Linux内核(> = 2.6.34,或者一个backport)。

你需要的选项是/proc/sys/net/ipv4/conf/*/proxy_arp_pvlan

 proxy_arp_pvlan  - 布尔值
    私有VLAN代理arp。
    基本上允许代理arp回复到相同的接口
     (从中收到ARP请求/请求)。

    这是为了支持(以太网)交换function,如RFC
     3069,个别港口不允许
    相互沟通,但可以交谈
    上游路由器。 如RFC 3069所述,这是可能的
    允许这些主机通过上游进行通信
    路由器通过proxy_arp'ing。 不需要一起使用
     proxy_arp。

    这种技术被称为不同的名称:
      在RFC 3069中,它被称为VLAN聚合。
      思科和Allied Telesyn将其称为专用VLAN。
      惠普将其称为源端口过滤或端口隔离。
      爱立信称之为MAC强制转发(RFC Draft)。

上游提交添加此支持是65324144b50bc7022cc9b6ca8f4a536a957019e3 。

我不确定可以轻易调整Linux proxyarp实现来实现您的目标。 你有没有考虑使用子网/路由方法?

这是这样的想法:为您的无线networking分配一个/24地址空间。 为了匹配你的问题的例子,我将使用10.0.0.0/24 。 现在把/24划分为10.0.0.8/30 /30子网: 10.0.0.4/30 ,… 10.0.0.248/30

每个/30有2个可用的IP地址,其中一个分配给无线客户端,另一个分配(别名)到您的Linux路由器的eth1接口。 10.0.0.6 ,假设我们分配了这个系列的无线客户端地址: 10.0.0.6 ,…, 10.0.0.250 。 我们在路由器10.0.0.9以下一系列的IP别名eth110.0.0.5 ,…, 10.0.0.249

为了完成configuration,每个无线客户端的networking掩码为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 

优点:

  • 达到预期的目标:所有的无线客户端stream量通过路由器转发,客户端可以相互联系。
  • ARP广播很less发生,因为每个客户端的第一跳始终是路由器。

缺点:

  • configuration是非常规的。 静态设置(客户端和路由器)可以相当容易地完成,但是dynamic(DHCP)configuration将很难build立。