GNU/Linux >> Linux Esercitazione >  >> Linux

Source Based Policy Routing &NAT (DNAT/SNAT) ovvero Multi WAN su CentOS 5

Beh...

Dopo migliaia di ore di debug, provando diverse configurazioni e 72 ore di pesanti test in produzione, sono stato in grado di trovare la soluzione/configurazione corretta, il problema era nelle regole di iptables (sezione mangle) i pacchetti apparentemente sono stati contrassegnati proprio quando arrivano ma quando sono usciti non ce n'erano per i pacchetti codificati, comunque ecco la mia ultima soluzione funzionante al mio problema:

/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]
# CONNMARK Source Based Routing
-A PREROUTING -i eth0 -m state --state NEW,RELATED,ESTABLISHED -d 10.0.1.1 -j CONNMARK --set-mark 0x2
-A PREROUTING -i eth2 -m state --state NEW,RELATED,ESTABLISHED -d 10.0.2.1 -j CONNMARK --set-mark 0x3
-A PREROUTING -i eth1 -m connmark --mark 0x2 -j CONNMARK --restore-mark
-A PREROUTING -i eth1 -m connmark --mark 0x3 -j CONNMARK --restore-mark
-A OUTPUT -m state --state ESTABLISHED,RELATED -j CONNMARK --restore-mark
COMMIT

Ovviamente oltre a tutte le impostazioni precedenti relative a iproute e gwping (per il bilanciamento del carico dei collegamenti e il failover), le soluzioni sono state rese possibili grazie alle fonti [1] e [2], entrambe che mi hanno indicato una parte diversa (Luca Gibelli per la parte PREROUTING e Karl Bowden per la parte OUTPUT) della soluzione, inoltre vivo qui alcune altre fonti per altri siti Web che mi hanno indicato la direzione giusta per andare a cercare. Spero che questo aiuti un altro amministratore di sistema in futuro.

Cordiali saluti

Fonti:

[1]www.nervous.it/2010/09/dnat-and-ip-source-routing-woes/
[2]blog.khax.net/2009/12/01/multi-gateway-balancing-with-iptables/
[3]home.regit.org/netfilter-en/links-load-balancing/
[4]mailman.ds9a.nl/pipermail/lartc/2006q2/018964.html
[5]web.archive.org/web/20120320115329/http://versa.net.au/index.php?option=com_content&task=view&id=21&Itemid=34

Aggiornamento 10/10/2013

OpenVPN richiede una direttiva di configurazione aggiuntiva per funzionare con una configurazione wan multipla (come la precedente), quindi aggiungi l'opzione multihome nel tuo server.conf (OpenVPN>=2.1, per le versioni inferiori basta cambiare la direttiva locale per ascoltare solo in un particolare ip) e sei a posto.


Linux
  1. Come installare Apache 2.4.2 da Source su CentOS 6.2 con SSL

  2. Come installare Apache CouchDB su CentOS 6 (da Source ed EPEL)

  3. CentOS / RHEL:come creare una nuova partizione di swap basata su LVM

  4. CentOS / RHEL:come configurare le regole iptable per consentire le porte FTP 20/21

  5. Linux:instradamento basato sui nomi di dominio

Crea un SDN su Linux con open source

Come disabilitare SELinux su CentOS 7

Come compilare Brotli dal sorgente su CentOS 7

Come costruire Nginx dal sorgente su CentOS 7

CentOS 7 Il miglior Linux aziendale gratuito e open source

Come installare e configurare GlusterFS su CentOS 7/CentOS 8