Newsgroup: it.comp.os.linux.sys
Titolo: DMZ con iptables e slackware 12

Ciao a tutti, mi volevo creare un firewall DMZ. Il firewall ha 3
schede di rete (Tutto con la slackware 12 ovviamente):
eth0 -> WAN (192.68.0.3);
eth1 -> LAN (192.168.0.1);
eth2 -> DMZ (192.168.1.1).
Sulla linea DMZ ho messo per ora solo il DNS interno (IP 192.168.1.2)
e per prova il servizio ssh.
La mia idea di firewall sarebbe:
- Dalla lan voglio accedere ai server in ssh e voglio andare su
internet (solo porta 80) e voglio usare il mio dns interno;
- Dalla DMZ devo rispondere alle richieste dns interno e dal server
DNS devo poter accedere ad altri server DNS per le ricerche.
- Dalla wan devono arrivare solo risposte per la lan e le richieste
per i servizi futuri della DMZ.
Leggendo un pò quà e là da internet sono arrivato a scrivere questo
script, che però non mi funziona e avrei bisogno del vostro aiuto!!!
Cosa non funziona nel dettaglio?
1) Dalla Lan non riesco ad accedere al mio DNS interno per fare delle
richieste (il server DNS ha come ip 192.168.1.2 e ho impostato bind::
listen-on { 127.0.0.1; 192.168.1.2; };);
2) Dal server DNS interno non riesco a raggiungere i server DNS
esterni;
3) Se dalla lan accedo in ssh passano almeno 60/90 secondi prima che
posso arrivare a mettere la password. Il firewall e il server DNS sono
collegati tramite cavo cross...
Probabilemtne devve essere una vera stupidata, ma al momento mi sfugge
il problema...
Ecco lo script::
#!/bin/bash
IPT=/usr/sbin/iptables
WAN="eth0"
LAN="eth1"
DMZ="eth2"
LO="lo"
IP_NET="192.68.0.3"
IP_LAN="192.168.0.1"
#IP_DMZ="192.168.20.1"
IP_LO="127.0.0.1"
RANGE_IP_LAN="
192.168.0.0/24
"
RANGE_IP_DMZ="
192.168.1.0/24
"
RANGE_IP_WAN="
192.68.0.0/24
"
#SERVER_WEB="192.168.20.20"
clear_table()
{
  #pulisco tutto
  $IPT -F
  $IPT -F INPUT
  $IPT -F OUTPUT
  $IPT -F FORWARD
  $IPT -F -t mangle
  $IPT -F -t nat
  $IPT -X
}
drop_all()
{
  #imposto il comportamento di default
  $IPT -P INPUT   DROP
  $IPT -P OUTPUT  DROP
  $IPT -P FORWARD DROP
}
clear_table
drop_all
# Genero le 6 catene di traffico
echo "Genero le catene di firewall..."
$IPT -t filter -N lan_dmz
$IPT -t filter -N lan_wan
$IPT -t filter -N wan_dmz
$IPT -t filter -N wan_lan
$IPT -t filter -N dmz_lan
$IPT -t filter -N dmz_wan
# dirotto il traffico FORWARD alle 6 catene create
echo "Dirotto il traffico Forward..."
$IPT -A FORWARD -i $LAN -o $DMZ -j lan_dmz
$IPT -A FORWARD -i $LAN -o $WAN -j lan_wan
$IPT -A FORWARD -i $WAN -o $DMZ -j wan_dmz
$IPT -A FORWARD -i $WAN -o $LAN -j wan_lan
$IPT -A FORWARD -i $DMZ -o $LAN -j dmz_lan
$IPT -A FORWARD -i $DMZ -o $WAN -j dmz_wan
# Catena lan_dmz con antispoofing
echo "Catena lan_dmz..."
$IPT -t filter -A lan_dmz -s ! $RANGE_IP_LAN -j DROP
$IPT -t filter -A lan_dmz -p udp -d 192.168.1.2 --dport 53 -j ACCEPT
$IPT -t filter -A lan_dmz -p tcp -d 192.168.1.2 --dport 53 -j ACCEPT
$IPT -t filter -A lan_dmz -p tcp -d 192.168.1.2 --dport 22 -j ACCEPT
# Catena dmz_lan
echo "Catena dmz_lan..."
$IPT -t filter -A dmz_lan -s ! $RANGE_IP_DMZ -j DROP
$IPT -t filter -A dmz_lan -m state --state ESTABLISHED,RELATED -j
ACCEPT
# Catena dmz_wan antipoofing
$IPT -t nat -A POSTROUTING -s $RANGE_IP_LAN -o $WAN -j MASQUERADE
Un aiutino?
Ciao a tutti!!!
Keres.

 eth2 -> DMZ (192.168.1.1).
O hai sbagliato a scrivere, (e hai sbagliato a progettare le subnet)
o io non ho tenuto in considerazione che tu possa avere direttamente
un indirizzo pubblico sulla porta wan.
Information related to '192.68.0.0 - 192.68.3.255'
inetnum:      192.68.0.0 - 192.68.3.255
netname:      KIEZ-68-0
descr:        Kiez.Net
descr:        Bartschiner Str. 52
descr:        12355 Berlin
country:      DE
-- 
           |Save our planet!
    Ciao   |Save wildlife!
   roberto |For your E-MAIL use ONLY recycled Bytes  !!
           |roberto poggi   
rpo...@softhome.net

 un indirizzo pubblico sulla porta wan.
xche' , che indirizzo ci vorresti sulla porta wan ???
-- 
L'amore ha diritto di essere disonesto e bugiardo.  --  Se e' sincero.

 
Tutti quelli che vuoi, visto che non si sa cosa c'e' di la' da quella
porta.
Un router?
Un modem ethernet?
Qualcosa che fa NAT, ad esempio, e' abbastanza usuale.
Sarebbe comunque un bel caso (e lui sarebbe abbastanza stupido, imho) se
avesse scelto la 192.168.0.x per la rete interna, avendo la 192.68.0.x
come indirizzo esterno.
Io farei confusione una volta si' e l'altra anche.


 Qualcosa che fa NAT, ad esempio, e' abbastanza usuale.
O_o .............
no' , fw con la dmz sulla porta wan HA degli indirizzi pubblici , senno' non
ha senso !
il resto sono accrocchi , mi spieghi come fa' se ha un router o cmq qualcosa
che fa' nat a pubblicare i servizi sulla dmz ???
configura il router x puntare sul fw e poi configura il fw ??????
-- 
E' stato chiesto a Stevie Wonder se per lui essere cieco era un problema.
Ha risposto: "Sempre meglio che essere negro!".

 
Bravo.
A volte, con alcuni fornitori di connettivita', e' piu' semplice fare
cosi', che litigare con enne livelli di call center per farsi variare
qualche settaggio nel _loro_ router.
Pero' mi piacerebbe che keres mi dicesse come stanno le cose. ;-)


 qualche settaggio nel _loro_ router.
se questa è la situazione a volte si fa' prima a cambiare gestore piuttosto
che fare una dmz che è assolutamente inutile.
poi degustibus.........
-- 
Una feature non e' niente di piu' di un bug con sufficiente anzianita'.

Scusatemi per la lunga assenza, ma ho avuto qualche altro problemino
da risolvere.
Io ho un router con IP pubblico sulla sua wan che è xxx.yyy.zzz.ttt.
Il router configurato a cazzo dai miei gestori internet ha ip
192.68.0.1 sulla sua eth0 e fà il nat delle porte da IP_pubbilco ->
ip_eth0.
Quindi dopo mille telefonate del cazzo mi sono fatto cambiare l'ip
interno del router a 
192.168.1.1/24
.
A questo punto la dichiarazione delle 3 schede di rete del firewall
diventa::
eth0 -> WAN (
192.168.1.2/24
);
eth1 -> LAN (
192.168.2.1/24
);
eth2 -> DMZ (
192.168.3.1/24
).
Quindi sul vecchio script ho apportato le modifiche:
IP_WAN="192.168.1.2"
IP_LAN="192.168.2.1"
IP_DMZ="192.168.3.1"
RANGE_IP_LAN="
192.168.1.0/24
"
RANGE_IP_DMZ="
192.168.3.0/24
"
RANGE_IP_WAN="
192.68.2.0/24
"
ho modificato lo script in modo che dalla lan si potesse accedere ad
internet (porta 80) e ai dns esterni (porta 53)
Quindi ho fatto un piccolo script.
#!/bin/bash
IPT=/usr/sbin/iptables
WAN="eth0"
LAN="eth1"
DMZ="eth2"
LO="lo"
IP_NET="192.68.0.3"
IP_LAN="192.168.0.1"
#IP_DMZ="192.168.20.1"
IP_LO="127.0.0.1"
RANGE_IP_LAN="
192.168.0.0/24
"
RANGE_IP_DMZ="
192.168.1.0/24
"
RANGE_IP_WAN="
192.68.0.0/24
"
#SERVER_WEB="192.168.20.20"
  #pulisco tutto
  $IPT -F
  $IPT -F INPUT
  $IPT -F OUTPUT
  $IPT -F FORWARD
  $IPT -F -t mangle
  $IPT -F -t nat
  $IPT -X
#imposto il comportamento di default
$IPT -P INPUT   DROP
$IPT -P OUTPUT  DROP
$IPT -P FORWARD DROP
# Genero le 6 catene di traffico
echo "Genero le catene di firewall..."
$IPT -t filter -N lan_wan
$IPT -t filter -N wan_lan
# dirotto il traffico FORWARD alle 6 catene create
echo "Dirotto il traffico Forward..."
$IPT -A FORWARD -i $LAN -o $WAN -j lan_wan
$IPT -A FORWARD -i $WAN -o $LAN -j wan_lan
# Catena lan_wan antispoofing
echo "Catena lan_wan..."
#$IPT -t filter -A lan_wan -s ! $RANGE_IP_LAN -j DROP
$IPT -t filter -A lan_wan -p tcp --dport 80 -j ACCEPT
$IPT -t filter -A lan_wan -p tcp --dport 53 -j ACCEPT
$IPT -t filter -A lan_wan -p udp --dport 53 -j ACCEPT
# Catena wan_lan antispoofing
echo "Catena wan_lan..."
#$IPT -t filter -A wan_lan -s $RANGE_IP_LAN -j DROP
$IPT -t filter -A wan_lan -m state --state ESTABLISHED,RELATED -j
ACCEPT
$IPT -t nat -A POSTROUTING -s $RANGE_IP_LAN -o $WAN -j MASQUERADE
La cosa bella è che questo script funziona a meraviglia!!! Ora ho
tutte le macchinezze che sono in lan connesse tranquillamente su
internet.
Ora però dovrei mettere il DNS interno sulla DMZ e far in modo che i
client sulla lan facciano richieste sulla server in DMZ e questo poi
faccia richieste verso Internet...
Accetto cosigli e suggerimenti, cmq ora ho il morale leggermente meno
a terra :-)
Ciao!!!

 RANGE_IP_WAN="
192.68.2.0/24
"
Prima di proseguire, mettiti d'accordo con le subnet, che hai mescolato
come un frullato di IPV4.
E hai lasciato il 192.68 qua e la'.



Mi sono accorto e chiedo scusa... Ho postato un mix di script tra
quello vecchio (192.68.xxxx) e quello nuovo.... distrazione...

Chiedi in anticipo scusa a tutti, non vorrei sembrare uno scocciatore
che magari cerca la pappa già fatta.
Ho portato avanti il mio firewall e ho installato un server di prova
con i classici server (ssh, qmail_smtp, qmail_pop3, apache) porte 22,
25, 110, 80. Il server ha come indirizzo 192.168.3.254. Il gateway del
server, ovvero l'ip della DMZ del firewall, 192.168.3.1. Dal firewall
(senza regole iptables caricate) e dal server stesso ottengo risopsta
ai ping e a prove incrociate di ssh.
Poi ho controllato per scrupolo (mettendo temporaneamente il server
subito dietro il router) che dall'esterno possa raggiungere la porta
22, 25, 110 e 80 verso l'ip 192.168.1.2 e anche quà tutto funziona.
Quindi ora sono sicuro che da XXX.YYY.ZZZ.TTT <=> 192.168.1.2 (scambio
di dati).
Ho modificato lo script di firewall e un pò perfezionato::
#!/bin/bash
IPT=/usr/sbin/iptables
WAN="eth0"
LAN="eth1"
DMZ="eth2"
LO="lo"
IP_WAN="192.168.1.2"
IP_LAN="192.168.2.1"
IP_DMZ="192.168.3.1"
IP_LO="127.0.0.1"
RANGE_IP_LAN="
192.168.2.0/24
"
RANGE_IP_DMZ="
192.168.3.0/24
"
RANGE_IP_WAN="
192.168.1.0/24
"
WEB_SERVER="192.168.3.254"
SMTP_SERVER="192.168.3.254"
POP_SERVER="192.168.3.254"
SSH_SERVER="192.168.3.254"
pulisco()
{
  #pulisco tutto
  $IPT -F
  $IPT -F INPUT
  $IPT -F OUTPUT
  $IPT -F FORWARD
  $IPT -F -t mangle
  $IPT -F -t nat
  $IPT -X
}
accept_all()
{
  $IPT -P INPUT   ACCEPT
  $IPT -P OUTPUT  ACCEPT
  $IPT -P FORWARD DROP
}
drop_all()
{
  #imposto il comportamento di default
  $IPT -P INPUT   DROP
  $IPT -P OUTPUT  DROP
  $IPT -P FORWARD DROP
}
firewall_on()
{
  pulisco
  drop_all
  # Genero le 6 catene di traffico
  echo "Genero le catene di firewall..."
  $IPT -t filter -N lan_wan
  $IPT -t filter -N wan_lan
  $IPT -t filter -N dmz_wan
  $IPT -t filter -N wan_dmz
  # dirotto il traffico FORWARD alle 6 catene create
  echo "Dirotto il traffico Forward..."
  $IPT -A FORWARD -i $LAN -o $WAN -j lan_wan
  $IPT -A FORWARD -i $WAN -o $LAN -j wan_lan
  $IPT -A FORWARD -i $DMZ -o $WAN -j dmz_wan
  $IPT -A FORWARD -i $WAN -o $DMZ -j wan_dmz
  # Catena lan_wan antispoofing
  echo "Catena lan_wan..."
  $IPT -t filter -A lan_wan -s ! $RANGE_IP_LAN  -j DROP
  $IPT -t filter -A lan_wan -p tcp --dport 80   -j ACCEPT
  $IPT -t filter -A lan_wan -p tcp --dport 443  -j ACCEPT
  $IPT -t filter -A lan_wan -p tcp --dport 53   -j ACCEPT
  $IPT -t filter -A lan_wan -p udp --dport 53   -j ACCEPT
  $IPT -t filter -A lan_wan -p tcp --dport 6667 -j ACCEPT
  $IPT -t filter -A lan_wan -p tcp --dport 1863 -j ACCEPT
  # Catena wan_lan antispoofing
  echo "Catena wan_lan..."
  #$IPT -t filter -A wan_lan -s $RANGE_IP_LAN -j DROP
  $IPT -t filter -A wan_lan -m state --state ESTABLISHED,RELATED -j
ACCEPT
  $IPT -t nat -A POSTROUTING -s $RANGE_IP_LAN -o $WAN -j MASQUERADE
  # Catena dmz_wan
  echo "Catena dmz_wan..."
  # $IPT -t filter -A dmz_wan -s ! $RANGE_IP_DMZ  -j DROP
  $IPT -t filter -A dmz_wan -m state --state NEW,ESTABLISHED,RELATED -
j ACCEPT
  # Catena wan_dmz
  echo "Catena wan_dmz..."
  # $IPT -t filter -A wan_dmz -s $RANGE_IP_LAN -j DROP
  # $IPT -t filter -A wan_dmz -s $RANGE_IP_WAN -j DROP
  $IPT -t filter -A wan_dmz -p tcp -d $WEB_SERVER  --dport 80  -j
ACCEPT
  $IPT -t filter -A wan_dmz -p tcp -d $SMTP_SERVER --dport 25  -j
ACCEPT
  $IPT -t filter -A wan_dmz -p tcp -d $POP_SERVER  --dport 110 -j
ACCEPT
  $IPT -t filter -A wan_dmz -p tcp -d $SSH_SERVER  --dport 22  -j
ACCEPT
}
case "$1" in
'start')
  firewall_on
  ;;
'stop')
  pulisco
  accept_all
 ;;
'restart')
  pulisco
  accept_all
  firewall_on
;;
*)
  echo "Usage $0 start|stop|restart"
esac
Ora, purtroppo, dall'esterno non riesco ad accedere via SSH (e alle
altre porte) al mio server posto dietro alla DMZ. Non vorrei aver
sbagliato totalmente queste regole di iptables::
  $IPT -t filter -A wan_dmz -p tcp -d $WEB_SERVER  --dport 80  -j
ACCEPT
  $IPT -t filter -A wan_dmz -p tcp -d $SMTP_SERVER --dport 25  -j
ACCEPT
  $IPT -t filter -A wan_dmz -p tcp -d $POP_SERVER  --dport 110 -j
ACCEPT
  $IPT -t filter -A wan_dmz -p tcp -d $SSH_SERVER  --dport 22  -j
ACCEPT
Non dovrei fare una regola del tipo:: Accetta tutto il traffico che ti
arriva in ingresso sulla eth0 porta 22 e spediscilo al server ssh.
Quindi la regola dovrebbe diventare:
  $IPT -t filter -A wan_dmz -p tcp -s eth0 -d $SSH_SERVER  --dport 22
-j ACCEPT
Sapreste indicarmi dove commetto l'errore?
Ciao a tutti e grazie ancora.
K.