Chr*_*her 14 ubuntu rhel routing debian centos
您能否利用您的专业知识了解如何在两个网络接口上配置网络流量分离?
到目前为止,据我所知,静态路由用于未设计为使用默认网关的网络流量。默认网关用于所有不以本地网络为目的地且在路由表中未指定首选路由的流量。
场景如下。
eth0(GW = 10.10.10.1)。eth1(GW = 192.168.100.1)。我在下面发布了我在 Debian Wheezy 上尝试过的东西。而且,我的问题是,虽然我的主机设置方式可以在两个接口上进行通信,但各个主机似乎“听到”了错误接口上的流量。例如:
主机 140
eth0 Link encap:Ethernet HWaddr 08:00:27:d1:b6:8f
inet addr:10.10.10.140 Bcast:10.10.10.255 Mask:255.255.255.0
inet6 addr: fe80::a00:27ff:fed1:b68f/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1341 errors:0 dropped:0 overruns:0 frame:0
TX packets:2530 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:641481 (626.4 KiB) TX bytes:241124 (235.4 KiB)
eth1 Link encap:Ethernet HWaddr 08:00:27:ad:14:b6
inet addr:192.168.100.140 Bcast:192.168.100.255 Mask:255.255.255.0
inet6 addr: fe80::a00:27ff:fead:14b6/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:7220 errors:0 dropped:0 overruns:0 frame:0
TX packets:5257 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:602485 (588.3 KiB) TX bytes:1022906 (998.9 KiB)
Run Code Online (Sandbox Code Playgroud)
从主机140,我执行以下命令:tcpdump -i eth0。在主机 140 上的单独会话中,我执行ping 192.168.100.50.
19:17:29.301565 IP 192.168.100.140 > 192.168.100.50: ICMP echo request, id 1400, seq 10, length 64
19:17:30.301561 IP 192.168.100.140 > 192.168.100.50: ICMP echo request, id 1400, seq 11, length 64
19:17:31.301570 IP 192.168.100.140 > 192.168.100.50: ICMP echo request, id 1400, seq 12, length 64
19:17:32.301580 IP 192.168.100.140 > 192.168.100.50: ICMP echo request, id 1400, seq 13, length 64
Run Code Online (Sandbox Code Playgroud)
为什么我看到上面的输出eth0?我想我应该只看到 10.10.10.140 的流量。eth1正如预期的那样,我也在 上看到了这一点:
19:18:47.805408 IP 192.168.100.50 > 192.168.100.140: ICMP echo request, id 1605, seq 247, length 64
Run Code Online (Sandbox Code Playgroud)
如果我从主机 50 ping(相同的ifconfig结果 - 只是最后一个不同的四边形),然后eth0是静音,并且我看到 ICMP 回声eth1,正如预期的那样。
我想了解如何配置每个接口以仅处理它在两个主要 Linux 变体中负责的流量。我想我快到了,但我错过了一些我似乎无法找到的东西。
我知道 Debian 的解决方案应该对 Wheezy 和 Jessie 都有好处,并且 EL 的解决方案应该对所有 EL 6.x 版本都相同。我想避免使用 RC 脚本来执行命令,而是选择使用配置文件。
在 Debian 中,我所知道的相关配置文件是:
/etc/network/interfaces在 EL 6.x 中,我知道的相关配置文件有:
/etc/sysconfig/network/etc/sysconfig/network-scripts/ifcfg-eth0/etc/sysconfig/network-scripts/ifcfg-eth1/etc/sysconfig/network-scripts/route-eth0/etc/sysconfig/network-scripts/route-eth1/etc/sysconfig/network-scripts/rule-eth0/etc/sysconfig/network-scripts/rule-eth1我的 Debian 8“杰西”/etc/network/interfaces文件:
source /etc/network/interfaces.d/*
# The loopback network interface
auto lo
iface lo inet loopback
# Production interface
auto eth0
allow-hotplug eth0
iface eth0 inet static
address 10.10.10.140
netmask 255.255.255.0
gateway 10.10.10.1
# Management interface
auto eth1
allow-hotplug eth1
iface eth1 inet static
address 192.168.100.140
netmask 255.255.255.0
Run Code Online (Sandbox Code Playgroud)
我认为netstat -anr可能说明了这个问题:
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
0.0.0.0 10.10.10.1 0.0.0.0 UG 0 0 0 eth0
10.10.10.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
192.168.100.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
192.168.100.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
Run Code Online (Sandbox Code Playgroud)
Chr*_*her 10
我很想了解有关此主题的更多信息,以优化配置以使其达到最佳状态,但这是我目前所拥有的。即使没有在所有网络接口 ( net.ipv4.conf.all.arp_filter = 0)上启用 ARP 过滤,如@spuk 所述,在此配置中流量似乎完全分离。
文件 ,/etc/iproute2/rt_tables至少在 EL 6.x 和 DEB 7/8 中是相同的。这是为静态路由创建命名路由表的文件。
#
# reserved values
#
255 local
254 main
253 default
0 unspec
#
# local
#
252 mgmt
Run Code Online (Sandbox Code Playgroud)
上面,命名的静态路由的数量 252 基本上是任意的;或者,每个静态路由在 1 到 252 之间都有自己的唯一编号。
该文件,/etc/network/interfaces在 DEB 7/8 中,至少:
source /etc/network/interfaces.d/*
# The loopback network interface
auto lo
iface lo inet loopback
# The production network interface
# The 'gateway' directive is the default route.
# Were eth0 configured via DHCP, the default route would also be here.
auto eth0
allow-hotplug eth0
iface eth0 inet static
address 10.10.10.140
netmask 255.255.255.0
gateway 10.10.10.1
# The management network interface
# The 'gateway' directive cannot be used again because there can be
# one, and only one, default route. Instead, the 'post-up' directives
# use the `mgmt` static route.
auto eth1
allow-hotplug eth1
iface eth1 inet static
address 192.168.100.140
netmask 255.255.255.0
post-up ip route add 192.168.100.0/24 dev eth1 src 192.168.100.140 table mgmt
post-up ip route add default via 192.168.100.1 dev eth1 table mgmt
post-up ip rule add from 192.168.100.140/32 table mgmt
post-up ip rule add to 192.168.100.140/32 table mgmt
Run Code Online (Sandbox Code Playgroud)
ip route show在 Debian 上的结果:
default via 10.10.10.1 dev eth0
10.10.10.0/24 dev eth0 proto kernel scope link src 10.10.10.140
192.168.100.0/24 dev eth1 proto kernel scope link src 192.168.100.140
Run Code Online (Sandbox Code Playgroud)
EL 6.x/etc/sysconfig/network文件:
NETWORKING=yes
HOSTNAME=localhost.localdomain
GATEWAY=10.10.10.1
Run Code Online (Sandbox Code Playgroud)
上面,GATEWAY 是默认路由。下面,如果 BOOTPROTOCOL 设置为 DHCP,将从 DHCP 获取默认路由。
EL 6.x/etc/sysconfig/network-scripts/ifcfg-eth0文件,没有“HWADDR”和“UUID”:
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTOCOL=none
IPADDR=10.10.10.140
NETMASK=255.255.255.0
NETWORK=10.10.10.0
BROADCAST=10.10.10.255
Run Code Online (Sandbox Code Playgroud)
EL 6.x/etc/sysconfig/network-scripts/ifcfg-eth1文件,没有“HWADDR”和“UUID”:
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTOCOL=none
IPADDR=192.168.100.140
NETMASK=255.255.255.0
NETWORK=192.168.100.0
BROADCAST=192.168.100.255
Run Code Online (Sandbox Code Playgroud)
EL 6.x/etc/sysconfig/network-scripts/route-eth1文件:
192.168.100.0/24 dev eth1 table mgmt
default via 192.168.100.1 dev eth1 table mgmt
Run Code Online (Sandbox Code Playgroud)
EL 6.x/etc/sysconfig/network-scripts/rule-eth1文件:
from 192.168.100.0/24 lookup mgmt
Run Code Online (Sandbox Code Playgroud)
ip route show在 EL 6.x 上的结果:
192.168.100.0/24 dev eth1 proto kernel scope link src 192.168.100.160
10.10.10.0/24 dev eth0 proto kernel scope link src 10.10.10.160
default via 10.10.10.1 dev eth0
Run Code Online (Sandbox Code Playgroud)
上述方法适用于 RHEL 6 和 RHEL 7 以及衍生产品,但对于 RHEL 8 和衍生产品,必须先安装network-scripts才能使用上述方法。
dnf install network-scripts
Run Code Online (Sandbox Code Playgroud)
安装会产生一个警告,该警告network-scripts将在 RHEL 的下一个主要版本之一中删除,并且 NetworkManager 也提供ifup/ifdown脚本。
创建命名路由表是可以的,但不需要 with netplan,无论如何它都不会使用该名称。尽管如此,rt_tables文件中命名路由表的编号可用于netplan. 对应的网卡是enps03(eth0)和enp0s8(eth1)。
network:
version: 2
ethernets:
enp0s3:
addresses:
- 10.10.10.140/24
dhcp4: false
dhcp6: false
gateway4: 10.10.10.1
nameservers:
addresses:
- 1.2.3.4
- 1.2.3.5
search:
- your-search-domain-name.com
enp0s8:
dhcp4: false
dhcp6: false
addresses:
- 192.168.100.140/24
routes:
- to: 192.168.100.0/24
via: 192.168.100.1
table: 252
routing-policy:
- from: 192.168.100.0/24
table: 252
Run Code Online (Sandbox Code Playgroud)
这导致从ip r s.
default via 10.10.10.1 dev enp0s3 proto static
10.10.10.0/24 dev enp0s3 proto kernel scope link src 10.10.10.140
192.168.100.0/24 dev enp0s8 proto kernel scope link src 192.168.100.140
Run Code Online (Sandbox Code Playgroud)
我没有通读你的所有帖子(抱歉,现在真的不能花时间),但我相信这可能与 Linux 实现IP 主机模型的方式有关:
... Linux 中的 IPv4 实现默认为弱主机模型。...
从同一页面:
... 如果 IP 堆栈是用弱主机模型实现的,它会接受任何本地目的地的数据包,而不管接收数据包的网络接口是什么。...
也就是说,在 Linux 中,默认情况下,IP 地址“属于主机”,而不是严格意义上的“属于接口”。您可以通过arp_filter, rp_filter, arp_announce, arp_ignoresysctls更改该行为(来自LVS:ARP 问题,参见此处)。另请参阅ip-sysctl.txt。
| 归档时间: |
|
| 查看次数: |
24743 次 |
| 最近记录: |