iptables permitir http y dns

Iniciado por patilanz, 26 Febrero 2015, 13:42 PM

0 Miembros y 1 Visitante están viendo este tema.

patilanz

Hola estoy aprendiendo a usar iptables y tengo esto:

Citariptables -P OUTPUT DROP
iptables -P INPUT DROP

iptables -A OUTPUT -j ACCEPT -p udp --dport 53
iptables -A INPUT -j ACCEPT -p udp --sport 53

iptables -A OUTPUT -j ACCEPT -p tcp --dport 80
iptables -A INPUT -j ACCEPT -p tcp -sport  80


Quiero bloquear todo y permitir solo http y dns pero con wireshark solo salen paquetes dns pero sin respuesta

Saludos

MinusFour

#1
Tienes destination y source port alrevez.

Cuando tu envias una peticion al servidor HTTP por ejemplo, los puertos se ven asi:


Source Port: 49900 [Puerto efimero]
Destination Port: 80


Cuando el servidor recibe la respuesta, los puertos ser intercambian:

Source Port: 80
Destination Port: 49900 [Puerto efimero]


Lo puedes comprobar con tu wireshark.

Tambien seria conveniente que agregues una regla para tu loopback:

Código (bash) [Seleccionar]

iptables -I INPUT 1 -i lo -j ACCEPT


Edit: ¿Esto es para un servidor con HTTP y DNS? Si esto es de lado del cliente (requests en lugar de replies), si deberias poder hacer un nslookup.

Edit 2:: DNS tambien usa TCP 53.

patilanz

#2
Lo estoy viendo con wireshark y cuando me conecto al servidor HTTP el puerto de destino es 80 y el me contesta con sport 80 intercambiando. El OUTPUT seria el envió (dport 80) y el INPUT la respuesta (sport 80) o no ?

El loopback es algo como localhost ?

Citar¿Esto es para un servidor con HTTP y DNS? Si esto es de lado del cliente (requests en lugar de replies), si deberias poder hacer un nslookup.

El servidor es HTTP bueno es cualquier pagina web y luego el DNS para obtener la ip de 8.8.8.8 de google. A que te refieres ?

CitarDNS tambien usa TCP 53.

Ahora lo pruebo

@Edit: Funciona con los puertos intercambiados pero no entiendo porque. En teoría el OUTPUT tiene que ser para los paquetes salientes y cuando un paquete DNS sale lo hace con puerto destino 53 y sport aleatorio, bueno con un rango. Y cuando llega por INPUT lo hace con sport 53 y dport el sport de antes.

MinusFour

Si tu eres el servidor y te interesa solo permitir las conexiones entrantes. Entonces los paquetes a tu servidor van a llegar asi:


Source Port: 49900 (efimero)
Destination Port: 80


Y la regla que hace match a eso puede ser esta:


iptables -A INPUT -p TCP --dport 80 -j ACCEPT/DROP/ETC


Esto es si tu eres el servidor.

Enseguida tu como servidor respondes con paquetes asi:


Source Port: 80
Destination Port: 49900


La regla que puede hacer match a esto puede ser:


iptables -A OUTPUT -p TCP --sport 80 -j ACCEPT/DROP/ETC


Como cliente los puertos son los mismos pero estas haciendo cosas diferentes. El cliente esta enviando la peticion (OUTPUT) y el servidor esta recibiendo la peticion (INPUT). Una vez que la peticion le llega al server, este te envia la respueta (OUTPUT) y el ciente recibe la respueta (INPUT).

La peticion:


CLIENTE ---------------------> SERVIDOR
(OUTPUT)      SPORT:49900     (INPUT)
              DPORT:80


La respuesta:


CLIENTE <--------------------- SERVIDOR
(INPUT)       SPORT:80         (OUTPUT)
              DPORT:49900                           

patilanz

Debería de ser muy simple pero no funciona.
Con udp 53 sport 53 no obtiene la ip, con udp 53 dport 53 tampoco, con udp sport 53 y dport 53 SI.  :huh: :huh:

Luego si hago esto:

Citariptables -P OUTPUT ACCEPT
iptables -P INPUT DROP
iptables -A INPUT -j ACCEPT -p tcp
iptables -A INPUT -j ACCEPT -p udp --dport 53
iptables -A INPUT -j ACCEPT -p udp --sport 53

Obtiene la ip pero no se conecta al servidor.
Lo compruebo con telnet foro.elhacker.net 80
No lo entiendo

cpu2

Hola

Tienes que dejar paso a paquetes ya establecidos y en "conexo". Creo que con estas reglas bastaria.

Citariptables -F
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -A OUTPUT -p tcp --dport 80 --syn -m state --state NEW -j ACCEPT
iptables -A OUTPUT -p udp --dport 53 -m state --state NEW -j ACCEPT

Bueno con telnet y demas seria cambiar por el 23 y demas, si quieres te explico con detalle las reglas.

Un saludo.

MinusFour

Yo realmente no he tenido que pasar paquetes establecidos, relacionados o nuevos. Con esas mismas reglas me ha funcionado perfectamente:


[m1n054@manjaro ~]$ sudo iptables -L
Chain INPUT (policy DROP)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere           
ACCEPT     tcp  --  anywhere             anywhere             tcp spt:http
ACCEPT     udp  --  anywhere             anywhere             udp spt:domain
ACCEPT     tcp  --  anywhere             anywhere             tcp spt:https

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy DROP)
target     prot opt source               destination         
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:http
ACCEPT     udp  --  anywhere             anywhere             udp dpt:domain
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:https



[m1n054@manjaro ~]$ sudo iptables -S
-P INPUT DROP
-P FORWARD ACCEPT
-P OUTPUT DROP
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m tcp --sport 80 -j ACCEPT
-A INPUT -p udp -m udp --sport 53 -j ACCEPT
-A INPUT -p tcp -m tcp --sport 443 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A OUTPUT -p udp -m udp --dport 53 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 443 -j ACCEPT


Realmente deberia agregar el 53 para TCP tambien, pero con eso soy capaz de postear esto.


[m1n054@manjaro ~]$ curl -I http://foro.elhacker.net
HTTP/1.1 200 OK