Pagina 1 di 1

Rispondete Perfavore, Non e' Difficile - IPTables

Inviato: sab 18 mar 2006, 19:48
da Riddick
Ciao a tutti.
Io ho un server Slackware 10.2 che fa da gateway per il mio network, via un firewall
SEMPLICISSIMO di IPTables.

Eccolo qui:

Codice: Seleziona tutto

#!/bin/sh

#  IPTABLES  FIREWALL  script for the Linux 2.4 kernel.
#  This script is a derivitive of the script presented in
#  the IP Masquerade HOWTO page at:
#  www.tldp.org/HOWTO/IP-Masquerade-HOWTO/stronger-firewall-examples.html
#  It was simplified to coincide with the configuration of
#  the sample system presented in the Guides section of
#  www.aboutdebian.com
#
#  This script is presented as an example for testing ONLY
#  and should not be used on a production firewall server.
#
#    PLEASE SET THE USER VARIABLES
#    IN SECTIONS A AND B OR C

echo -e "\n\nSETTING UP IPTABLES FIREWALL..."


# === SECTION A
# -----------   FOR EVERYONE 

# SET THE INTERFACE DESIGNATION AND ADDRESS AND NETWORK ADDRESS
# FOR THE NIC CONNECTED TO YOUR _INTERNAL_ NETWORK
#   The default value below is for "eth0".  This value 
#   could also be "eth1" if you have TWO NICs in your system.
#   You can use the ifconfig command to list the interfaces
#   on your system.  The internal interface will likely have
#   have an address that is in one of the private IP address
#   ranges.
#       Note that this is an interface DESIGNATION - not
#       the IP address of the interface.

# Enter the designation for the Internal Interface's
INTIF="eth1"

# Enter the NETWORK address the Internal Interface is on
INTNET="192.168.0.0/24"

# Enter the IP address of the Internal Interface
INTIP="192.168.0.1/24"



# SET THE INTERFACE DESIGNATION FOR YOUR "EXTERNAL" (INTERNET) CONNECTION
#   The default value below is "ppp0" which is appropriate 
#   for a MODEM connection.
#   If you have two NICs in your system change this value
#   to "eth0" or "eth1" (whichever is opposite of the value
#   set for INTIF above).  This would be the NIC connected
#   to your cable or DSL modem (WITHOUT a cable/DSL router).
#       Note that this is an interface DESIGNATION - not
#       the IP address of the interface.
#   Enter the external interface's designation for the
#   EXTIF variable:

EXTIF="eth0"


# ! ! ! ! !  Use ONLY Section B  *OR*  Section C depending on
#  ! ! ! !   the type of Internet connection you have.
# ! ! ! ! !  Uncomment ONLY ONE of the EXTIP statements.


# === SECTION B
# -----------   FOR THOSE WITH STATIC PUBLIC IP ADDRESSES

   # SET YOUR EXTERNAL IP ADDRESS
   #   If you specified a NIC (i.e. "eth0" or "eth1" for
   #   the external interface (EXTIF) variable above,
   #   AND if that external NIC is configured with a
   #   static, public IP address (assigned by your ISP),
   #   UNCOMMENT the following EXTIP line and enter the
   #   IP address for the EXTIP variable:

#EXTIP="your.static.IP.address"



# === SECTION C
# ----------   DIAL-UP MODEM, AND RESIDENTIAL CABLE-MODEM/DSL (Dynamic IP) USERS


# SET YOUR EXTERNAL INTERFACE FOR DYNAMIC IP ADDRESSING
#   If you get your IP address dynamically from SLIP, PPP,
#   BOOTP, or DHCP, UNCOMMENT the command below.
#   (No values have to be entered.)
#         Note that if you are uncommenting these lines then
#         the EXTIP line in Section B must be commented out.

EXTIP="`/sbin/ifconfig eth0 | grep 'inet addr' | awk '{print $2}' | sed -e 's/.*://'`"


# --------  No more variable setting beyond this point  --------


echo "Loading required stateful/NAT kernel modules..."

/sbin/depmod -a
/sbin/modprobe ip_tables
/sbin/modprobe ip_conntrack
/sbin/modprobe ip_conntrack_ftp
/sbin/modprobe ip_conntrack_irc
/sbin/modprobe iptable_nat
/sbin/modprobe ip_nat_ftp
/sbin/modprobe ip_nat_irc

echo "    Enabling IP forwarding..."
echo "1" > /proc/sys/net/ipv4/ip_forward
echo "1" > /proc/sys/net/ipv4/ip_dynaddr

echo "    External interface: $EXTIF"
echo "       External interface IP address is: $EXTIP"
echo "    Loading firewall server rules..."

UNIVERSE="0.0.0.0/0"

# Clear any existing rules and setting default policy to DROP
iptables -P INPUT DROP
iptables -F INPUT 
iptables -P OUTPUT DROP
iptables -F OUTPUT 
iptables -P FORWARD DROP
iptables -F FORWARD 
iptables -F -t nat

# Flush the user chain.. if it exists
if [ "`iptables -L | grep drop-and-log-it`" ]; then
   iptables -F drop-and-log-it
fi

# Delete all User-specified chains
iptables -X

# Reset all IPTABLES counters
iptables -Z

# Creating a DROP chain
iptables -N drop-and-log-it
iptables -A drop-and-log-it -j LOG --log-level info 
iptables -A drop-and-log-it -j REJECT

echo -e "     - Loading INPUT rulesets"

#######################################################################
# INPUT: Incoming traffic from various interfaces.  All rulesets are 
#        already flushed and set to a default policy of DROP. 
#

# loopback interfaces are valid.
iptables -A INPUT -i lo -s $UNIVERSE -d $UNIVERSE -j ACCEPT

# local interface, local machines, going anywhere is valid
iptables -A INPUT -i $INTIF -s $INTNET -d $UNIVERSE -j ACCEPT

# allow dhcp traffic
iptables -A INPUT -i $INTIF -p udp --sport 68 --dport 67 -j ACCEPT
#iptables -A INPUT -i $INTIF -p udp --dport 68 --sport 67 -j ACCEPT

# remote interface, claiming to be local machines, IP spoofing, get lost
iptables -A INPUT -i $EXTIF -s $INTNET -d $UNIVERSE -j drop-and-log-it

# remote interface, any source, going to permanent PPP address is valid
iptables -A INPUT -i $EXTIF -s $UNIVERSE -d $EXTIP -j ACCEPT


#Stop Telnet server
iptables -A INPUT -i $EXTIF -p tcp -s $UNIVERSE --dport 23  -j drop-and-log-it

#Stop SMTP server
iptables -A INPUT -i $EXTIF -p tcp -s $UNIVERSE --dport 25 -j drop-and-log-it

# Allow any related traffic coming back to the MASQ server in
iptables -A INPUT -i $EXTIF -s $UNIVERSE -d $EXTIP -m state --state ESTABLISHED,RELATED -j ACCEPT

#Matteo's BitTorrent Rule
#iptables -A INPUT -i $EXTIF -s $UNIVERSE -d 192.168.0.10 -p tcp -sport 6881 -j accept

#  OPTIONAL:  Uncomment the following two commands if plan on running
#             an Apache Web site on the firewall server itself
#
#echo -e "      - Allowing EXTERNAL access to the WWW server"
#iptables -A INPUT -i $EXTIF -m state --state NEW,ESTABLISHED,RELATED -p tcp -s $UNIVERSE -d $EXTIP --dport 80 -j ACCEPT

# Catch all rule, all other incoming is denied and logged. 
iptables -A INPUT -s $UNIVERSE -d $UNIVERSE -j drop-and-log-it


echo -e "     - Loading OUTPUT rulesets"

#######################################################################
# OUTPUT: Outgoing traffic from various interfaces.  All rulesets are 
#         already flushed and set to a default policy of DROP. 
#

# loopback interface is valid.
iptables -A OUTPUT -o lo -s $UNIVERSE -d $UNIVERSE -j ACCEPT

# local interfaces, any source going to local net is valid
iptables -A OUTPUT -o $INTIF -s $EXTIP -d $INTNET -j ACCEPT

# local interface, any source going to local net is valid
iptables -A OUTPUT -o $INTIF -s $INTIP -d $INTNET -j ACCEPT

# allow dhcp traffic
iptables -A OUTPUT -o $INTIF -p udp --dport 68 --sport 67 -j ACCEPT
#iptables -A OUTPUT -o $INTIF -p udp --dport 67 --sport 68 -j ACCEPT

#Matteo to internet
#iptables -A OUTPUT -o $INTIF -p udp

# outgoing to local net on remote interface, stuffed routing, deny
iptables -A OUTPUT -o $EXTIF -s $UNIVERSE -d $INTNET -j drop-and-log-it

# anything else outgoing on remote interface is valid
iptables -A OUTPUT -o $EXTIF -s $EXTIP -d $UNIVERSE -j ACCEPT

# Catch all rule, all other outgoing is denied and logged. 
iptables -A OUTPUT -s $UNIVERSE -d $UNIVERSE -j drop-and-log-it


echo -e "     - Loading FORWARD rulesets"

#######################################################################
# FORWARD: Enable Forwarding and thus IPMASQ
#          Allow all connections OUT and only existing/related IN

iptables -A FORWARD -i $EXTIF -o $INTIF -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i $INTIF -o $EXTIF -j ACCEPT

# Catch all rule, all other forwarding is denied and logged. 
iptables -A FORWARD -j drop-and-log-it

# Enable SNAT (MASQUERADE) functionality on $EXTIF
iptables -t nat -A POSTROUTING -o $EXTIF -j SNAT --to $EXTIP

echo -e "    Firewall server rule loading complete\n\n"

Allora, come avee visto, ho provato a blocare varie cose:

Codice: Seleziona tutto

#Stop Telnet server
iptables -A INPUT -i $EXTIF -p tcp -s $UNIVERSE --dport 23  -j drop-and-log-it

#Stop SMTP server
iptables -A INPUT -i $EXTIF -p tcp -s $UNIVERSE --dport 25 -j drop-and-log-it
perche il scanner a GRC mi dice che 23 e 25 (entro altri) sono aperti.
I due rules che ho li sopra non fanno niente - ancora dice che sono aperti.

Mi potete dire come cambiare qulle linee per farle blockare i requests SMTP e Telnet al mio server?

E se avete altre cosa da dirmi per migliorare il firewall, sarei contento di sentirle!

-Riddick

Inviato: sab 18 mar 2006, 22:13
da DaNiMoTh
Ma ti sembra un topic serio, al di la` della complessita` della soluzione?

Comunque, sostituisci

Codice: Seleziona tutto

iptables -A drop-and-log-it -j REJECT
con

Codice: Seleziona tutto

iptables -A drop-and-log-it -j DROP
e vedrai che non ti verra` piu` segnalato come aperto ( anche se non e` vero )

ciao

Re: Rispondete Perfavore, Non e' Difficile - IPTables

Inviato: sab 18 mar 2006, 22:18
da masalapianta
Riddick ha scritto: perche il scanner a GRC
rotfl!
mi dice che 23 e 25 (entro altri) sono aperti.
I due rules che ho li sopra non fanno niente - ancora dice che sono aperti.
perche' nella stessa catena c'e' una regola, precedente alle due in questione, che matcha i pacchetti che le due regole in questione dovrebbero droppare e loggare e ha come target ACCEPT; nella fattispecie la regola e':

iptables -A INPUT -i $EXTIF -s $UNIVERSE -d $EXTIP -j ACCEPT
E se avete altre cosa da dirmi per migliorare il firewall, sarei contento di sentirle!
lascia perdere il firewall, se proprio vuoi metterne uno (anche se non serve a niente per una lan casalinga), prima studiati bene i protocolli su cui andrai a lavorare, poi studiati bene netfilter.

Inviato: sab 18 mar 2006, 22:49
da Riddick
scusate il title cretino, era uno diverso, ma non rispondeva nessuno!

Allora, la regola

Codice: Seleziona tutto

iptables -A INPUT -i $EXTIF -s $UNIVERSE -d $EXTIP -j ACCEPT 
Fa entrare tutto il traffico che non spoofa - questo andrebbe bene se fosse
possibile specificare delle regole che sono eccezioni a questa regola
(i.e. SMTP e TELNET). E possibile fare quello che chiedo?

Grazie delle risposte!

Riddick

Inviato: sab 18 mar 2006, 22:53
da masalapianta
dalle tue domande si capisce abbastanza bene che non hai la benche' minima idea di come funzioni netfilter e siccome ritengo sia dannoso dare soluzioni precotte se chi ha il problema non le comprende, preferisco rimandarti ad una lettura attenta della documentazione su iptables.

Inviato: sab 18 mar 2006, 23:28
da Riddick
...o provare a spiegarmi un po come stanno le cose?
intanto leggo IPTables

Riddick

Inviato: dom 19 mar 2006, 0:06
da masalapianta
Riddick ha scritto:...o provare a spiegarmi un po come stanno le cose?
semplificando molto: quando un pacchetto viene passato a netfilter, quest'ultimo, a seconda delle regole impostate tramite il tool userspace iptables, fa passare il pacchetto attraverso una o piu' catene (una catena non e' altro che un insieme di regole che vengono applicate una dopo l'altra sempre nello stesso ordine) e se una regola della catena matcha il pacchetto, netfilter applica al pacchetto il target (che non e' altro che un'azione da intraprendere) specificato nella regola; nel caso del target ACCEPT (ma non solo per questo target) l'elaborazione della catena si interrompe alla regola matchata e il pacchetto viene recapitato dove deve andare (ad esempio nel caso d'un pacchetto tcp con ip e porta di destinazione locali, viene controllato quale processo ha fatto bind su quel ip e porta e il pacchetto vien passato in userspace al processo in questione) senza proseguire a verificare le regole successive nella catena; quindi nel tuo caso se arriva un pacchetto con ip di destinazione locale e porta 23 (il caso dei pacchetti telnet che volevi bloccare), il pacchetto, dopo aver attraversato la catena PREROUTING, attraversa la catena INPUT dove trova la regola:
iptables -A INPUT -i $EXTIF -s $UNIVERSE -d $EXTIP -j ACCEPT
e li si ferma l'elaborazione della catena, quindi non arriva alle due regole successive che hai impostato per bloccare i pacchetti tcp con destinazione locale verso le porte 23 e 25.
Con questo tipo di sistemi di packet filtering gli approcci son due:

1) accettare tutto quello che non viene esplicitamente bloccato
2) bloccare tutto quello che non viene esplicitamente accettato

il primo sistema ha come vantaggio che, anche tirando su nuovi demoni di rete o quant'altro, funzionera' sempre tutto, e sara' demandato a te il dover bloccare esplicitamente tutto quello che non vuoi; ovviamente tale approccio e' molto poco sicuro (qualcosa sfugge sempre) e molto poco pratico (e' molto piu' semplice dire cosa accettare che dire tutto quello che va bloccato).
Il secondo sistema e' ovviamente il migliore, anche se ogni volta che deve passare qualcosa di non previsto bisogna esplicitamente autorizzarlo.
A questo punto e' banale implementare i due metodi con il sistema di packet filtering suddetto:

per applicare il primo metodo ad una catena basta usare ACCEPT come policy predefinita per quella catena e aggiungere in sequenza tutte le regole, per quella catena, relative ai pacchetti che vogliamo bloccare; per applicare il secondo metodo si usa come policy predefinita della catena DROP o REJECT e poi si aggiungono in sequenza tutte le regole, per quella catena, relative ai pacchetti che vogliamo accettare.

Inviato: dom 19 mar 2006, 22:04
da Riddick
fantastico! Grazie dela spiegazione! Ho anche capito perchè si chiamano catene!
Mi sa che per il input faro' bloco di tutto meno le eccezioni per tutto traffico da
fuori che voule entrare...

Grazie mille,
Riddick

Inviato: lun 20 mar 2006, 1:31
da masalapianta
Riddick ha scritto:fantastico! Grazie dela spiegazione!
figurati, per una volta che non becco uno che vuol far fare il lavoro per cui vien pagato a degli appassionati su un forum o uno che vuole la soluzione precotta (manco lo chiedesse ad un helpdesk di supporto che paga), son ben felice di dare una mano; se vuoi approfondire su http://www.netfilter.org trovi tutta la documentazione che vuoi su netfilter e il tool userspace per configurarlo (iptables)
Ho anche capito perchè si chiamano catene!
Mi sa che per il input faro' bloco di tutto meno le eccezioni per tutto traffico da
fuori che voule entrare...
e' la soluzione migliore, ma occhio che presuppone che tu conosca bene i protocolli su cui andrai a lavorare (ho visto gente fare cose innominabili, tipo bloccare tutti gli icmp in entrata fuorche' gli echo reply)

Inviato: mar 21 mar 2006, 19:59
da beato_angelico256
masalapianta ha scritto: presuppone che tu conosca bene i protocolli su cui andrai a lavorare (ho visto gente fare cose innominabili, tipo bloccare tutti gli icmp in entrata fuorche' gli echo reply)
conosci un sito dove trovare buona documentazione su un bel numero di protocolli ( senza andare a googlare uno per uno ) ?