分离两个网络接口上的网络流量

分离两个网络接口上的网络流量

您能否利用您的专业知识来了解如何在两个网络接口上配置网络流量的分离?

据我所知,到目前为止,静态路由用于未设计为使用默认网关的网络流量。默认网关用于所有非发往本地网络且路由表中未指定首选路由的流量。

场景如下。

  • 网络中的每台计算机都有两个网卡。
  • 每个的生产接口是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 showDebian 上的结果:

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 showEL 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_filterrp_filterarp_announcearp_ignoresysctls 更改该行为(来自LVS:ARP 问题, 见过这里)。另请参阅ip-sysctl.txt

相关内容