Newsgroup: it.comp.os.linux.sys
Titolo: Firewall, iptables e DNS interno che non risolve dalla LAN.

Devo fare un piccolo firewall per un'azienda con 4 PC collegati ad
internet e in seguito effettuare dei log e dei controlli via dns e
squid. Sò che la cosa migliore è avere una macchina di firewall, una
macchina per il DNS e una macchina per squid, ma purtroppo devo fare
tutto in una sola macchina e estremamente datata...
Stò lavorando e testando CentOS 6.0 e mi sono creato uno script
iptables che:
- DROP su INPUT, OUTPUT e FORWARD;
- Genera la tabella LAN -> WAN (richieste verso internet: http, https,
pop3, pop3ssl, i map, imapssl, dns);
- Genera la tabella WAN -> LAN (risopste da Internet);
Fino a qui tutto bene. Ho impostato nel dhcp server come domani-name-
server l'ip di openDNS.
Ora ho installato bind nel firewall per fare il log delle richieste
DNS (esplicitamente richiesto) e quindi ho installato bind. Bind
lanciato senza le regole iptables và perfettamente. Poi ho aggiunto
altre regole al mio script:
- Genera la tabella FIREWALL -> Internet (richiede solo des);
- Genera la tabella Internet -> Firewall (risposte di DNS);
Ora il firewall è in grado di utilizzare il proprio BIND per risolvere
anche con lo script di iptables lanciato.
Le cose mi si complicano quando tento di far richiesta a BIND dai PC
della LAN. Ecco le regole che ho impostato:
# BIND LAN -> Firewall
$IPT -A INPUT -s $RANGE_IP_LAN -d $IP_FIREWALL_LAN -p tcp --dport 53 -
j ACCEPT
$IPT -A INPUT -s $RANGE_IP_LAN -d $IP_FIREWALL_LAN -p udp --dport 53 -
j ACCEPT
$IPT -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
Però con queste regole non ottengo risposta dal DNS :( Ho provato a
sostituire la porta 53/tcp con la porta 22/tcp e riesco
tranquillamente a fare una sessione SSH dalla lan verso il firewall.
Quindi molto probabilmente l'errore deve stare nell'istruzione di
output...
Qualche suggerimento?
Grazie a tutti, Keres.

Il problema sembra essere sulla configurazione di bind...

 Il problema sembra essere sulla configurazione di bind...
Tieni presente che le nuove versioni rispondono usando una porta random, 
non la 53


Eh?
-- 
Paranoia is a disease unto itself. And may I add: the person standing
next to you may not be who they appear to be, so take precaution.
-----------------------------------------------------------------------------
http://bofhskull.wordpress.com/

 Eh?
Ci manca solo ip_conntrack_bind...
-- 
ValeRyo
XT600 "Katoki Pajama" - 
http://www.slimmit.com/go.asp?7Y9
GamerTag: 
http://card.mygamercard.net/IT/nxe/ValeRyo76.png
 

 Eh?
  � stata una giornata calda....
  Ciao,
-- 
Alessandro Selli 
http://alessandro.route-add.net
AVVERTENZA: i messaggi inviati a "trappola" non mi arriveranno.
WARNING: messages sent to "trappola" will never reach me.


L'ho letto su topolino, true story!

> non la 53
 
Stiamo scherzando vero ?
-- 
----------------------------
se conosci slackware 
conosci linux
----------------------------


Mi sono sconfuso :(

Provo a scrivere qui senza aprire un nuovo post. La situazione è
sempre la solita ma in questo caso devo aggiungere il server proxy
squid sempre nella solita macchina. Ho installato e configurato squid
e lui fa il suo egregio lavoro. Ora però devo farlo lavorare anche
quando lo script di firewall è attivo.
Se imposto nel firewall il forwarding dei pacchetti tra le due schede
di rete ed imposto il server proxy nel client esso riesce a navigare
tranquillamente.
Poi ho provato ad aggiungere le seguenti righe ad iptables (per ora
voglio far funzionare la comunicazione tra i client in LAN e il server
proxy, poi mi occuperò di impostare l'altra parte di comunicazione)
(considerando che come sopra iptables parte da drop su INPUT OUTPUT e
FORWARD);
iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j DNAT --to
192.168.2.1:3128
iptables -A INPUT -s $RANGE_IP_LAN -d 192.168.2.1 -t tcp --dport 3128 -
j ACCEPT
iptables -A OUTPUT -p tcp --sport 3128 -j ACCEPT
Poi ho provato dal client a navigare e però non và e nei log di squid
non vedo nulla... Stessa cosa se imposto nel browser il server
proxy... In teoria anche se una richiesta non viene portata a buon
fine nel log di quid dovrei pur vedere la richiesta che il client
tenta di fare... Ho provato a fare anche un brutale telnet 192.168.2.1
3128 ma la connessione si chiude subito e non viene registrata nei log
di squid...
Qualche suggerimento? Sicuramente ho tralasciato qualche cosa di
importante. Forse quid non comunica con il client perché prima magari
vuole lui stesso aver l'accesso ad internet...

Dopo mille peripezie sono riuscito a far andare il tutto con queste
regole di iptables (devo ancora assottigliarle):
squid()
{
   echo -n "- Collego squid al firewall..."
   $IPT -t filter -N squid_in
   $IPT -t filter -N squid_out
   $IPT -t filter -A INPUT -j squid_in
   $IPT -t filter -A OUTPUT -j squid_out
   $IPT -t filter -A squid_in -s $RANGE_IP_LAN -d $IP_FIREWALL_LAN -p
tcp --dport 3128 -j ACCEPT
   $IPT -t filter -A squid_out -s $IP_FIREWALL_LAN -d $RANGE_IP_LAN -p
tcp  --sport 3128 -j ACCEPT
   $IPT -t filter -A squid_out -p tcp --dport 80 -j ACCEPT
   $IPT -t filter -A squid_in -p tcp --sport 80 -j ACCEPT
   $IPT -t nat -A PREROUTING -i $LAN -p tcp --dport 80 -j DNAT --to
$SQUID_SERVER:3128
   echo "Fatto!"
}
Ora quando vado a navigare ottengo sempre questo errore nel browser:
ERROR
The requested URL could not be retrieved
--------------------------------------------------------------------------------
Invalid Request error was encountered while trying to process the
request:
 GET / HTTP/1.1
Accept: text/html, application/xhtml+xml, */*
Accept-Language: it-IT
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/
5.0)
Accept-Encoding: gzip, deflate
Host: 
www.google.it
Connection: Keep-Alive
Cookie:
PREF=ID=a062d85e5b118366:U=bb3f1b9760510d8d:FF=0:TM=1310564237:LM=1310564310:S=X5RFCpZ9GNR-
Ho0Z; NID=48=hP_-
sGXspM_qZDCmu9FQa2IGAQSEvVz6OWdMFq7eCJdjeUAFV8wpU5c7PMBckxEb5GbsJanOuRm4d4S8mL1LJSg4WcHeI71Z7iE4NzqKFd2WgN_JKUI_rsqSKyvvcIHe
Some possible problems are:
 •
Missing or unknown request method.
 •
Missing URL.
 •
Missing HTTP Identifier (HTTP/1.0).
 •
Request is too large.
 •
Content-Length missing for POST or PUT requests.
 •
Illegal character in hostname; underscores are not allowed.
 •
HTTP/1.1 «Expect:» feature is being asked from an HTTP/1.0 software.
Infatti se vado a leggere il log access.log leggo: "GET NONE:// HTTP/
0.0" 400 2238 TCP_DENID:NONE

 importante. 
Con ogni probabilità non ti è chiaro il mestiere di un proxy applicativo, 
che è ben diverso da quello di un firewall livello 3/4.
Ciao
LG

Forse dovrei postare l'intero script di firewall. Con il dns ho
risolto facendo solo le richieste verso internet tralasciando al
momento il bind interno: mi sono arreso quando leggevo nei log una
marea di lame server, risposte non coerenti dai server interrogati e
problemi di connessione ai server stessi... :-(
Il problema è che vorrei configurare squid in maniera trasparente ma a
sua volta avrei bisogno che mi facesse una serie di controlli... Cmq
di squid ne ho già configurati ma non in maniera trasparente e questa
configurazione abbinata al firewall mi rende la vita difficile. Lo
devo fare in modalità trasparente perché purtroppo un CL sarebbe ben
capace di di togliere l'impostazione proxy e questo stesso CL stà
provocando mille problemi grossi come usare emule e bittorrent a
manetta, veedre film in stremino e tutto il necessario per far morire
la rete, tanto che i colleghi non riescono più ad usare il programma
"xyz" in remoto visto la carenza di banda internet... Potrei anche
togliere la modalità trasparente e impostarlo nei client, nel firewall
impedire la navigazione se non passa via proxy (togliendo 80 e 443
dalla catena LAN -> WAN). Penso che cmq sarebbe più "pulito" la
modalità trasparente...
Squid è così configurato:
http_port       
192.168.2.1:3128
icp_port                   3130
cache_access_log        /var/log/squid/access.log
cache_log               /var/log/squid/cache.log
cache_store_log         /var/log/squid/store.log
useragent_log           /var/log/squid/useragent.log
referer_log             /var/log/squid/referer.log
emulate_httpd_log       on
logfile_rotate          7
mime_table              /etc/squid/mime.conf
pid_filename            /var/run/squid.pid
cache_mem               128 MB
high_memory_warning     140 MB
cache_dir       ufs     /var/cache/squid 8192 16 256
cache_mgr               in...@lblablabla.bla
visible_hostname        firewall.blablabla.bla
append_domain           .blablabla.bla
cache_effective_user    squid
cache_effective_group   squid
acl deny_download url_regex -i ^http://.*\.(exe|src|bat|pif|com|sys|
reg|ini|inf)$   <-- Meraviglisa...
acl all src 
0.0.0.0/0.0.0.0
acl manager proto cache_object
acl localhost src 
127.0.0.1/255.255.255.255
acl locallans src 
192.168.2.0/255.255.255.0
acl to_localhost dst 
127.0.0.0/8
acl SSL_Ports port 443 563
acl Safe_ports port 80 443
acl CONNECT method CONNECT
http_access     deny    deny_download
http_access     allow   manager localhost
http_access     deny    manager
http_access     deny    !Safe_ports
http_access     deny    CONNECT !SSL_Ports
http_access     allow   locallans
http_access     deny    all
icp_access      deny    all
Quello che a me interessa troppo è quella meravigliosa stringa di
url_regex, anche se poi dovrei modificarla in modo tale che un
determinato IP la ignori completamente e che mi permetta di fare gli
aggiornamenti di windows e dell'antivirus...
Ciao, Keres.

 aggiornamenti di windows e dell'antivirus...
Per questo ti basta mettere un'altra acl PRIMA di quella che filtra gli 
eseguibili che faccia uscire direttamente alcune macchine o alcune regexp 
(esempio i domini relativi a windows update)
Rizio
--- Posted via news://
freenews.netfront.net/
 - Complaints to 
ne...@netfront.net
 ---

 capace di di togliere l'impostazione proxy
E tu configura il firewall in modo che se non passi dai proxy non navighi.
Non sei obbligato a farlo trasparente, se cambia le impostazioni poi non va 
da nessuna parte (ma ovviamente il forwarding sul firewall deve essere 
bloccato).
Con Squid puoi tranquillamente filtrare in base alle URL e alle estensioni 
dei file, anche creando delle blacklist su file separati, molto più comodi.
Detto questo, il tuo problema non risiede in ambito Linux, ma in ambito 
umano. Il CL in questione è il tuo vero problema, parlaci a brutto muso e 
spiegagli che sta creando problemi all'intero ufficio. Se non capisce, scala 
verso il suo capo.
Se in ufficio non avete ancora una policy scritta e sottoscritta sull'uso 
delle risorse informatiche, è ora di darsene una e farla rispettare.
Saluti
LG


Carissimo, questo firewall + proxy è stato richiesto dal mio capo ad
un suo cliente giusto perché proprio non riesce a far rispettare le
policy interne di CL e visto che non può neppure mandarlo via visto
che è un CL come mentalità ma è un DaBOSS essendo uno dei 3 soci...

 acl deny_download url_regex -i ^http://.*\.(exe|src|bat|pif|com|sys|reg|ini|inf)$   <-- Meraviglisa...
allora penso che gradirai questo:
grep "block_site" squid.conf
acl block_site url_regex -i ^http://.*(p0rn|s3x|amator1ale|y0ujizz|c4sino).*$
http_access deny block_site
Ciao :-)
Roberto Corrado
https://plus.google.com/116036060880930083817

Domani mattina faccio un riepilogo perché devo aver fatto qualche
grosso casino... Non mi và più nulla :-(

Ecco lo script di firewall completo...
#!/bin/bash
# Script di firewall
# by Keres Contorni 2008 2011. Copirights, all rights reserved.
# Sviluppato ed adattato per la rete interna dei dottori...
# Definizione di iptables
IPT=/sbin/iptables
# Definizione delle variabili globali
WAN="eth0"
LAN="eth1"
RANGE_IP_LAN="
192.168.2.0/24
"
IP_FIREWALL_WAN="192.168.0.206"
IP_FIREWALL_LAN="192.168.2.1"
DHCP_SERVER="192.168.0.206"
DNS_SERVER="192.168.0.206"
SQUID_SERVER="192.168.2.1"
EXTERNAL_CONTROLLER="93.67.71.199 83.211.187.185"
# Funzione che pulisce le regole di firewall...
pulisco()
{
   echo -n "- Pulisco le regole..."
   $IPT -F
   $IPT -F INPUT
   $IPT -F OUTPUT
   $IPT -F FORWARD
   $IPT -F -t mangle
   $IPT -F -t nat
   $IPT -X
   echo "Fatto!"
}
# Funzione che ripristina lo stato iniziale del firewall
accept_all()
{
   echo -n "- ACCEPT su tutte le chain..."
   $IPT -P INPUT        ACCEPT
   $IPT -P OUTPUT       ACCEPT
   $IPT -P FORWARD      ACCEPT
   echo "0" > /proc/sys/net/ipv4/ip_forward
   echo "Fatto!"
}
# Funzione che blinda il firewall
drop_all()
{
   echo -n "- DROP su tutte le chain..."
   $IPT -P INPUT        DROP
   $IPT -P OUTPUT       DROP
   $IPT -P FORWARD      DROP
   echo "0" > /proc/sys/net/ipv4/ip_forward
   echo "Fatto!"
}
# Funzione che imposta il traffico dalla lan verso internet...
lan_wan()
{
   echo -n "- Genero la catena lan_wan..."
   $IPT -t filter -N lan_wan
   $IPT -A FORWARD -i $LAN -o $WAN -j lan_wan
   $IPT -t filter -A lan_wan ! -s $RANGE_IP_LAN -j DROP
   # DNS
   $IPT -t filter -A lan_wan -p tcp --dport 53 -j ACCEPT
   $IPT -t filter -A lan_wan -p udp --dport 53 -j ACCEPT
   # NTP
   $IPT -t filter -A lan_wan -p udp --dport 123 -j ACCEPT
   # MAIL
   $IPT -t filter -A lan_wan -p tcp --dport 25 -j ACCEPT
   $IPT -t filter -A lan_wan -p tcp --dport 110 -j ACCEPT
   $IPT -t filter -A lan_wan -p tcp --dport 143 -j ACCEPT
   $IPT -t filter -A lan_wan -p tcp --dport 465 -j ACCEPT
   $IPT -t filter -A lan_wan -p tcp --dport 995 -j ACCEPT
   # WEB
   # $IPT -t filter -A lan_wan -p tcp --dport 80 -j ACCEPT
   # $IPT -t filter -A lan_wan -p tcp --dport 443 -j ACCEPT
   # LOG
   $IPT -t filter -A lan_wan -j LOG --log-prefix="reject[lan_wan]:: "
   $IPT -t filter -A lan_wan -p tcp -j REJECT --reject-with tcp-reset
   echo "Fatto!"
}
# Funzione che imposta il traffico da Internet verso i PC della lan...
wan_lan()
{
   echo -n "- Genero la catena wan_lan..."
   $IPT -t filter -N wan_lan
   $IPT -A FORWARD -i $WAN -o $LAN -j 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 filter -A wan_lan -p tcp -j REJECT --reject-with tcp-reset
   $IPT -t nat -A POSTROUTING -s $RANGE_IP_LAN -o $WAN -j MASQUERADE
   echo "Fatto!"
}
# Funzione che imposta il traffico dal Firewall verso internet...
firewall_wan()
{
   echo -n "- Genero la catena firewall_wan..."
   $IPT -t filter -N firewall_wan
   $IPT -A OUTPUT -j firewall_wan
   $IPT -t filter -A firewall_wan -p tcp --dport 53 -j ACCEPT
   $IPT -t filter -A firewall_wan -p udp --dport 53 -j ACCEPT
   $IPT -t filter -A firewall_wan -j LOG --log-
prefix="reject[firewall_wan]:: "
   $IPT -t filter -A firewall_wan -p tcp -j REJECT --reject-with tcp-
reset
   echo "Fatto!"
}
# Funzione che imposta il traffico dalla Wan verso il firewall...
wan_firewall()
{
   echo -n "- Genero la catena wan_firewall..."
   $IPT -t filter -N wan_firewall
   $IPT -A INPUT -j wan_firewall
   $IPT -t filter -A wan_firewall -m state --state ESTABLISHED,RELATED
-j ACCEPT
   $IPT -t filter -A wan_firewall -p tcp -j REJECT --reject-with tcp-
reset
   echo "Fatto!"
}
# Funzione che imposta le porte che il firewall può accettare dalla
lan...
to_firewall()
{
   echo -n "- Genero la catena to_firewall..."
   # SSH LAN -> Firewall
   $IPT -A INPUT -s $RANGE_IP_LAN -d $IP_FIREWALL_LAN -p tcp --dport
22 -j ACCEPT # TEMPORANEA per connettermi da SSH adi vari client per
fare dei test... Sarà rimossa quando tutto funzionerà...
   for ip_controllo in ${EXTERNAL_CONTROLLER}; do
      $IPT -A INPUT -s $ip_controllo -d $IP_FIREWALL_WAN -p tcp --
dport 22 -j ACCEPT
   done
   # DHCP LAN -> Firewall
   $IPT -A INPUT -s 0.0.0.0 -d 255.255.255.255 -p udp --dport 67 -j
ACCEPT
   $IPT -A INPUT -s $RANGE_IP_LAN -d $IP_FIREWALL_LAN -p tcp --dport
67 -j ACCEPT
   $IPT -A INPUT -s $RANGE_IP_LAN -d $IP_FIREWALL_LAN -p udp --dport
67 -j ACCEPT
   $IPT -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
   $IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
   $IPT -A INPUT -p tcp -j REJECT --reject-with tcp-reset
   $IPT -A OUTPUT -m state --state ESTABLISHED,RELATED,NEW -j ACCEPT
   # LOG
   $IPT -A INPUT  -j LOG --log-prefix="reject[to_firewall_INPUT]:: "
   $IPT -A OUTPUT -j LOG --log-prefix="reject[to_firewall_OUTPUT]:: "
   echo "Done!"
}
# SQUID !!!
squid()
{
   echo -n "- Collego squid al firewall..."
   $IPT -t filter -N squid_in
   $IPT -t filter -N squid_out
   $IPT -t filter -A INPUT -j squid_in
   $IPT -t filter -A OUTPUT -j squid_out
   $IPT -t filter -A squid_in -s $RANGE_IP_LAN -d $IP_FIREWALL_LAN -p
tcp --dport 3128 -j ACCEPT
   $IPT -t filter -A squid_out -s $IP_FIREWALL_LAN -d $RANGE_IP_LAN -p
tcp  --sport 3128 -j ACCEPT
   $IPT -t filter -A squid_out -p tcp --dport 80 -j ACCEPT
   $IPT -t filter -A squid_in -p tcp --sport 80 -j ACCEPT
   $IPT -t nat -A PREROUTING -i $LAN -p tcp --dport 80 -j DNAT --to
$SQUID_SERVER:3128
   echo "Fatto!"
}
case "$1" in
   'start')
      pulisco
      drop_all
      squid
      lan_wan
      wan_lan
      firewall_wan
      wan_firewall
      to_firewall
      echo "1" > /proc/sys/net/ipv4/ip_forward
   ;;
   'stop')
      pulisco
      accept_all
      rm -f /var/run/Firewall.run
   ;;
   'restart')
      pulisco
      accept_all
      rm -f /var/run/Firewall.run
      pulisco
      drop_all
      squid
      lan_wan
      wan_lan
      firewall_wan
      wan_firewall
      to_firewall
      echo "1" > /proc/sys/net/ipv4/ip_forward
   ;;
   'stupid')
      pulisco
      accept_all
      echo "1" > /proc/sys/net/ipv4/ip_forward
      $IPT -t nat -A POSTROUTING -s $RANGE_IP_LAN -o $WAN -j
MASQUERADE
   ;;
   *)
      echo "Usage $0 {start|stop|restart|stupid|status}"
esac
Con questo script SQUID si rifiuta di collaborare... :-( Se però avvio
facendo il reset portando tutto su ACCEPT e impostando l'ip_forward e
attivando il proxy dai pc riesco a navigare e vedo tutto loggato da
squid...
Ciao, Keres.