Newsgroup: it.comp.os.linux.sys
Titolo: iptables e sottoreti, dove sbaglio?

ho tre reti, 10.0.0.0, 10.1.0.0 e 10.2.0.0.
ho messo un firewall iptables con linux con due schede di rete, eth0,
la locale, 10.0.0.155 di ip, e la pubblica, su adsl telecom, con
80.x.y.z (per motivi di privacy non metto i veri ip).
al router 10.0.0.1 si attestano le due sottoreti 10.1.0.0 e 10.2.0.0
tuttavia con questo script che metto di seguito, non riesco a capire
come mai un client della rete 10.1.0.0 non riesce a navigare su
internet...
dove sbaglio?
#!/bin/sh
##########################################################################
##
##
##  Descrizione : Implementazione di un  packet filtering firewall
##
##                basato su iptables
##
##
##
##   - Data di creazione        :  8/12/01
##
##
##
##   - Autore                   :
##
##
##
##   - mailto                   :
##
##
##
##########################################################################
#
#
# /etc/firewall_rules
#
#   user/group: root/root
#
#   permessi : 700
#
#
#
##########################################################################
##########################################################################
# Schema a blocchi delle ipchain (sequenza operativa del kernel >
2.3.15)#
##########################################################################
#                            _____
#
#  Incoming                 /     \         Outgoing
#
#         -->[Routing ]--->|FORWARD|------->
#
#            [Decision]     \_____/        ^
#
#                 |                        |
#
#                 v                       ____
#
#                ___                     /    \
#
#               /   \                   |OUTPUT|
#
#              |INPUT|                   \____/
#
#               \___/                      ^
#
#                 |                        |
#
#                  ----> Local Process ----
#
##########################################################################
# A chain is a checklist of rules.  Each rule says `if the packet
header #
# looks like this, then here's what to do with the packet'.  If the
rule #
# doesn't match the packet, then the next rule in the chain is
#
# consulted.  Finally, if there are no more rules to consult, then the
#
# kernel looks at the chain policy to decide what to do.  In a
security- #
# conscious system, this policy usually tells the kernel to DROP the
#
# packet.
#
#
#
#
#
#
#
# 1. When a packet comes in (say, through the Ethernet card) the
kernel  #
#    first looks at the destination of the packet: this is called
#
#    `routing'.
#
#
#
# 2. If it's destined for this box, the packet passes downwards in the
#
#    diagram, to the INPUT chain.  If it passes this, any processes
#
#    waiting for that packet will receive it.
#
#
#
# 3. Otherwise, if the kernel does not have forwarding enabled, or it
#
#    doesn't know how to forward the packet, the packet is dropped.
If  #
#    forwarding is enabled, and the packet is destined for another
#
#    network interface (if you have another one), then the packet goes
#
#    rightwards on our diagram to the FORWARD chain.  If it is
ACCEPTed, #
#    it will be sent out.
#
#
#
# 4. Finally, a program running on the box can send network packets.
#
#    These packets pass through the OUTPUT chain immediately: if it
says #
#    ACCEPT, then the packet continues out to whatever interface it is
#
#    destined for.
#
#
#
# Packets traversing the INPUT chain don't have an output interface,
so  #
# any rule using `-o' in this chain will never match.  Similarly,
#
# packets traversing the OUTPUT chain don't have an input interface,
so  #
# any rule using `-i' in this chain will never match.
#
# Only packets traversing the FORWARD chain have both an input and
#
# output interface.
#
#
#
##########################################################################
##########################################################################
########### Set-up Environment
IPTABLES="/sbin/iptables"
# Mi assicuro che il packet forwarding venga abilitato
echo "1" > /proc/sys/net/ipv4/ip_forward
# Abilito il supporto per la gestione dinamica dell'ip
echo "1" > /proc/sys/net/ipv4/ip_dynaddr
# Abilito il supporto per i syncookies
echo "1" >/proc/sys/net/ipv4/tcp_syncookies
# Abilito le contromisure antispoofing a livello di kernel
# loggo i tentativi di spoofing
for file in /proc/sys/net/ipv4/conf/*/rp_filter; do echo "1" >
$file;done
# Disabilito la risposta al ping
/bin/echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_all
# Disabilito la risposta ai  broadcasts
/bin/echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
# Don't accept source routed packets. Attackers can use source routing
to
generate
# traffic pretending to be from inside your network, but which is
routed
back along
# the path from which it came, namely outside, so attackers can
compromise
your
# network. Source routing is rarely used for legitimate purposes.
/bin/echo "0" > /proc/sys/net/ipv4/conf/all/accept_source_route
# Disable ICMP redirect acceptance. ICMP redirects can be used to
alter your
routing
# tables, possibly to a bad end.
/bin/echo "0" > /proc/sys/net/ipv4/conf/all/accept_redirects
# Enable bad error message protection.
/bin/echo "1" > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
# Log spoofed packets, source routed packets, redirect packets.
/bin/echo "1" > /proc/sys/net/ipv4/conf/all/log_martians
# Avvio la connessione ADSL (sta riga va spostata)
#adsl-start
# EXT: Indirizzo IP ed interfaccia esterni del firewall
#extip="`/sbin/ifconfig ppp0 | grep 'inet addr' | awk '{print $2}' |
sed -e
's/.*://'`"
#extint="ppp0"
# INT: Indirizzo IP, interfaccia e rete interni del firewall
extip="80.x.y.z"
extint="eth1"
intip="10.0.0.155"
intint="eth0"
intnet="
10.0.0.0/8
"
#Servizi di rete
dnsservers=( 151.1.2.1 151.1.1.1 )
########### Fine Set-up Environment
##########################################################################
##########################################################################
########### Procedura di Startup del firewall
echo "  Starting up..."
# Elimino tutte le regole
$IPTABLES -F
$IPTABLES -F INPUT
$IPTABLES -F OUTPUT
$IPTABLES -F FORWARD
$IPTABLES -F -t mangle
$IPTABLES -F -t nat
$IPTABLES -X
############################
$IPTABLES -P INPUT DROP
$IPTABLES -P FORWARD DROP
$IPTABLES -P OUTPUT DROP
###########################
# Queste 3 regole verranno eliminate a firewall configurato
# durante il setup vietano qualunque attivita'
$IPTABLES -I INPUT 1 -j REJECT
$IPTABLES -I OUTPUT 1 -j REJECT
$IPTABLES -I FORWARD 1 -j REJECT
# Consento le comunicazioni attraverso il loopback
$IPTABLES -A INPUT -i lo  -j ACCEPT
$IPTABLES -A OUTPUT -o lo -j ACCEPT
# Setto le policy delle chains
$IPTABLES --policy INPUT           DROP
$IPTABLES --policy OUTPUT          ACCEPT
$IPTABLES --policy FORWARD         DROP
########### FINE Procedura di Startup del firewall
##########################################################################
##########################################################################
########### Regole per consentire ssh sul firewall
echo "  Attivazione ssh..."
# Consento una connessione ssh su firewall dalla rete  locale
$IPTABLES -A INPUT -i $intint -p tcp -s $intnet --sport 1023:65535  -d
$intip --dport 22 -j ACCEPT
$IPTABLES -A OUTPUT -o $intint -p tcp -d $intnet --dport 1023:65535 -s
$intip --sport 22 -j ACCEPT
########### Fine Regole per consentire ssh sul firewall
##########################################################################
$IPTABLES -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
##########################################################################
########### Masquerading della rete interna
echo "  Masquerading della rete interna..."
$IPTABLES  -t nat -A POSTROUTING -o $extint -s $intnet -j MASQUERADE
########### Fine Masquerading della rete interna
##########################################################################
##########################################################################
########### Stateful forwarding della rete interna
echo "  Stateful forwarding della rete interna..."
#$IPTABLES -A FORWARD -o $extint -j DROP
$IPTABLES -A INPUT -i eth1 -p tcp --sport 80 -m state --state
ESTABLISHED -j
ACCEPT
$IPTABLES -A OUTPUT -o eth1 -p tcp --dport 80 -m state --state
NEW,ESTABLISHED -j ACCEPT
$IPTABLES -A FORWARD -i eth1 -p tcp --sport 80 -m state --state
ESTABLISHED -j ACCEPT
$IPTABLES -A FORWARD -o eth1 -p tcp --dport 80 -m state --state
NEW,ESTABLISHED -j ACCEPT
$IPTABLES -A INPUT -i eth1 -p tcp --sport 25 -m state --state
ESTABLISHED -j
ACCEPT
$IPTABLES -A OUTPUT -o eth1 -p tcp --dport 25 -m state --state
NEW,ESTABLISHED -j ACCEPT
$IPTABLES -A FORWARD -i eth1 -p tcp --sport 25 -m state --state
ESTABLISHED -j ACCEPT
$IPTABLES -A FORWARD -o eth1 -p tcp --dport 25 -m state --state
NEW,ESTABLISHED -j ACCEPT
$IPTABLES -A INPUT -i eth1 -p tcp --sport 110 -m state --state
ESTABLISHED -j ACCEPT
$IPTABLES -A OUTPUT -o eth1 -p tcp --dport 110 -m state --state
NEW,ESTABLISHED -j ACCEPT
$IPTABLES -A FORWARD -i eth1 -p tcp --sport 110 -m state --state
ESTABLISHED -j ACCEPT
$IPTABLES -A FORWARD -o eth1 -p tcp --dport 110 -m state --state
NEW,ESTABLISHED -j ACCEPT
$IPTABLES -A INPUT -i eth1 -p udp --sport 53 -m state --state
ESTABLISHED -j
ACCEPT
$IPTABLES -A OUTPUT -o eth1 -p udp --dport 53 -m state --state
NEW,ESTABLISHED -j ACCEPT
$IPTABLES -A FORWARD -i eth1 -p udp --sport 53 -m state --state
ESTABLISHED -j ACCEPT
$IPTABLES -A FORWARD -o eth1 -p udp --dport 53 -m state --state
NEW,ESTABLISHED -j ACCEPT
$IPTABLES -A INPUT -i eth1 -p tcp --sport 443 -m state --state
ESTABLISHED -j ACCEPT
$IPTABLES -A OUTPUT -o eth1 -p tcp --dport 443 -m state --state
NEW,ESTABLISHED -j ACCEPT
$IPTABLES -A FORWARD -i eth1 -p tcp --sport 443 -m state --state
ESTABLISHED -j ACCEPT
$IPTABLES -A FORWARD -o eth1 -p tcp --dport 443 -m state --state
NEW,ESTABLISHED -j ACCEPT
########### Fine Stateful forwarding della rete interna
##########################################################################
##########################################################################
########### Sblocco delle chains
echo "  Sblocco delle chains..."
# A firewall configurato le chain vengono sbloccate
$IPTABLES -D INPUT 1
$IPTABLES -D OUTPUT 1
$IPTABLES -D FORWARD 1
########### FINE Sblocco delle chain
######Blocco Tutto
#La prossima catena verificherÃ  flags dei vari pacchetti per decidere
se
possano essere accettati oppure no. I flags sono
#degli speciali campi nell'header del pacchetto che servono a
precisarne la
funzione; quando facevo riferimento a Â«pacchetti
#SYNÂ» in realtÃ ntendevo dire Â«pacchetti con il flag SYN settatoÂ».
Queste
regole serviranno per proteggersi contro alcuni
#tipi di porscan, che usano particolari flags.
#Nota: l'opzione --tcp-flags accetta due parametri; il primo indica
quali
flags controllare, il secondo quali dovranno essere
#settati. --tcp-flags ALL SYN indica che dovranno essere controllati
tutti i
flags e solo il SYN dovrÃ ssere settato
$IPTABLES -N tcp_flags
$IPTABLES -A tcp_flags -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
$IPTABLES -A tcp_flags -p tcp --tcp-flags ALL ALL -j DROP
$IPTABLES -A tcp_flags -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j
DROP
$IPTABLES -A tcp_flags -p tcp --tcp-flags ALL NONE -j DROP
$IPTABLES -A tcp_flags -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
$IPTABLES -A tcp_flags -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
$IPTABLES -A tcp_flags -p tcp --tcp-flags FIN FIN -j DROP
$IPTABLES -A INPUT -s 10.0.0.241 -j DROP
$IPTABLES -A OUTPUT -d 10.0.0.241 -j DROP
##########################################################################
#echo "  Attivo Squid..."
#$IPTABLES -t nat -A PREROUTING -p tcp --dport 80 -i eth0 -j
REDIRECT --to-port 8080
##########################################################################

 iptables con linux con due schede di rete, eth0, la locale, 10.0.0.155
A prima vusta sembrerebbe che tu non abbia definito nessuna regola per la
rete 10.1.0.x ma solo per la 10.0.0.x
Comunque piu' tardi, quando mi saro' svegliato un po di piu' gli do un
occhiata
Marco

 dove sbaglio?
In varie cose.
Ad esempio, in tutto ciò *NON* compaiono da nessuna parte le subnet
 
10.1.0.0/16
 
10.2.0.0/16
e se non compaiono, ciccia.
Tra l'altro devono comparire in due punti, sia sul router che sulla linux
box: il router deve avere come default gateway l'indirizzo della linux box,
e la linux box deve gestire esplicitamente il routing (con iproute2) e il
nat (con iptables) per le reti
 
10.0.0.0/16
 
10.1.0.0/16
 
10.2.0.0/16
Ti consiglio spassionatamente una attenta lettura del lartc (Linux Advancing
Routing & Traffic Control HOWTO), con iproute2+iptables si possono fare cose
turpi.
Un altro errore è nell'usare uno script di questo tipo dato che non è
necessario e crea confusione. Soprattutto si vede che è stato costruito da
una persona alle prime armi nell'amministrazione di un sistema linux, che
non conosce le possibilità offerte dal SO:
- al posto di tutti i vari "echo" per settare variabili in /proc basta
  editare a modino il file /etc/sysctl.conf, serve proprio a questo;
- sempre a proposito degli "echo" è inutile un ciclo for che gestisca tutti
  gli rp_filter, basta mettere a 1 /proc/sys/net/ipv4/conf/default/rp_filter;
- per le regole di iptables non serve metterle in uno script, basta
  digitarle una volta per tutte e poi lanciare il comando
      service iptables save
  oppure
      /etc/init.d/iptables save active
  se si sta usando una Debian.
In questo modo tutto è pulito e soprattutto viene su automaticamente al
boot. E per duplicare la configurazione su un altra macchina basta copiare
il file /etc/sysctl.conf ed il file /etc/sysconfig/iptables (oppure il file
/var/lib/iptables/active se si usa una Debian).
Oltretutto qualsiasi modifica alle regole richiede solo un nuovo
	service iptables save
per essere salvata in maniera permanente, e non di andare ad editare uno
script per modificare la sequenza di start al boot, con conseguente rischio
di errori.
Poi setti delle policy di default per le chains, e questo è pericoloso: in
remoto *NON* puoi più fare un flush per azzerare le regole, in quanto il
flush *NON* modifica la policy di default, e se questa è DROP o REJECT sei
fregato ed in remoto non puoi più fare nulla. Molto meglio inserire un bel
DROP come ultima regola di una chain, che con il flush viene cancellato.
Infine non si dovrebbero mai, *MAI* usare regular expression per trovare i
device e gli indirizzi per il firewalling, è molto più sicuro inserirli a
manina: si ha il pieno controllo della situazione. Se si è paranoici
abbastanza da mettere su un firewall bisogna essere paranoici abbastanza da
curare anche questi particolari.
Ah, ultima cosa: icmp serve, serve eccome, e il suo supporto in iptables è
molto versatile, ad esempio puoi stabilire che il firewall lasci passare gli
echo-request delle macchine interne ma che gli echo-reply provenienti da
queste e diretti all'esterno non passino. Poi sarebbe meglio fare passare
mtu-discovery, e varie altre cose. Sempre con iptables e non settando
variabili in /proc, è più versatile.
Just my two cents.
-- 
Ciao da Villo  -  GPG public key available
                  Ferrara LUG 
http://ferrara.linux.it