TLDR:有没有办法使用“ip route”为多个 NIC 添加多播路由?
我们的软件使用两个多播组与两个不同物理网络上的两组不同设备进行通信。除此应用程序外,一个网络上的设备不需要通过我们的设备与另一个网络上的设备进行通信。
为此,软件会创建两个套接字。每个都绑定到单独 NICS 的 IP 地址之一。然后,该套接字加入到该网络上存在的多播组,例如,套接字 1 绑定到 192.168.0.2 并加入多播组 233.255.10.1,而套接字 2 绑定到 10.57.31.2 并加入多播组 239.255.100.1。
我们目前正在使用 bash 脚本(Linux 内核 3.14.39)使用路由在两个网络接口上设置多播路由,例如
route add -net 224.0.0.0 netmask 240.0.0.0 eth0
route add -net 224.0.0.0 netmask 240.0.0.0 eth1
Run Code Online (Sandbox Code Playgroud)
并通过 route -n 验证
Destination Gateway Genmask Flags Metric Ref Use Iface
224.0.0.0 0.0.0.0 240.0.0.0 U 0 0 0 eth0
224.0.0.0 0.0.0.0 240.0.0.0 U 0 0 0 eth1
Run Code Online (Sandbox Code Playgroud)
我最近读到该路由已弃用/过时,我们应该改用 ip route,例如
ip route add 224.0.0.0/4 dev eth0
ip route add 224.0.0.0/4 …Run Code Online (Sandbox Code Playgroud) 我在 curlmyip.com 上运行 curl,我得到了错误的输出 IP 地址。我的 systemd 服务文件是:
[Unit]
Description=Wired Networking
Wants=network.target dibbler-client.service
Before=network.target dibbler-client.service
[Service]
Type=oneshot
RemainAfterExit=yes
EnvironmentFile=/etc/conf.d/network
ExecStart=/sbin/ip link set dev ${interface} up
ExecStart=/sbin/ip addr add ${address}/24 dev ${interface}
ExecStart=/sbin/ip addr add ${failover}/32 dev ${interface}
ExecStart=/sbin/ip route add default via ${gateway} src ${failover}
ExecStart=/sbin/ip -6 addr add ${addressv6}/64 dev ${interface}
ExecStop=/sbin/ip addr flush dev ${interface}
ExecStop=/sbin/ip -6 addr flush dev ${interface}
ExecStop=/sbin/ip link set dev ${interface} down
[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)
变量是:
interface=eno1
address=88.190.15.135
address6=2001:bc8:300a:dead::b12d
failover=212.83.129.104
broadcast=88.190.15.255
gateway=88.190.15.1
Run Code Online (Sandbox Code Playgroud)
现在,ip 地址给我: …
似乎(至少)有两种方法可以将辅助 IP 地址添加到 Linux 上的接口。通过辅助,我的意思是它将接受到该 IP 地址的流量,并且对该 IP 进行的连接的响应将使用它作为源,但是该框发起的任何流量(例如,传出 TCP 连接)将不会使用辅助地址。
两种方法都从添加主地址开始,例如ip addr add 172.16.8.10/24 dev lan。然后我可以使用网络掩码/24(与主地址匹配)或来添加辅助地址/32。
如果我用 a 添加它/24,它会被标记为辅助地址,因此不会用作传出数据包的源,但这会带来两个地址被错误地添加到错误顺序的风险。如果我用 来添加它/32,就不会发生错误的顺序,但它不会被标记为次要的,而且我不确定这可能会产生什么不良影响。
所以,我想知道,哪种方法最不可能被破坏?(如果重要的话,这台机器上的主要服务是 MySQL,但它也运行 NFSv3。我正在添加第二台机器作为热备用,并希望通过更改拥有辅助 IP 的机器来在它们之间进行切换。)
我在运行此命令以模拟 500 毫秒的网络延迟和 100 毫秒的标准偏差后:
tc qdisc add dev eth2 root netem delay 500ms 100ms
问题是,我忘记怎么取消这个命令了!我的电脑目前有一个可怕的延迟,我不知道如何摆脱它!
提前谢谢了,
我在 Scaleway 上有几个 linux 测试盒,每个都有 2 个 NIC,它们都连接到同一个网络,10.0.0.0/8但每个都有自己的网关。
我希望能够同时使用 NIC(eth0/eth1)及其 IP 进行通信。因此,如果应用程序绑定到 IP .187,则应使用 dev eth0。如果应用程序绑定到 IP .189,则应使用 eth1。
现在只有 IP 为 .187 的接口 eth0 正在响应请求。任何请求。(这就是我使用 ping 和 ssh 进行测试的原因)。但是,如果我将默认路由从 eth0 更改为 eth1(ip .189),则传出流量将通过 eth1 正确路由,在这种情况下,eth0 将不可用。
那么如何配置盒子,这样两个接口都可以使用。
Box 1:
eth0_ip = 10.5.68.187/31
eth0_gw = 10.5.68.186
eth1_ip = 10.5.68.189/31
eth1_gw = 10.5.68.188
Run Code Online (Sandbox Code Playgroud)
根据我的研究,here,here我创建了一个 bash 脚本,该脚本应该添加带有表的静态路由,以便可以同时使用两个网卡。
#/bin/bash
# My Vars with IP and GW for eth0
eth0_ip=$(ip -o -4 addr list eth0 | …Run Code Online (Sandbox Code Playgroud) iproute ×5
linux ×3
networking ×3
ip ×2
routing ×2
ip-address ×1
ip-routing ×1
latency ×1
multicast ×1
netmask ×1
route ×1