routing – 使用smcroute连接不同物理接口上的两个客户端

我对网络很陌生.我有两个客户端连接在两个不同的物理接口上,它们运行upnp.我想将它们都添加到同一个多播组中,这样它们都会发现彼此,我将能够相互ping通.那可能吗?如何使用smcroute实现这一目标?

这是我尝试过的:

我创建了两个桥接接口(这是要求)并将它们连接到相应的物理接口.

为smcroute.conf添加了以下规则

mgroup from br1 group 239.255.255.250
mgroup from br2 group 239.255.255.250
mroute from br1 group 239.255.255.250 to br2
mroute from br2 group 239.255.255.250 to br1

ip -s mroute显示了这一点

# ip -s mroute
(x.x.x.x, 239.255.255.250) Iif: br2    Oifs: br1
  242 packets, 46509 bytes
(x.x.x.x, 239.255.255.250) Iif: br1     Oifs: br2
  243 packets, 46740 bytes
(x.x.x.x, 239.255.255.250) Iif: unresolved
#

但我的客户无法互相发现.我是以错误的方式做的吗?

/ proc / net / ip_mr_vif显示有进出br1和br2接口的数据包.

这是要求.我有两个物理接口,由于某些组织限制,我不希望它们标记到同一个桥接器.将有一些客户端将连接到这些接口,在这些接口上运行upnp堆栈.我希望他们互相发现.

解决方案我在这里尝试使用arp proxy和smcroute.我正在使用arp代理,因此两个客户端都能够检测到另一个.我使用smcroute将连接到这两个接口的所有客户端标记到组播组239.255.255.250中并来回转发数据包.这是正确的方法吗?

添加我的设置图.

        Device 1                      Router                   Device 2
+-----------------+     +----------------------------+    +-----------------+
|                 |     |                            |    |                 |
|           eth1  |     | br2                    br1 |    |  wlan0          |
|   169.254.10.10 |-----| 169.254.50.1      10.0.0.1 |----| 169.254.168.11  |
| (self assigned) |     |                            |    | (self assigned) |
+-----------------+     +----------------------------+    +-----------------+

用于启用代理arp的命令:

arp -i br2 -Ds 169.254.168.11 br1 pub
arp -i br1 -Ds 169.254.10.10 br2 pub
ip route add 169.254.168.0/24 dev br1
ip route add 169.254.10.0/24 dev br2

我能够在ip -s mroute中看到数据包,但是没有相互发现设备:

# ip -s mroute
(169.254.10.10, 239.255.255.250) Iif: br2    Oifs: br1
  3 packets, 549 bytes
(169.254.168.11, 239.255.255.250) Iif: br1    Oifs: br2
  12 packets, 2196 bytes
(169.254.168.11, 239.255.255.250) Iif: unresolved
(169.254.10.10, 239.255.255.250) Iif: unresolved
#

来自路由器的Tcpdump:

# tcpdump -i br2 -vvv port 1900
tcpdump: listening on br2, link-type EN10MB (Ethernet), capture size 262144 bytes
21:29:20.867399 IP (tos 0x0, ttl 4, id 0, offset 0, flags [DF], proto UDP (17), length 183)
    169.254.10.10.50759 > 239.255.255.250.1900: [udp sum ok] UDP, length 155
21:29:21.368865 IP (tos 0x0, ttl 4, id 0, offset 0, flags [DF], proto UDP (17), length 183)
    169.254.10.10.50759 > 239.255.255.250.1900: [udp sum ok] UDP, length 155
21:29:21.869556 IP (tos 0x0, ttl 4, id 0, offset 0, flags [DF], proto UDP (17), length 183)
    169.254.10.10.50759 > 239.255.255.250.1900: [udp sum ok] UDP, length 155
21:29:24.614276 IP (tos 0x50, ttl 3, id 6384, offset 0, flags [DF], proto UDP (17), length 183)
    169.254.168.11.50759 > 239.255.255.250.1900: [udp sum ok] UDP, length 155
21:29:25.114268 IP (tos 0x50, ttl 3, id 6393, offset 0, flags [DF], proto UDP (17), length 183)
    169.254.168.11.50759 > 239.255.255.250.1900: [udp sum ok] UDP, length 155
21:29:25.614997 IP (tos 0x50, ttl 3, id 6680, offset 0, flags [DF], proto UDP (17), length 183)
    169.254.168.11.50759 > 239.255.255.250.1900: [udp sum ok] UDP, length 155
^C
6 packets captured
6 packets received by filter
0 packets dropped by kernel

# tcpdump -i br1 -vvv port 1900
tcpdump: listening on br1, link-type EN10MB (Ethernet), capture size 262144 bytes
21:29:40.869434 IP (tos 0x50, ttl 3, id 0, offset 0, flags [DF], proto UDP (17), length 183)
    169.254.10.10.50759 > 239.255.255.250.1900: [udp sum ok] UDP, length 155
21:29:41.371016 IP (tos 0x50, ttl 3, id 0, offset 0, flags [DF], proto UDP (17), length 183)
    169.254.10.10.50759 > 239.255.255.250.1900: [udp sum ok] UDP, length 155
21:29:41.871953 IP (tos 0x50, ttl 3, id 0, offset 0, flags [DF], proto UDP (17), length 183)
    169.254.10.10.50759 > 239.255.255.250.1900: [udp sum ok] UDP, length 155
21:29:44.616742 IP (tos 0x0, ttl 4, id 17080, offset 0, flags [DF], proto UDP (17), length 183)
    169.254.168.11.50759 > 239.255.255.250.1900: [udp sum ok] UDP, length 155
21:29:45.138486 IP (tos 0x0, ttl 4, id 17334, offset 0, flags [DF], proto UDP (17), length 183)
    169.254.168.11.50759 > 239.255.255.250.1900: [udp sum ok] UDP, length 155
21:29:45.622226 IP (tos 0x0, ttl 4, id 17487, offset 0, flags [DF], proto UDP (17), length 183)
    169.254.168.11.50759 > 239.255.255.250.1900: [udp sum ok] UDP, length 155
^C
6 packets captured
6 packets received by filter
0 packets dropped by kernel
#

命令输出:

# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         x.x.x.x         0.0.0.0         UG    0      0        0 erouter0
10.0.0.0        0.0.0.0         255.255.255.0   U     0      0        0 br1
169.254.0.0     0.0.0.0         255.255.0.0     U     0      0        0 br2
169.254.168.0   0.0.0.0         255.255.255.0   U     0      0        0 br1
239.255.255.250 0.0.0.0         255.255.255.255 UH    0      0        0 br1
#

# ifconfig br2
br2       Link encap:Ethernet  HWaddr xxxxxxxx
          inet addr:169.254.50.1  Bcast:169.254.255.255  Mask:255.255.0.0
          inet6 addr: fe80::d02d:5dff:fe68:8e60/64 Scope:Link
          UP BROADCAST RUNNING ALLMULTI MULTICAST  MTU:1500  Metric:1
          RX packets:24012 errors:0 dropped:0 overruns:0 frame:0
          TX packets:23477 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:4779091 (4.5 MiB)  TX bytes:5154708 (4.9 MiB)
#

# ifconfig br1
br1       Link encap:Ethernet  HWaddr xxxxxxxx
          inet addr:10.0.0.1  Bcast:10.0.0.255  Mask:255.255.255.0
          inet6 addr: xxxxxxxxxxxxxxxxxxxxxxxxxx/64 Scope:Global
          inet6 addr: fe80::16b7:f8ff:fefe:faf6/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:44444 errors:0 dropped:0 overruns:0 frame:0
          TX packets:55860 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:6780562 (6.4 MiB)  TX bytes:11041592 (10.5 MiB)
#
最佳答案
网络ABC:

LAN网络的基本单元是段.最初的10Base5 Ethernet使用了长(通常是黄色)同轴电缆和吸血鬼水龙头,所以一段看起来像这样:

... ----------------------------- ...
        |         |         |
     Client 1  Client 2  Client 3

通过构造,一个段上的每个设备都可以看到该段上所有设备的所有以太网包,并且只过滤掉它感兴趣的那些.这允许广播(对一个段上的所有设备)以及多播(到某些设备上)一段).由于这些原因,LAN段也称为广播域.将为段分配由网络掩码确定的IP地址范围.因此在上面的示例中,段可以具有192.168.1.0/24(即,“段名称”为24位,每个客户端为8位),客户端1可以是192.168.1.1,客户端192.168. 1.2等

当以太网改为点对点连接而不是吸血鬼点击时,使用一个开关来形成一个段:

      +-----------------------+
      |         Switch        |
      +-----------------------+
        |         |         |
     Client 1  Client 2  Client 3

因此,从概念上讲,交换机只是将它在一个端口上接收的数据包发送到所有其他端口. (实际上,有优化).

因此,连接两个客户端以便他们可以相互发送多播的最简单方法是将它们与交换机放在同一网段中,如上图所示.

如果Linux计算机有多个以太网端口,那么它可以充当交换机,并将它们放在桥接器中:

    +-------------- Linux PC---------------+
    |                                      |
    |              192.168.1.4             |
    |  <------------  br0 ------------>    |
    |    eth0         eth1         eth2    |
    |     |            |            |      |
    +--------------------------------------+
          |            |            |
      Client 1     Client 2     Client 3
     192.168.1.1  192.168.1.2  192.168.1.3

这个桥被称为桥,因为最初这种结构用于将两个LAN段桥接在一起,但在这里它像开关一样使用.网桥可以有一个可选的“内部”接口,所以从概念上讲,它是相同的

      +------------------------------------------------+
      |                     Switch                     |
      +------------------------------------------------+
          |            |            |           |
      Client 1     Client 2     Client 3     Linux PC
     192.168.1.1  192.168.1.2  192.168.1.3  192.168.1.4

因此,为了让您的两个客户在Linux PC上看到对方,您使用一个桥(我不知道您为什么使用两个,或者为什么这应该是一个要求).

如果您的客户必须处于两个不同的部分(出于组织目的,您没有告诉我们),那么您必须路由(OSI级别3)而不是桥接(OSI级别2).

将1写入/ proc / sys / net / ipv4 / ip_forward(或将发行版的配置文件设置为启动时的等效文件)启用路由,如果自动添加的路由不足,则允许您检查和添加路由.

这适用于单播流量,对于多播流量,您确实需要像smcroute这样的东西.

arp代理是非常特殊情况下的一个特殊情况,由于某些原因你无法桥接(例如,3地址模式和以太网中的WLAN),但想要排序桥接.这通过欺骗arp消息和路由单播流量来假装每个段,其他段上的设备实际上在同一段中.它不适用于广播(DHCP),并且不适用于多播.

如果您在没有特殊情况下使用arp代理而没有告诉我们,那么您可能做错了.如果你在桥上使用arp代理,你几乎肯定做错了(你可能只是桥接一切),除非你有一些你没有告诉我们的真正疯狂的情况.

所以:

1)决定是否可以桥接两个客户端(或者只是使用交换机).如果您无法桥接,请更新问题并解释原因.

2)如果无法桥接,请启用IP转发,检查路由并测试ping是否有效.然后你可以设置smcroute.用ssmping或asmping测试它,而不是ping.一旦ssmping / asmping工作,尝试SSDP被路由,尽管根据定义具有本地范围(我没有尝试).如果没有,可能会有更多的摆弄.

3)如果你真的必须使用arp代理,请编辑问题并完整,彻底地解释所有细节.

编辑

因此,假设在Server上进行以下设置:

> eth1与10.0.0.1/24
> eth2与10.0.1.1/24
>客户端1位于eth1后面,地址为10.0.0.2
>客户2落后于eth2,地址为10.0.1.2

杀掉arp代理.

启用转发:

echo "1" | sudo tee /proc/sys/net/ipv4/ip_forward

使用ip route检查路由,您应该看到eth1和eth2的路由.

在客户端1上,执行ping 10.0.0.1,然后ping 10.0.1.1,然后执行ping 10.0.1.2.检查所有3个工作.对于客户端2,具有适当的地址也是如此.

如果它不起作用,在一个窗口中使用tcpdump -ni eth1,在另一个窗口中使用tcpdump -ni eth2,执行ping操作,并查看出现了什么问题.

如果可行,请在两个客户端上安装ssmping.在新窗口中启动服务器上的sudo smcrouted -n,以便您可以看到消息.我们使用组播组226.1.1.234进行测试. sudo smcroutectl添加eth1 226.1.1.2 eth2.在客户端1上运行ssmpingd,然后在客户端2上asmping -4 10.0.0.2 226.1.1.234.同样,在客户端2上ssmpingd,然后在客户端1上asmping -4 10.0.1.2 226.1.1.234.如果它不起作用,请调试为以上.

最后尝试sudo smcroutectl add eth1 239.255.255.250 eth2并测试UPNP发现是否有效.我刚用minidlna和gupnp-universal-cp测试了这个,还有两个额外的网络命名空间,它在这里运行正常.

一旦工作,请根据需要设置配置文件.

编辑

我抬头看了RFC3927,并清楚地说

if the destination address is in the
169.254/16 prefix […], then the sender
MUST ARP for the destination address and then send its packet
directly to the destination on the same physical link.

The host MUST NOT send a packet with an IPv4 Link-Local destination
address to any router for forwarding.

和AFAIK这在Linux内核中强制执行,完全使用额外的ARP规则(必须是相同的接口)因此无法路由169.254.*.*地址.如果我们试图对它们进行路由,那么我们必须在整个过程中与Linux内核进行对抗.也许这是可能的,但我甚至不想尝试.这仅适用于单播,甚至不适用于多播.

具有169.254.*.*,UPNP,Apple Bonjour等的设备应在同一LAN网段上使用.这也适用于想要使用它们的所有设备.这就是来龙去脉.

您有以下选择:

>触摸设备并配置静态IP,或说服他们接受DHCP.我所有的媒体设备都能做到这一点.你没有说你有哪些设备,所以我无法帮助你.
>将一个或两个媒体设备置于某种隧道,VLAN,额外SSID或其他任何设备之后,因此您不必桥接所有设备,但可以保留所有需要在一个LAN网段中查看媒体设备的设备.尽管我多次询问您,但您没有解释您的网络设置,所以我无法帮助您找到解决方案.
>实现您自己的网络堆栈(在用户空间,如arp-proxy,或者然而),忽略RFC和网络实践,并做你想要的.您不仅需要传递ARP,还必须传递广播和多播,因此它已经是自我实现的NIH桥的大部分内容.
>实际上连接所有东西,但使用ebtables等根据您的管理问题强制执行分离.尽管我多次询问你,但你没有解释你的行政问题,所以我无法帮助你.

如果这些选项都不适合您,那么您想要的就是不可能.期.

转载注明原文:routing – 使用smcroute连接不同物理接口上的两个客户端 - 代码日志