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
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:
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.
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.
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
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
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.
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