Foro de elhacker.net

Sistemas Operativos => GNU/Linux => Mensaje iniciado por: patilanz en 26 Febrero 2015, 13:42 pm



Título: iptables permitir http y dns
Publicado por: patilanz en 26 Febrero 2015, 13:42 pm
Hola estoy aprendiendo a usar iptables y tengo esto:

Citar
iptables -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


Título: Re: iptables permitir http y dns
Publicado por: MinusFour en 26 Febrero 2015, 16:20 pm
Tienes destination y source port alrevez.

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

Código:
Source Port: 49900 [Puerto efimero]
Destination Port: 80

Cuando el servidor recibe la respuesta, los puertos ser intercambian:
Código:
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
  1. 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.


Título: Re: iptables permitir http y dns
Publicado por: patilanz en 26 Febrero 2015, 22:32 pm
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 ?

Citar
DNS 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.


Título: Re: iptables permitir http y dns
Publicado por: MinusFour en 27 Febrero 2015, 01:09 am
Si tu eres el servidor y te interesa solo permitir las conexiones entrantes. Entonces los paquetes a tu servidor van a llegar asi:

Código:
Source Port: 49900 (efimero)
Destination Port: 80

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

Código:
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:

Código:
Source Port: 80
Destination Port: 49900

La regla que puede hacer match a esto puede ser:

Código:
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:

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

La respuesta:

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


Título: Re: iptables permitir http y dns
Publicado por: patilanz en 27 Febrero 2015, 16:35 pm
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:

Citar
iptables -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


Título: Re: iptables permitir http y dns
Publicado por: xv0 en 27 Febrero 2015, 23:44 pm
Hola

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

Citar
iptables -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.


Título: Re: iptables permitir http y dns
Publicado por: MinusFour en 28 Febrero 2015, 05:27 am
Yo realmente no he tenido que pasar paquetes establecidos, relacionados o nuevos. Con esas mismas reglas me ha funcionado perfectamente:

Código:
[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

Código:
[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.

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