您能否利用您的专业知识来了解如何在两个网络接口上配置网络流量的分离?
据我所知,到目前为止,静态路由用于未设计为使用默认网关的网络流量。默认网关用于所有非发往本地网络且路由表中未指定首选路由的流量。
场景如下。
- 网络中的每台计算机都有两个网卡。
- 每个的生产接口是
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)
我从主机 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
为什么我会在 上看到上述输出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
如果我从主机 50 执行 ping 操作(ifconfig
结果相同 - 只是最后一个四边形不同),则eth0
处于静默状态,并且我会看到 ICMP 回显eth1
,如预期的那样。
我想了解如何配置每个接口以仅处理它在两个主要 Linux 版本中负责的流量。我想我已经快到了,但我错过了一些我似乎找不到的东西。
- Debian Wheezy (7.x) 或 Debian Jessie (8.x)
- 企业 Linux (6.x) (RedHat/CentOS/Scientific/Oracle)。
我知道 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“Jessie”/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
我想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
答案1
我很想了解有关此主题的更多信息,以将配置优化为最佳配置,但这是迄今为止我所拥有的。即使没有在所有网络接口上启用 ARP 过滤 ( net.ipv4.conf.all.arp_filter = 0
),正如@spuk 所提到的,在此配置中流量似乎是完全分离的。
/etc/iproute2/rt_tables
至少在 EL 6.x 和 DEB 7/8 中,文件是相同的。这是为静态路由创建命名路由表的文件。
#
# reserved values
#
255 local
254 main
253 default
0 unspec
#
# local
#
252 mgmt
上面,命名静态路由的数量 252 本质上是任意的;或者,每个静态路由都有自己的唯一编号(介于 1 到 252 之间)。
DEB 7/8 中的文件/etc/network/interfaces
至少:
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
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
EL 6.x/etc/sysconfig/network
文件:
NETWORKING=yes
HOSTNAME=localhost.localdomain
GATEWAY=10.10.10.1
上面,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
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
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
EL 6.x/etc/sysconfig/network-scripts/rule-eth1
文件:
from 192.168.100.0/24 lookup mgmt
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
RHEL8 更新
上述方法适用于 RHEL 6 和 RHEL 7 及其衍生产品,但对于 RHEL 8 及其衍生产品,必须先安装network-scripts
才能使用上述方法。
dnf install network-scripts
安装会产生一条警告,该警告network-scripts
将在 RHEL 的下一个主要版本之一中删除,并且 NetworkManager 也会提供ifup
/ifdown
脚本。
Ubuntu 20.04 LTS 更新
创建命名路由表是可以的,但不需要使用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
这会产生以下来自 的路线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
答案2
我还没有读完你所有的帖子(抱歉,现在没时间花时间),但我相信这可能与 Linux 实现的方式有关IP主机型号:
... Linux 中的 IPv4 实现默认采用弱主机模型。 ...
从同一页面:
...如果IP堆栈是使用弱主机模型实现的,则它接受任何本地目的地的数据包,无论接收数据包的网络接口如何。 ...
也就是说,在Linux中,默认情况下,IP地址“属于主机”,而不是严格意义上的“属于接口”。您可以通过arp_filter
、rp_filter
、arp_announce
、arp_ignore
sysctls 更改该行为(来自LVS:ARP 问题, 见过这里)。另请参阅ip-sysctl.txt。