Ursprünglich bei Unix und Linux gepostet, aber niemand konnte darauf antworten, also migriere ich die Frage hier:
Meine Frage bezieht sich auf Source Based Policy Routing unter CentOS 5 mit 2 WANs und einem LAN (NAT) -Port mit Load Balancing. Bevor ich das Problem beschreibe, möchte ich zunächst einige Bemerkungen machen ...
Ich weiß, dass dieses Thema beim Stapelaustausch schon oft hierher gebracht wurde und dass die fünf wichtigsten Antworten lauten (geordnet von den meisten nach den wenigsten):
- Deaktiviere rp_filter
- Mark / Connmark-basiertes Richtlinienrouting
- IP-basiertes Richtlinienrouting (weitere IPs hinzufügen)
- Installieren Sie pfSense, Shorewall, Ubuntu ...
- Kaufen Sie teure Cisco / 3com / Juniper / Etc ... Router
In den meisten Fällen sind einige dieser Antworten richtig, aber für mich haben die Lösungen 1 und 2 kein Workout (ich verwerfe nicht mindestens Punkt 2, da ich möglicherweise Probleme mit meinem Setup habe). Punkt 3 isoliert im Grunde ein Problem Anstatt es zu lösen (fügt auch Komplexität zu den Routingtabellen hinzu) und die Lösungen 4 und 5 gehören nicht zum Anwendungsbereich, da ich keine Ressourcen habe, um spezielle Hardware zu kaufen, und den Server auch nicht offline schalten kann, da er in Produktion ist, um das Ersetzen zusammenzufassen Der CentOS-Server mit etwas "Besserem" ist vom Tisch.
Ok, jetzt zurück zum Problem, lass uns zuerst das aktuelle Setup beschreiben ...
Schnittstellen :
eth1: IP: 10.0.0.1, GW: 10.0.0.1, NM: 255.255.255.0 (LAN)
eth0: IP: 10.0.1.1, GW: 10.0.1.254, NM: 255.255.255.0 (ISP1 - ADSL Router)
eth2: IP: 10.0.2.1, GW: 10.0.2.254, NM: 255.255.255.0 (ISP2 - ADSL Router)
/etc/sysctl.conf :
# Controls IP packet forwarding
net.ipv4.ip_forward = 1
# Controls source route verification
net.ipv4.conf.default.rp_filter = 0
# Do not accept source routing
net.ipv4.conf.default.accept_source_route = 0
# Controls the use of TCP syncookies
net.ipv4.tcp_syncookies = 1
# Ignoring broadcasts request
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_ignore_bogus_error_messages = 1
/ etc / iproute2 / rt_tables:
#
# reserved values
#
255 local
254 main
253 default
0 unspec
#
# local
#
#1 inr.ruhep
2 ISP1
3 ISP2
/ etc / sysconfig / network-scripts / route-eth0 :
10.0.1.0/24 dev eth0 src 10.0.1.1 table ISP1
default via 10.0.1.254 dev eth0 table ISP1
/ etc / sysconfig / network-scripts / route-eth2 :
10.0.2.0/24 dev eth2 src 10.0.2.1 table ISP2
default via 10.0.2.254 dev eth2 table ISP2
/ etc / sysconfig / network-scripts / rule-eth0 :
fwmark 2 table ISP1
from 10.0.1.1 table ISP1
/ etc / sysconfig / network-scripts / rule-eth2 :
fwmark 3 table ISP2
from 10.0.2.1 table ISP2
/ etc / sysconfig / iptables :
*filter
:INPUT DROP [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
# Basic Rules
-A INPUT -i lo -j ACCEPT
-A INPUT -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i eth2 -m state --state RELATED,ESTABLISHED -j ACCEPT
# SSH
-A INPUT -i eth0 -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -i eth2 -m tcp -p tcp --dport 22 -j ACCEPT
# OpenVPN
-A INPUT -i eth0 -m udp -p udp --dport 1194 -j ACCEPT
-A INPUT -i eth2 -m udp -p udp --dport 1194 -j ACCEPT
# Allow everything from LAN
-A INPUT -i eth1 -j ACCEPT
# Allow everything from the VPN
-A INPUT -i tun0 -j ACCEPT
# Default Drop on everything else
-A INPUT -j DROP
# Allow forwarding from LAN and VPN
-A FORWARD -i eth1 -j ACCEPT
-A FORWARD -i tun0 -j ACCEPT
# Allow all outbound traffic
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -o eth1 -j ACCEPT
COMMIT
*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
# DNAT to Developer Box (SSH Server)
-A PREROUTING -i eth0 -p tcp -m tcp --dport 2222 -j DNAT --to-destination 10.0.0.200:2222
-A PREROUTING -i eth2 -p tcp -m tcp --dport 2222 -j DNAT --to-destination 10.0.0.200:2222
# SNAT
-A POSTROUTING -o eth0 -j SNAT --to-source 10.0.1.1
-A POSTROUTING -o eth2 -j SNAT --to-source 10.0.2.1
COMMIT
*mangle
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
# Mark Based Routing? (based on NerdBoys site)
-A PREROUTING -j CONNMARK --restore-mark
-A PREROUTING --match mark --mark 2 -j ACCEPT
-A PREROUTING -i eth0 -j MARK --set-mark 2
-A PREROUTING --match mark --mark 3 -j ACCEPT
-A PREROUTING -i eth2 -j MARK --set-mark 3
-A PREROUTING -j CONNMARK --save-mark
COMMIT
Der Lastausgleich ist mit dem gwping bash-Skript möglich, das im Wesentlichen die 2 Wans (eth0 und eth2) überwacht und die Standardrouten und -gewichte auf dem Server wie folgt einrichtet (während der Lastausgleich oder die 2 Wans aktiv sind):
ip route replace default scope global nexthop via 10.0.1.1 dev eth0 weight 1 nexthop via 10.0.2.1 dev eth1 weight 1
Das Problem, das ich habe, ist, dass selbst mit diesem Setup, dem viele Leute zustimmen, das richtige ist. Ich habe immer noch Probleme mit dem Zugriff auf Dienste innerhalb des Netzwerks von außen (insbesondere die SSH-Entwickler-Box und die OpenVPN-Box), selbst wenn die Pakete werden "markiert" und entsprechend geroutet die antwort von der dev box geht immer auf den falschen pfad. Ich weiß nicht, ob ich irgendetwas in der Mangle oder im Nat-Bereich vermisse oder ob ich quellbasiertes Routing überhaupt missverstehe. Wenn jemand weiß, wie man diese Arbeit dementsprechend macht, wird er sich darüber freuen.
Meine Quellen für dieses Setup sind:
lartc.org/lartc.html#LARTC.RPDB.MULTIPLE-LINKS
fatalsite.net/?p=90
nerdboys.com/2006/05/05/conning-the-mark-multiwan-connections-using-iptables-mark-connmark-and-iproute2/
policyrouting.org/PolicyRoutingBook/ONLINE/CH08.web.html
unix.stackexchange.com/questions/58635/iptables-set-mark-route-diferent-ports-through-different-interfaces
unix.stackexchange.com/questions/22770/two-interfaces-two-addresses-two-gateways
bulma.net/body.phtml?nIdNoticia=2145
Mit freundlichen Grüßen
PS1: Ich habe eine Website gefunden, auf der steht, dass die Markierungen in der Routing-Tabelle + 1 von den iptables-Markierungen abweichen sollten (kim.attr.ee/2010/08/source-based-policy-routing-on-centos.html) Ist das wahr? oder diese Website ist super-falsch.
Update 15.08.2013 22:15 Uhr
Nach mehr Recherche und Debugging habe ich eine Website gefunden, auf der steht, dass ich vergessen habe, den SNAT-Teil in der Post-Routing-Tabelle hinzuzufügen. Deshalb füge ich diese Regeln der iptables-Konfiguration hinzu:
-A POSTROUTING --match mark --mark 2 -j SNAT --to-source 10.0.1.1
-A POSTROUTING --match mark --mark 3 -j SNAT --to-source 10.0.2.1
Ich kann mich aber immer noch nicht von außerhalb des Netzwerks mit der Devbox verbinden. Auf der positiven Seite gibt ein iptables -t nat -nvL POSTROUTING einen Hinweis auf die Funktionsweise von connmark-basiertem Policy-Routing. Vielleicht hängt es also mit dem ISP1- und ISP2-Router-Edge zusammen:
Chain POSTROUTING (policy ACCEPT 520 packets, 56738 bytes)
pkts bytes target prot opt in out source destination
0 0 SNAT all -- * * 0.0.0.0/0 0.0.0.0/0 MARK match 0x2 to:10.0.1.1
6 312 SNAT all -- * * 0.0.0.0/0 0.0.0.0/0 MARK match 0x3 to:10.0.2.1
903 70490 SNAT all -- * eth0 0.0.0.0/0 0.0.0.0/0 to:10.0.1.1
931 78070 SNAT all -- * eth2 0.0.0.0/0 0.0.0.0/0 to:10.0.2.1
Außerdem füge ich weitere Informationen aus meinem Setup hinzu, bitte wirft mir jemand einen Lebensretter zu, da mir die Ideen ausgehen ...>. <
ip route show :
10.8.0.2 dev tun0 proto kernel scope link src 10.8.0.1
10.0.2.0/24 dev eth2 proto kernel scope link src 10.0.2.1
10.0.0.0/24 dev eth1 proto kernel scope link src 10.0.0.1
10.8.0.0/24 via 10.8.0.2 dev tun0
10.0.1.0/24 dev eth0 proto kernel scope link src 10.0.1.1
169.254.0.0/16 dev eth2 scope link
default
nexthop via 10.0.1.254 dev eth0 weight 1
nexthop via 10.0.2.254 dev eth2 weight 1
IP-Regel zeigen:
0: from all lookup 255
1024: from all fwmark 0x2 lookup ISP1
1025: from all fwmark 0x3 lookup ISP2
2024: from 10.0.1.1 lookup ISP1
2025: from 10.0.2.1 lookup ISP2
32766: from all lookup main
32767: from all lookup default
Neue Quellen:
sarcasmasaservice.com/2013/04/linux-routing-capabilities-my-abuse-thereof/
Mit freundlichen Grüßen