Difference between revisions of "High Performance Firewall (Italiano)"

From ArchWiki
Jump to: navigation, search
(New page: Category: Networking (Italiano) {{i18n_links_start}} {{i18n_entry|English|High Performance Firewall/Nat with iptables and VLANs and iproute2}} {{i18n_entry|Español|High Performance Fi...)
 
m (Supporto delle VLAN)
(6 intermediate revisions by 3 users not shown)
Line 1: Line 1:
 +
[[en:High Performance Firewall]]
 +
[[es:High Performance Firewall]]
 
[[Category: Networking (Italiano)]]
 
[[Category: Networking (Italiano)]]
{{i18n_links_start}}
 
{{i18n_entry|English|High Performance Firewall/Nat with iptables and VLANs and iproute2}}
 
{{i18n_entry|Español|High Performance Firewall/Nat with iptables and VLANs and iproute2 (Español)}}
 
{{i18n_links_end}}
 
  
=Introduction=
+
La guida è stata realizzata basandosi su un esperienza reale di un utente, quindi il tutto è basato sulla configurazione dell'utente stesso.
  
Imagine this, you have more than two networks separated by Virtual Lans protocols (IEEE 802.1q) or VLANs, carried to you by an intelligent/manageable switch on one troncal line 10/100/1000 MB HD/FD (naturally the best is 1000 MB FD).
+
Immaginate questo, avete più di due reti separate da un protocollo di Virtual Lan (IEEE 802.1q) o VLAN, a cui fate accesso tramite uno switch con una linea trunk 10/100/1000 MB HD/FD (naturalmente la migliore è 1000 MB FD).
  
You have to share internet to a really BIG numbers of hosts, and maintain a good performance. The first choice is to separate the networks into a equal numbers of ports and maybe a more numbers of firewalls machines. This is not really cost effective, but works.
+
Dovete condividere la rete con un numero MOLTO GRANDE di host, e mantenere delle buone prestazioni. La prima scelta è di separare le reti in altrettante porte e magari con altrettanti firewall. Magari non è la migliore idea per i costi, ma funziona.
  
The second one is what I did. The history of how this begin is related to a some emergency/burn/crash/out of a group of Cisco PIXs. I won't go too deeply into that.
+
La seconda scelta è quella spiegata qui.
  
===The facts:===
+
===I fatti:===
: I have about 4 networks mask 21 i.e a 8 class C each!!! This is a lots of MACs addresses and even more dangerous a lot of BROADCAST. This is insane but this is the way that my company works.
+
: Abbiamo circa 4 netmask 21 ex. ognuna con 8 classi di tipo C!!! Abbiamo quindi tantissimi MAC address e altrettanti pericolosi BROADCAST.  
  
: They gave me 30 publics IPs addresses in 3 groups.
+
: Abbiamo inoltre 30 IP pubblici in 3 gruppi
  
: And a machine, a little one, not a big deal.... just for testing. Later (about 8 months) we changed the PC. We put in a real monster.
+
: E una piccola macchina ...solo per fare test.
  
: Later we added a class C network with a routed lot of increasing subnets.... PLUS!!!!
+
: Più in la verrà aggiunga una rete di classe C con molte altre subnet.
  
=The work=
+
=Il lavoro=
==VLAN support==
+
==Supporto delle VLAN==
  
The first thing we have to do is give the kernel the capacity to work with Jumbo Frames. This is done by adding the 8021q module to the kernel
+
La prima cosa da fare è dare al kernel la possibilità di lavorare con i Jumbo Frames. Questo può essere fatto aggiungendo il modulo 8021q al kernel
  # modprobe 8021q
+
  #modprobe 8021q
and/or put in modules in /etc/rc.conf
+
e/o aggiungendo il modulo in /etc/rc.conf
  
Next we have to create the virtuals NICs with this command ''vconfig''. Let's suppose we have vlans 20,30,40 and 50 working in our core network.
+
Dovremmo poi creare i NIC virtuali con il comando ''ip link''. Supponiamo di avere le vlan 20 e 30 nella nostra rete.
  # vconfig add ethX 20
+
 
  # vconfig add ethX 30
+
  # ip link add link ethX name ethX.20 type vlan id 20
...
+
  # ip link add link ethX name ethX.30 type vlan id 30
# vconfig add ethX 50
+
 
Where ''ethX'' is the troncal NIC
+
Dove ''ethX'' è l'interfaccia NIC.
Now, if we want to see the interfaces just put '''ifconfig -a''' and we will get a list.
+
Ora se volessimo vedere le intefacce basterà un '''ifconfig -a''' e otterremo una lista.
  
So .... next just set the private address as you want. For example (using eth1 like a troncal)
+
Quindi .... settate semplicemente un indirizzo privato come preferite. Esempio (usando eth1 come trunk)  
 
  # ifconfig eth1.20 192.168.0.1 netmask 255.255.248.0
 
  # ifconfig eth1.20 192.168.0.1 netmask 255.255.248.0
 
  # ifconfig eth1.30 192.168.8.1 netmask 255.255.248.0
 
  # ifconfig eth1.30 192.168.8.1 netmask 255.255.248.0
 
  ...
 
  ...
 
   etc.
 
   etc.
I will not explain the number of host neither the mask....
 
I do a kind of daemon with this, a vlan.conf file in /etc and a vland in /etc/rc.d... I can share this if you want?
 
  
 +
Si può realiazzare una sorta di daemon con questo, un vlan.conf in /etc e a vland in /etc/rc.d
 +
(l'utente che ha scritto questa guida (guardare la localizzazione in inglese) ne ha realizzato uno e si è offerto di condividerlo su richiesta)
  
==The Firewall==
+
==Il firewall==
  
It is really easy to make a firewall/nat with ''iptables'' there is a lot of information around there...
+
Può essere realizzato un firewall/nat con ''iptables'' in maniera semplice e ci sono molte guide su questo...
  
Just take in mind that you will work with a lot of traffic, this means a lot of CPU usage, so keep your rules tiny, just those necessary. Accept all by default just want to make NAT, no more....
+
Pensate che dovrete lavorare con molto traffico, questo vuol dire un uso massivo di CPU, quindi mantenete poche regole, solo le strette necessarie.
Maybe it is good to accelerate some ports, (80,443,25,110,21,20,53 etc) remember, every packet running through our firewall will past through every rule until it matches to one or fall in the pool (default policy).
+
Accept all per default per fare NAT.
 +
Probabilmente è meglio favorire alcune porte, (80,443,25,110,21,20,53 etc), ricordatevi che ogni pacchetto che passa per il vostro firewall deve attraversare tutte le regole fino a che non ne trova una che lo riguarda, altrimenti cade nella politica di default.
  
===The round robin NAT===
+
===Il NAT round robin===
  
Let's suppose we have a one ip: 200.aaa.bbb.6 and our gateway is 200.aaa.bbb.1. we can safely put these parameters by default in our configuration. It will not get participation at all in our firewall.
+
Supponiamo di avere un ip: 200.aaa.bbb.6 e il nostro gateway è 200.aaa.bbb.1. Possiamo tranquillamente mettere questi parametri di default nella nostra configurazione.
 +
 
 +
Abbiamo detto che abbiamo 3 gruppi con 10 IP ognuno ... definiamo quindi il NEXT HOP nel nostro firewall:
  
I say I have 3 groups of 10 IPs each to play...... we'll define the NEXT in our firewall script:
 
 
  Gr1='200.AAA.CCC.10-200.AAA.CCC.20'
 
  Gr1='200.AAA.CCC.10-200.AAA.CCC.20'
 
  Gr2='200.AAA.DDD.10-200.AAA.DDD.20'
 
  Gr2='200.AAA.DDD.10-200.AAA.DDD.20'
 
  Gr3='200.AAA.EEE.10-200.AAA.EEE.20'
 
  Gr3='200.AAA.EEE.10-200.AAA.EEE.20'
'''And the next important line is:'''
+
'''Le prossime righe necessarie sono:'''
 
  iptables -t nat -A POSTROUTING -s 192.168.0.0/21  -j SNAT --to $Gr1 #ACCESS VLAN 10
 
  iptables -t nat -A POSTROUTING -s 192.168.0.0/21  -j SNAT --to $Gr1 #ACCESS VLAN 10
 
  iptables -t nat -A POSTROUTING -s 192.168.8.0/21  -j SNAT --to $Gr2 #ACCESS VLAN 20
 
  iptables -t nat -A POSTROUTING -s 192.168.8.0/21  -j SNAT --to $Gr2 #ACCESS VLAN 20
Line 67: Line 67:
 
  .... etc
 
  .... etc
  
You can repeat the groups for access, subdivide the networks ETC, iptables make a round robin over the Gr1, Gr2 and Gr3 by default, no modification is needed.
+
Potrete ripetere i gruppi per gli accessi, suddividete le reti ETC, iptables userà una politica round robin su Gr1, Gr2 e Gr3 per default, non sono necessarie ulteriori modifiche.
  
It's not necessary to create a virtual card (alias) to every IP in the group.
+
Non è necessario creare un interfaccia virtuale (alias) per ogni IP del gruppo.
  
It's important that every real router knows every group and publishes its via BGP (or similar) to the neighbours.
+
E' importante che ogni router conosca ogni gruppo e diffonda questo via BGP (o simile) ai vicini.
  
===tips===
+
===Trucchi===
  
To accelerate some ports you can put this in the top of FORWARD chain
+
Per favorire alcune porte potreste mettere queste regole in cima alla catena di FORWARD
 
  iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
 
  iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
 
  iptables -A FORWARD -p icmp -o eth0 -j ACCEPT
 
  iptables -A FORWARD -p icmp -o eth0 -j ACCEPT
Line 81: Line 81:
 
  iptables -A FORWARD -p udp  --dport 53 -j ACCEPT
 
  iptables -A FORWARD -p udp  --dport 53 -j ACCEPT
  
This mean:
+
Che voglio dire:
*the packets incoming will pass only 1 rule if it is an establish connection
+
*I pacchetti passano la regola 1 se fanno parte di una connessione già aperta.
*the packet incoming will pass 2 rules if is a ping or similar
+
*I pacchetti passano la regola 2 se fanno parte del protocollo icmp (PING o similari)
*the packet will pass 3 rules if is http, mail or similar
+
*I pacchetti passano la regola 3 se il loro protocollo è http, mail o simile
*and the DNS request will pass 3 o 4 rules until go out
+
*e le richieste al DNS attraverseranno 3 o 4 regolo prima di pasare
  
The outgoing virus will KILL our machine, and we not need to share "windows" conversations so, kill them!!!!
+
I virus potrebbero infastidire al nostra macchina.. quindi...
 
   #VIRUS
 
   #VIRUS
 
  iptables -A FORWARD -p tcp --dport 135:139 -j DROP
 
  iptables -A FORWARD -p tcp --dport 135:139 -j DROP
Line 94: Line 94:
 
  iptables -A FORWARD -p udp --dport 445 -j DROP
 
  iptables -A FORWARD -p udp --dport 445 -j DROP
  
If you can, before they reach our machine.
+
==Aumentare le performance==
  
==The High Performance==
+
Siamo arrivate alla parte importate di questo howto.
  
We get to the real important part of this howto.
+
Abbiamo dimenticato qualcosa durante la nostra corsa
 +
# Abbiamo dimenticato che vi è solo un NICs con potenzialmente più di 8000 indirizzi Mac. La memoria della scheda di rete non è adatta per questo!!!
 +
# Per default iptable non è in grado di gestire tutte queste richieste contemporaneamente !!!!!
  
In our run to get a really big number of hosts running through our machine we miss some things
+
Quindi...  
# We forget that is just one NICs to potentially more than 8000 Mac Addresses. The card shared memory is not prepare for this!!!!!
+
# By default iptables is not prepared to make this number of connections simultaneously !!!!!!
+
  
So...
+
Per il primo problema...
 
+
La soluzione è questa.. '''aumentare la soglia di memoria per i vicini.
To the first issue...
+
Date questo comando e leggete:
I get some error messages in the logs relative to this, I'm really sorry, I lost these logs and don't remember what they said. But the answer is this, increase the threshold memory to the neighbours.
+
Type this and read:
+
  
 
  # cat /proc/sys/net/ipv4/neigh/default/gc_thresh1  
 
  # cat /proc/sys/net/ipv4/neigh/default/gc_thresh1  
Line 117: Line 115:
 
  1024
 
  1024
  
Next you can put this in the /etc/sysctrl.conf
+
Dopo di che mettete queste righe nel vostro /etc/sysctrl.conf
 
  net.ipv4.neigh.default.gc_thresh1 = 512
 
  net.ipv4.neigh.default.gc_thresh1 = 512
 
  net.ipv4.neigh.default.gc_thresh2 = 1024
 
  net.ipv4.neigh.default.gc_thresh2 = 1024
 
  net.ipv4.neigh.default.gc_thresh3 = 2048
 
  net.ipv4.neigh.default.gc_thresh3 = 2048
and make ''sysctl -p'' to increase to the double!!! (no reboot needed) with this I get no errors!!!!!
+
e date ''sysctl -p'' per portarle al doppio!!! (non serve riavviare) con questi non si dovrebbero avere errori!!!!
  
The next part will need some comprehension about buckets and conntracks and hashsize (the way how iptables manage the nat connections).
+
La prossima parte richiede una comprensione su buckets e conntracks e hashsize (il modo in cui iptable gestisce le connessione nat).
There is a very good document about this at [http://www.wallfire.org/misc/netfilter_conntrack_perf.txt here]. Read it!!!!
+
Esiste un buon documento su questo [http://www.wallfire.org/misc/netfilter_conntrack_perf.txt qui] (in Inglese). L'autore consiglia di leggerlo!!!!
Some thing are change since IPtables is know as Netfiler.
+
Qualcosa è cambiato da quanto IPtables è conosciuto come Netfilter.
  
In resume!!!
+
In breve!!!
Put this in your modules section:
+
Mettete questo nella sezione MODULES:
 
  MODULES=(8021q 'nf_conntrack hashsize=1048576' nf_conntrack_ftp  
 
  MODULES=(8021q 'nf_conntrack hashsize=1048576' nf_conntrack_ftp  
                                 ...and other nf_stuff .......)
+
                                 ...e gli altri nf_stuff .......)
The last ones is just to avoid some problems that we have with ftp connections (I thing this is not necessary anymore).
+
L'ultima è solo per evitare alcuni problemi che abbiamo con con le connessioni ftp.
The ''''nf_conntrack hashsize=1048576'''' increase the numbers of the hashsize (increase the kernel memory designated to NAT connections) (need reboot or '''reload module''' :-) see with ''dmesg | grep conntrack'')
+
  
And the next is put some similar to the ''/etc/sysctrl.conf'' file
+
''''nf_conntrack hashsize=1048576'''' aumenta il numero dell' hashsize (aumenta la memoria dedicata al NAT) (è necessario riavviare o '''ricaricare il modulo''' :-) controllate con  ''dmesg | grep conntrack'')
 +
 
 +
Poi mettiamo qualcosa di simile nel file ''/etc/sysctrl.conf''
 
  ...
 
  ...
 
  net.netfilter.nf_conntrack_max = 1048576
 
  net.netfilter.nf_conntrack_max = 1048576
 
  ...
 
  ...
And do the ''sysctl -p'' command
+
E diamo il comando ''sysctl -p''
  
In my case is the same number, that means that I have 1 connection for bucket!!!! I don't need more!!!! by default NetFilter put rate of 1:8. I.E. 8 conections per bucket!! (I think, not remember well)..
+
Nel nostro caso i numeri sono gli stessi, ciò vuol dire che ho 1 connessione per bucket!!!!
  
In our case we get about 600.000 simultaneous connections in 2 1Giga NICs cards, You can see this with the next command
+
Nel nostro caso abbiamo circa 600.000 connessioni simultanee in 2 schede da 1 Giga, potrete verificare ciò con il comando
 
  # cat /proc/sys/net/netfilter/nf_conntrack_count
 
  # cat /proc/sys/net/netfilter/nf_conntrack_count
And put this in a snmpd agent to get and graph it in a MRTG/cacti server  ..... uuuuuuu homework
+
E mettete questo in un demone snmpd per avere un grafico.
  
A sample [http://carlost.890m.com/conntrack.png here]. (Not actualized, not ever here, but I'll try.)
+
Un esempio [http://carlost.890m.com/conntrack.png qui].
  
Finally
+
==Iproute2==
  
==The iproute2==
+
Abbiamo 3 grandi accessi ad Internet!!! Questo perchè abbiamo a che fare con 3 gruppi di IP di classe C. Quindi abbiamo 3 traffici in entrata da gestire, ma solo uno in uscita!!! Il nostro gateway di default.
  
We have 3 big access to Internet!!! This is because we manage 3 class C groups of IPs  (some restrictions of BGP) in this firewall. So, we have 3 incoming traffics that we can manage, but only one outgoing!!! Our default gateway.
+
Per prima cosa dobbiamo mettere delle nuove tabelle nel file ''/etc/iproute2/rt_tables''
This can easily fill our outgoing quote, so we have to spare it.
+
 
+
First we have to put some new tables to ''/etc/iproute2/rt_tables'' file
+
 
  # echo 200 PRO_1 >> /etc/iproute2/rt_tables
 
  # echo 200 PRO_1 >> /etc/iproute2/rt_tables
 
  # echo 205 PRO_2 >> /etc/iproute2/rt_tables
 
  # echo 205 PRO_2 >> /etc/iproute2/rt_tables
 
  # echo 210 PRO_3 >> /etc/iproute2/rt_tables
 
  # echo 210 PRO_3 >> /etc/iproute2/rt_tables
Can be more, can be less, depends on traffic
+
Possono essere più o meno a seconda del traffico.
  
Second we have to give a default gateway to this tables
+
Secondo.. dobbiamo dare un gateway di default per queste tabelle.
 
  # ip route add default via 200.aaa.bbb.2 table PRO_1
 
  # ip route add default via 200.aaa.bbb.2 table PRO_1
 
  # ip route add default via 200.aaa.bbb.3 table PRO_2
 
  # ip route add default via 200.aaa.bbb.3 table PRO_2
 
  # ip route add default via 200.aaa.bbb.4 table PRO_3
 
  # ip route add default via 200.aaa.bbb.4 table PRO_3
It's recommended but not necessary put the local interfaces to each table. If you don't put the next few lines you will get not answer of ping in the local network, but you will be able to pass trough.
+
E' raccomandato ma non necessario mettere una interfaccia di rete per ogni tabella. Se non inserite le prossime righe, non avrete risposta ai ping nella rete locale.  
 
  # ip route add 192.168.0.0/21 via 192.168.0.1 table PRO_1
 
  # ip route add 192.168.0.0/21 via 192.168.0.1 table PRO_1
 
  # ip route add 192.168.8.0/21 via 192.168.8.1 table PRO_1
 
  # ip route add 192.168.8.0/21 via 192.168.8.1 table PRO_1
 
  # ip route add 192.168.15.0/21 via 192.168.15.1 table PRO_1
 
  # ip route add 192.168.15.0/21 via 192.168.15.1 table PRO_1
 
  .....
 
  .....
  same PRO_2, same PRO_3
+
  lo stesso per PRO_2, e per PRO_3
The last thing is to give the order to the incoming packages
+
L'ultima cosa da fare è dare un ordine ai pacchetti
 
  # ip rule add from 192.168.0.0/21 table PRO_1
 
  # ip rule add from 192.168.0.0/21 table PRO_1
 
  ....
 
  ....
 
  ....
 
  ....
Again, you can play with the PRO_X and even you can play with the mask and submask
+
Potreste utilizzare PRO_X e persino con mask e submask.
For example we want to give only a one class C to outgoing to PRO_3
+
Per esempio vogliamo dare solo una classe C all'uscita con PRO_3
 
  # ip rule add from 192.168.1.0/24 table PRO_3
 
  # ip rule add from 192.168.1.0/24 table PRO_3
Put this before the <NET>/21  
+
Da mettere prima di <NET>/21
 
+
and then TEST IT!!!!
+
 
+
pick a WinPC in one of the private networks and make a tracert to somewhere!!!
+
 
+
Before this, you can browse to a some MYIPsite like www.whatismyip.com and get your "RightNow" address, test it later and get some other address ETC...
+
 
+
=Conclusions=
+
 
+
Actually we are using a PC with 2G ram , Intel Pentium 4 2.8GHz Dual and 2 NICs 1Gb (one integrated one PCI-E), the top CPU usage don't get the 80% pic...
+
 
+
'''Actualization'''
+
 
+
*I got a really big surprise when upgrade net-snmp to 5.4.1 (to get statistics)on the Firewall, the CPU usage goes down a lot... from 80% to almost 3%... YES I mean it...  I got a confirmation on the other machine (the bridge one, I mention it below) so, we have a much more machine to keep increasing the traffic... this is very good news.
+
 
+
Out traffics is about 180 MB OUT and maybe the half IN.
+
 
+
We get some lost in the cards, about 1 packets per second, it's really low compared with the traffic, so we just don't care.
+
 
+
'''Actualization'''
+
* Now we have no errors and no packets lost.
+
 
+
Nevertheless we get a big problem, the MAIL/SPAM outgoing, provoked by VIRUS/MAD_GUYs, can block all the publics IP in a really short time. (in the public Black Lists).
+
 
+
The answer to this may not be ethical, but we have to do it.
+
 
+
We put a similar machine before this one with a bridge configuration blocking every port 25 traffic and sending to another anti SPAM/VIRUS/MAIL machine.
+
 
+
To do this is necessary to give to the bridge the capacity of VLANs and one virtual card (in bridge mode i.e.'br0.30') in every net to answer to the sender...
+
  
It works and the customer doesn't notice the difference. Just if you do a ''telnet anywhere.net 25'' you get a '''Hi I'm a scanner''' hello answer!!!.. It's really good!!! and works, the mail outgoing is sender from another IP, so we get our 3 groups safe!!!.
+
PROVIAMO IL TUTTO
  
Thats all folks, I hope this can help anyone, and it's the only thing I can do to give you something back..
+
prendete un PC Windows in una delle reti private e fate un traceroute verso qualcuno!!
 +
 +
Prima potreste andare su qualche sito tipo www.whatismyip.com e vedere il vostro ip attuale, rifarlo dopo un po e vedere che l'ip è cambiato ETC...
  
Be strong, be free, 4 ever
+
=Conclusioni=
  
: [[User:CarLost|CarLost]] 11:51, 12 October 2007 (EDT) from Chile
+
Ora lo scrittore della guida sta usando un PC con 2G di ram, Intel Pentium 4 2.8GHz Dual e 2 NICs 1Gb (una integrata e una PCI-E), l'utilizzo della CPU non va oltre picchi all'80%...

Revision as of 01:58, 18 February 2013


La guida è stata realizzata basandosi su un esperienza reale di un utente, quindi il tutto è basato sulla configurazione dell'utente stesso.

Immaginate questo, avete più di due reti separate da un protocollo di Virtual Lan (IEEE 802.1q) o VLAN, a cui fate accesso tramite uno switch con una linea trunk 10/100/1000 MB HD/FD (naturalmente la migliore è 1000 MB FD).

Dovete condividere la rete con un numero MOLTO GRANDE di host, e mantenere delle buone prestazioni. La prima scelta è di separare le reti in altrettante porte e magari con altrettanti firewall. Magari non è la migliore idea per i costi, ma funziona.

La seconda scelta è quella spiegata qui.

I fatti:

Abbiamo circa 4 netmask 21 ex. ognuna con 8 classi di tipo C!!! Abbiamo quindi tantissimi MAC address e altrettanti pericolosi BROADCAST.
Abbiamo inoltre 30 IP pubblici in 3 gruppi
E una piccola macchina ...solo per fare test.
Più in la verrà aggiunga una rete di classe C con molte altre subnet.

Il lavoro

Supporto delle VLAN

La prima cosa da fare è dare al kernel la possibilità di lavorare con i Jumbo Frames. Questo può essere fatto aggiungendo il modulo 8021q al kernel

#modprobe 8021q

e/o aggiungendo il modulo in /etc/rc.conf

Dovremmo poi creare i NIC virtuali con il comando ip link. Supponiamo di avere le vlan 20 e 30 nella nostra rete.

# ip link add link ethX name ethX.20 type vlan id 20
# ip link add link ethX name ethX.30 type vlan id 30

Dove ethX è l'interfaccia NIC. Ora se volessimo vedere le intefacce basterà un ifconfig -a e otterremo una lista.

Quindi .... settate semplicemente un indirizzo privato come preferite. Esempio (usando eth1 come trunk)

# ifconfig eth1.20 192.168.0.1 netmask 255.255.248.0
# ifconfig eth1.30 192.168.8.1 netmask 255.255.248.0
...
 etc.

Si può realiazzare una sorta di daemon con questo, un vlan.conf in /etc e a vland in /etc/rc.d (l'utente che ha scritto questa guida (guardare la localizzazione in inglese) ne ha realizzato uno e si è offerto di condividerlo su richiesta)

Il firewall

Può essere realizzato un firewall/nat con iptables in maniera semplice e ci sono molte guide su questo...

Pensate che dovrete lavorare con molto traffico, questo vuol dire un uso massivo di CPU, quindi mantenete poche regole, solo le strette necessarie. Accept all per default per fare NAT. Probabilmente è meglio favorire alcune porte, (80,443,25,110,21,20,53 etc), ricordatevi che ogni pacchetto che passa per il vostro firewall deve attraversare tutte le regole fino a che non ne trova una che lo riguarda, altrimenti cade nella politica di default.

Il NAT round robin

Supponiamo di avere un ip: 200.aaa.bbb.6 e il nostro gateway è 200.aaa.bbb.1. Possiamo tranquillamente mettere questi parametri di default nella nostra configurazione.

Abbiamo detto che abbiamo 3 gruppi con 10 IP ognuno ... definiamo quindi il NEXT HOP nel nostro firewall:

Gr1='200.AAA.CCC.10-200.AAA.CCC.20'
Gr2='200.AAA.DDD.10-200.AAA.DDD.20'
Gr3='200.AAA.EEE.10-200.AAA.EEE.20'

Le prossime righe necessarie sono:

iptables -t nat -A POSTROUTING -s 192.168.0.0/21  -j SNAT --to $Gr1 #ACCESS VLAN 10
iptables -t nat -A POSTROUTING -s 192.168.8.0/21  -j SNAT --to $Gr2 #ACCESS VLAN 20
iptables -t nat -A POSTROUTING -s 192.168.15.0/21  -j SNAT --to $Gr1 #ACCESS VLAN 30
.... etc

Potrete ripetere i gruppi per gli accessi, suddividete le reti ETC, iptables userà una politica round robin su Gr1, Gr2 e Gr3 per default, non sono necessarie ulteriori modifiche.

Non è necessario creare un interfaccia virtuale (alias) per ogni IP del gruppo.

E' importante che ogni router conosca ogni gruppo e diffonda questo via BGP (o simile) ai vicini.

Trucchi

Per favorire alcune porte potreste mettere queste regole in cima alla catena di FORWARD

iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -p icmp -o eth0 -j ACCEPT
iptables -A FORWARD -p tcp -m multiport --dports 80,443,110,53 -j ACCEPT  # FAST FAST FAST 
iptables -A FORWARD -p udp  --dport 53 -j ACCEPT

Che voglio dire:

  • I pacchetti passano la regola 1 se fanno parte di una connessione già aperta.
  • I pacchetti passano la regola 2 se fanno parte del protocollo icmp (PING o similari)
  • I pacchetti passano la regola 3 se il loro protocollo è http, mail o simile
  • e le richieste al DNS attraverseranno 3 o 4 regolo prima di pasare

I virus potrebbero infastidire al nostra macchina.. quindi...

 #VIRUS
iptables -A FORWARD -p tcp --dport 135:139 -j DROP
iptables -A FORWARD -p tcp --dport 445 -j DROP
iptables -A FORWARD -p udp --dport 135:139 -j DROP
iptables -A FORWARD -p udp --dport 445 -j DROP

Aumentare le performance

Siamo arrivate alla parte importate di questo howto.

Abbiamo dimenticato qualcosa durante la nostra corsa

  1. Abbiamo dimenticato che vi è solo un NICs con potenzialmente più di 8000 indirizzi Mac. La memoria della scheda di rete non è adatta per questo!!!
  2. Per default iptable non è in grado di gestire tutte queste richieste contemporaneamente !!!!!

Quindi...

Per il primo problema... La soluzione è questa.. aumentare la soglia di memoria per i vicini. Date questo comando e leggete:

# cat /proc/sys/net/ipv4/neigh/default/gc_thresh1 
128
# cat /proc/sys/net/ipv4/neigh/default/gc_thresh2 
512
# cat /proc/sys/net/ipv4/neigh/default/gc_thresh3 
1024

Dopo di che mettete queste righe nel vostro /etc/sysctrl.conf

net.ipv4.neigh.default.gc_thresh1 = 512
net.ipv4.neigh.default.gc_thresh2 = 1024
net.ipv4.neigh.default.gc_thresh3 = 2048

e date sysctl -p per portarle al doppio!!! (non serve riavviare) con questi non si dovrebbero avere errori!!!!

La prossima parte richiede una comprensione su buckets e conntracks e hashsize (il modo in cui iptable gestisce le connessione nat). Esiste un buon documento su questo qui (in Inglese). L'autore consiglia di leggerlo!!!! Qualcosa è cambiato da quanto IPtables è conosciuto come Netfilter.

In breve!!! Mettete questo nella sezione MODULES:

MODULES=(8021q 'nf_conntrack hashsize=1048576' nf_conntrack_ftp 
                               ...e gli altri nf_stuff .......)

L'ultima è solo per evitare alcuni problemi che abbiamo con con le connessioni ftp.

'nf_conntrack hashsize=1048576' aumenta il numero dell' hashsize (aumenta la memoria dedicata al NAT) (è necessario riavviare o ricaricare il modulo :-) controllate con dmesg | grep conntrack)

Poi mettiamo qualcosa di simile nel file /etc/sysctrl.conf

...
net.netfilter.nf_conntrack_max = 1048576
...

E diamo il comando sysctl -p

Nel nostro caso i numeri sono gli stessi, ciò vuol dire che ho 1 connessione per bucket!!!!

Nel nostro caso abbiamo circa 600.000 connessioni simultanee in 2 schede da 1 Giga, potrete verificare ciò con il comando

# cat /proc/sys/net/netfilter/nf_conntrack_count

E mettete questo in un demone snmpd per avere un grafico.

Un esempio qui.

Iproute2

Abbiamo 3 grandi accessi ad Internet!!! Questo perchè abbiamo a che fare con 3 gruppi di IP di classe C. Quindi abbiamo 3 traffici in entrata da gestire, ma solo uno in uscita!!! Il nostro gateway di default.

Per prima cosa dobbiamo mettere delle nuove tabelle nel file /etc/iproute2/rt_tables

# echo 200 PRO_1 >> /etc/iproute2/rt_tables
# echo 205 PRO_2 >> /etc/iproute2/rt_tables
# echo 210 PRO_3 >> /etc/iproute2/rt_tables

Possono essere più o meno a seconda del traffico.

Secondo.. dobbiamo dare un gateway di default per queste tabelle.

# ip route add default via 200.aaa.bbb.2 table PRO_1
# ip route add default via 200.aaa.bbb.3 table PRO_2
# ip route add default via 200.aaa.bbb.4 table PRO_3

E' raccomandato ma non necessario mettere una interfaccia di rete per ogni tabella. Se non inserite le prossime righe, non avrete risposta ai ping nella rete locale.

# ip route add 192.168.0.0/21 via 192.168.0.1 table PRO_1
# ip route add 192.168.8.0/21 via 192.168.8.1 table PRO_1
# ip route add 192.168.15.0/21 via 192.168.15.1 table PRO_1
.....
lo stesso per PRO_2, e per PRO_3

L'ultima cosa da fare è dare un ordine ai pacchetti

# ip rule add from 192.168.0.0/21 table PRO_1
....
....

Potreste utilizzare PRO_X e persino con mask e submask. Per esempio vogliamo dare solo una classe C all'uscita con PRO_3

# ip rule add from 192.168.1.0/24 table PRO_3

Da mettere prima di <NET>/21

PROVIAMO IL TUTTO

prendete un PC Windows in una delle reti private e fate un traceroute verso qualcuno!!

Prima potreste andare su qualche sito tipo www.whatismyip.com e vedere il vostro ip attuale, rifarlo dopo un po e vedere che l'ip è cambiato ETC...

Conclusioni

Ora lo scrittore della guida sta usando un PC con 2G di ram, Intel Pentium 4 2.8GHz Dual e 2 NICs 1Gb (una integrata e una PCI-E), l'utilizzo della CPU non va oltre picchi all'80%...