Könnten Sie uns Ihr Fachwissen zur Verfügung stellen, um zu verstehen, wie man
die Trennung des Netzwerkverkehrs auf zwei Netzwerkschnittstellen konfiguriert?
Soweit ich weiß, werden statische Routen für Netzwerkverkehr verwendet, der
nicht für die Verwendung eines Standard-Gateways ausgelegt ist. Das Standard-Gateway wird für
den gesamten Verkehr verwendet, der nicht für das lokale Netzwerk bestimmt ist und für den keine
bevorzugte Route in einer Routing-Tabelle angegeben wurde.
Das Szenario ist wie folgt.
- Jeder Computer im Netzwerk hat zwei Netzwerkkarten.
- Die Produktionsschnittstelle für jeden ist
eth0
(GW =10.10.10.1). - Die Verwaltungsschnittstelle für jeden ist
eth1
(GW =192.168.100.1). - Produktions- und Verwaltungsdatenverkehr sollten vollständig getrennt werden.
Ich habe unten gepostet, was ich mit Debian Wheezy ausprobiert habe.
Und mein Problem ist, dass, obwohl ich Hosts so eingerichtet habe, dass sie
auf beiden Schnittstellen kommunizieren, einzelne Hosts scheinen Verkehr auf der falschen Schnittstelle zu „hören“.
Zum Beispiel:
Host 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)
Von Host 140 aus führe ich diesen Befehl aus:tcpdump -i eth0
. In einer separaten
Sitzung auf Host 140 führe ich ping 192.168.100.50
aus .
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
Warum sehe ich die obige Ausgabe auf eth0
? Ich denke, ich sollte nur Verkehr für 10.10.10.140 sehen.
Ich sehe dies auch auf eth1
, wie erwartet:
19:18:47.805408 IP 192.168.100.50 > 192.168.100.140: ICMP echo request, id 1605, seq 247, length 64
Wenn ich von Host 50 pinge (gleicher ifconfig
Ergebnisse – nur ein anderes letztes Quad),
dann eth0
ist still, und ich sehe die ICMP-Echos auf eth1
, wie erwartet.
Ich würde gerne verstehen, wie man jede Schnittstelle so konfiguriert, dass sie nur
den Datenverkehr handhabt, für den sie in zwei großen Linux-Varianten verantwortlich ist.
Ich glaube, ich bin fast am Ziel, aber mir fehlt etwas, was ich einfach kann. Scheinbar nicht zu finden.
- Debian Wheezy (7.x) oder Debian Jessie (8.x)
- Enterprise Linux (6.x) (RedHat/CentOS/Scientific/Oracle).
Ich weiß, dass eine Lösung für Debian sowohl für Wheezy als auch für Jessie gut sein sollte,
und dass eine Lösung für EL für alle EL 6.x-Versionen gleich sein sollte.
Ich möchte die Verwendung vermeiden ein RC-Skript zum Ausführen von Befehlen, das sich stattdessen
für die Verwendung der Konfigurationsdateien entscheidet.
In Debian sind die mir bekannten relevanten Konfigurationsdateien:
/etc/network/interfaces
In EL 6.x sind die mir bekannten relevanten Konfigurationsdateien:
/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
Mein Debian 8 „Jessie“ /etc/network/interfaces
Datei:
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
Ich denke netstat -anr
könnte das Problem veranschaulichen:
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
Akzeptierte Antwort:
Ich würde gerne mehr über dieses Thema erfahren, um die Konfiguration so zu verfeinern, dass sie so gut wie möglich ist, aber hier ist, was ich bisher habe. Auch ohne Aktivierung der ARP-Filterung auf allen Netzwerkschnittstellen (net.ipv4.conf.all.arp_filter = 0
), wie von @spuk erwähnt,
scheint der Datenverkehr in dieser Konfiguration vollständig getrennt zu sein.
Die Datei /etc/iproute2/rt_tables
, ist zumindest in EL 6.x und DEB 7/8 gleich. Dies ist die Datei, die eine benannte Routing-Tabelle für statische Routen erstellt.
#
# reserved values
#
255 local
254 main
253 default
0 unspec
#
# local
#
252 mgmt
Oben ist die Nummer der benannten, statischen Route, 252, im Wesentlichen willkürlich; oder jede statische Route erhält ihre eigene eindeutige Nummer zwischen 1 und 252.
Die Datei /etc/network/interfaces
in DEB 7/8 zumindest:
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
Das Ergebnis von ip route show
auf 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
Datei:
NETWORKING=yes
HOSTNAME=localhost.localdomain
GATEWAY=10.10.10.1
Oben ist GATEWAY die Standardroute. Wäre BOOTPROTOCOL unten auf DHCP eingestellt, würde die Standardroute von DHCP bezogen werden.
EL 6.x /etc/sysconfig/network-scripts/ifcfg-eth0
Datei, ohne „HWADDR“ und „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
Datei, ohne „HWADDR“ und „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
Datei:
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
Datei:
from 192.168.100.0/24 lookup mgmt
Das Ergebnis von ip route show
auf 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
Update für RHEL8
Diese oben beschriebene Methode funktioniert mit RHEL 6 &RHEL 7 sowie den Derivaten, aber für RHEL 8 und Derivate muss man zuerst network-scripts
installieren um die oben beschriebene Methode zu verwenden.
dnf install network-scripts
Die Installation erzeugt eine Warnung, dass network-scripts
in einer der nächsten Hauptversionen von RHEL entfernt wird und NetworkManager ifup
bereitstellt /ifdown
auch Skripte.
Update für Ubuntu 20.04 LTS
Das Erstellen einer benannten Routing-Tabelle ist in Ordnung, aber mit netplan
nicht erforderlich , die den Namen sowieso nicht verwenden wird. Nichtsdestotrotz die Nummer der benannten Routing-Tabelle aus den rt_tables
Datei kann für netplan
verwendet werden . Entsprechende NICs sind enps03
(eth0
) und 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
Daraus ergeben sich folgende Routen von 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