====== 19. Otros protocolos ======
===== DNS =====
Hasta hora estamos haciendo siempre las pruebas usando las IPs, pero una IP es poco cómoda para que un humano lo recuerde. Por ello se creo el nombre de dominio de un Host, que no es mas que un nombre de recordar sencillo para un ser humano. Y que asocia un nombre de dominio a una IP.
Ejemplos de nombre de dominio son:
* www.fpmislata.com
* www.empleafp.com
* www.logongas.es
Un nombre de dominio solo puede tener una IP ya que si tuviera varias , no sabríamos cual usar pero la misma IP puede tener varios dominios. Es decir que un mismo Host puede tener varios nombre de dominio. Eso es normal ya que en un mismo Ordenador se ponen páginas de distintos dominios para ahorrar costes económicos.
A consecuencia de ello se crearon los "procesos" ((Incluimos la palabra proceso ya realmente son programas de ordenador)) servidores de DNS. Un servidor DNS es un servidor al que le enviamos el nombre de dominio y nos devuelve su IP.
Mas información:
* [[https://es.wikipedia.org/wiki/Sistema_de_nombres_de_dominio|DNS]]
* [[https://www.xatakamovil.com/conectividad/como-funciona-internet-dns|Cómo funciona Internet: ¿Qué son y para qué sirven las DNS?]]
* [[https://www.ionos.es/digitalguide/servidores/know-how/que-es-el-servidor-dns-y-como-funciona/|El servidor DNS y la resolución de nombres en Internet]]
El protocolo DNS es muy sencillo, se envía por UDP al puerto 53 de nuestro servidor DNS un nombre de dominio y el nos retorna la la IP. No vamos a entrar en el formato del protocolo DNS. Un detalle es que lo primero que necesitamos a saber la IP de nuestro servidor de DNS. Así que hay que establecerla manualmente ((Luego veremos que realmente no es manualmente sino por DHCP)) al igual que hacíamos con la puerta de enlace.
Para saber los servidores DNS que está usando Linux debemos lanzar la orden ''systemd-resolve --status'':
logongas@beren:~$ systemd-resolve --status
Global
DNSSEC NTA: 10.in-addr.arpa
16.172.in-addr.arpa
168.192.in-addr.arpa
17.172.in-addr.arpa
18.172.in-addr.arpa
19.172.in-addr.arpa
20.172.in-addr.arpa
21.172.in-addr.arpa
22.172.in-addr.arpa
23.172.in-addr.arpa
24.172.in-addr.arpa
25.172.in-addr.arpa
26.172.in-addr.arpa
27.172.in-addr.arpa
28.172.in-addr.arpa
29.172.in-addr.arpa
30.172.in-addr.arpa
31.172.in-addr.arpa
corp
d.f.ip6.arpa
home
internal
intranet
lan
local
private
test
Link 3 (docker0)
Current Scopes: none
LLMNR setting: yes
MulticastDNS setting: no
DNSSEC setting: no
DNSSEC supported: no
Link 2 (enp2s0)
Current Scopes: DNS
LLMNR setting: yes
MulticastDNS setting: no
DNSSEC setting: no
DNSSEC supported: no
DNS Servers: 8.8.8.8
8.8.4.4
DNS Domain: ~.
Vemos que en las últimas lineas aparece "DNS Servers" y vemos que hay dos DNS cuyas IPs son "8.8.8.8" y "8.8.4.4".
No vamos a ver como establecer los servidores DNS en Ubuntu pero si alguna ver os hace falta, recordar que se usa una herramienta llamada [[https://vitux.com/how-to-configure-networking-with-netplan-on-ubuntu/|netplan]]
Para nosotros hacer una petición DNS se usa la orden "dig" con el nombre de dominio.
logongas@beren:~$ dig www.fpmislata.com +short
87.98.231.18
Podemos pensar que no es muy útil la orden "dig" pero a veces hay problemas de red y para saber si funcionan los DNS podemos usar esta orden.
A veces nos interesa tener un servidor DNS en nuestro ordenador si por ejemplo nos conectamos a la IP de nuestra XBox , o la SmartTV, etc. De esa forma en vez de acceder por IP podríamos acceder por el nombre. Montar todo un servidor DNS, aunque no es complejo está mas allá del objetivo de la asignatura. Pero hay una forma muy sencilla de asociar una IP con un nombre de dominio. Es simplemente rellenar un fichero llamado "/etc/hosts" con la IP y el nombre de dominio.
logongas@beren:~$ cat /etc/hosts
127.0.0.1 localhost
192.168.1.110 beren
# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
Ahí vemos que en vez de usar "127.0.0.1" se puede usar el nombre de domino "localhost" y también el nombre de domino de "beren" asociado a la IP 192.168.1.106.
Así que si que por ejemplo si nuestra XBox tiene la IP 192.168.1.67 no habría mas que añadir lo siguiente al fichero "/etc/hosts"
192.168.1.67 xbox
Y ya podríamos usar el nombre xbox. Lo malo de ésta técnica es que solo funciona desde le ordenador en el que hemos modificado el fichero "/etc/hosts", por lo que desde un movil no podríamos usar el nombre "xbox". Así que no es una maravilla pero para salir de algún problema , puede valer.
Por último decir que una nueva nueva forma de conectarse a un servidor DNS, que no es por UDP al puerto 53 , sino que es por HTTPS. Es decir usando el puerto 443 ((el de https)) por TCP. ¿Y para que usarlo? Pues por privacidad. Para que nadie pueda saber que nombre dominio estamos resolviendo, ya que si resolvemos por ejemplo el dominio "www.podemos.info" o "www.pp.es" se puede empezar a saber información privada nuestra. Además que si por ejemplo un país ordena bloquear un nombre de dominio por razones políticas, con DNS sobre https ya no podría.
Mas información:
* [[https://www.adslzone.net/2019/07/05/dns-over-https-firefox-operadores/|Los operadores critican a Firefox por usar DNS-over-HTTPS: ya no pueden bloquear webs]]
* [[https://www.adslzone.net/2019/10/09/dns-por-https-soluciones-problemas/|Google y Mozilla contra el mundo: problemas y soluciones que aporta DNS por HTTPS]]
* [[https://www.xataka.com/basics/dns-mediante-https-doh-que-como-activarlo-chrome-edge-firefox|DNS mediante HTTPS o DoH: qué es y cómo activarlo en Chrome, Edge y Firefox]]
* [[https://www.xataka.com/basics/que-bloqueo-dns-que-utiliza-tu-operador|Qué es el bloqueo por DNS y por qué lo utiliza tu operador]]
===== DHCP =====
Para poder comunicarnos por internet hemos visto que necesitamos de la siguiente información ((Realmente hay mas información pero no es tan crítica como ésta)):
* La IP de nuestro ordenador
* La mascara de red
* La puerta de enlace
* Las IPs de los servidores DNS
Obviamente poner todo ésto manualmente es inviable, así que se creo el protocolo DHCP que permite obtener toda esa información al iniciarse el sistema operativo. Para ello debe haber un servidor de DHCP en nuestra red. En nuestras casa ese servidor se encuentra dentro de nuestro router. El protocolo DHCP funciona sobre Ethernet y no sobre IP ni sobre TCP o UDP ya que es justamente lo que queremos configurar.
Mas información:
* [[https://es.wikipedia.org/wiki/Protocolo_de_configuraci%C3%B3n_din%C3%A1mica_de_host|DHCP]]
¿Porque es importante el servidor de DHCP? Porque podemos entrar en el router de nuestra casa y cambiar la configuración.
En las siguiente pantalla se ve la configuración de la IP de la red interna de un router:
{{:clase:daw:si:3eval:lan.png|}}
La configuración de la LAN indica como será la red interna del router , datos que luego limitarán el rango de IPs que puede dar el servidor de DHCP.
* IP Address: Es la IP que tendrá el router en la red interna
* Subnet Mask: Es la mascara de red de la red interna
{{:clase:daw:si:3eval:dhcp.png|}}
Aquí indicamos los valores de los datos que va a retornar el servidor de DHCP
* Start IP Adress y End IP Address: Es un rango de IPs. El router solo asignará IPs a los Hosts por DHCP de IPs contenidas en este rango. Es decir que por DHCP no se puede tener cualquier IP de la red sino únicamente alguna de las incluidas en el rango. Obviamente el rango debe estar dentro de la red que se definió al configurar la LAN.
* Default Gateway: Es la puerta de enlace que tendrán los Host que pidan la puerta de enlace por DHCP. Lo normal es que coincida con la IP del propio router.
* Primary DNS: La IP del servidor de DNS que usarán los Hosts
* Secondary DNS: La IP del servidor de DNS que usarán los Hosts en caso de que el servidor primario de DNS esté caído.
Un servidor DHCP intentará dar siempre la misma IP al mismo Host (sabe que es el mismo Hosts por su dirección MAC) pero no tiene obligación de ello.Por ello se dice que los host por DHCP tiene una **IP dinámica** , ya que puede cambiar en cualquier momento.Por otro lado si en un Host establecemos la IP de forma manual se dice que tiene una **IP estática** ya que no cambiará a no ser que el usuario la modifique.
En la siguiente imagen de un router se ve la tabla que tiene el servidor de DHCP con las MAC y las IPs que ha dado a cada MAC, de esa forma puede **intentar** dar la misma IP a la misma MAC la próxima vez que el ordenador arranque y pida una IP.
{{:clase:daw:si:3eval:dhcp-client-list.png|}}
Por último tenemos la cuadratura del círculo, que es poder tener una IP fija con DHCP. ¿Como se hace? Pues es muy sencillo , reservamos la IP diciendo que esa IP solo se la demos a cierta MAC. En la siguiente imagen de un router , podemos ver como la IP 192.168.1.110 siempre se dará a la MAC 38-2C-4A-E7-D7-BB.
{{:clase:daw:si:3eval:address_reservation.png|}}
Despues de ver como funciona DHCP,¿Que utilidad tiene poder modificar todo ésto? Las utilidades son varias.
* IPs estáticas manualmente. Si queremos tener algún dispositivo en nuestra red con una IP estática. Como por ejemplo la XBox, no podemos usar ninguna IP que esté dentro del rango del servidor de DHCP, por lo tanto es necesario saber que rango tiene.Eso también implica que el rango del servidor de DHCP no use todo en rango de la red aquí. Y si nos fijamos en como está configurado, la primera IP empieza en 192.168.1.100 y la última en 192.168.1.199. Cuando erróneamente podríamos haber pensado porqué la primera no era 192.168.1.2 ((La 192.168.1.1 no puede ser ya que está usada por el propio router)) y la última porqué no era 192.168.1.254((La 192.168.1.255 no puede ser ya que es la dirección de broadcast)). Es decir que normalmente se deja algún rango libre de la red para IPs estáticas. Aunque por supuesto , es algo opcional.
* IPs estáticas por DHCP: Como ya hemos comentado para tener una IP estática pero en vez de escribirla manualmente la podemos reservar en el servidor DHCP para esa MAC.
* Privacidad de DNS: Al ver el protocolo DNS dijimos que nos pueden "espiar" sabiendo los nombres de dominio que resolvemos. Por lo tanto es interesante poder cambiar los servidores DNS que usamos.
* Velocidad DNS: Al estar navegando estamos constantemente resolviendo nombres de domino. Por ello a veces nos interesa cambiar los servidores DNS por otros que sean mas ŕapidos.
Mas información:
* [[https://www.xataka.com/basics/servidores-dns-libres-gratuitos-que-que-riesgos-tienen-principales-alternativas|Servidores DNS libres y gratuitos: qué son, qué riesgos tienen y principales alternativas]]
===== Cortafuegos =====
Pasemos ahora a explicar lo que es un cortafuegos. Hemos visto que cualquier proceso puede abrir un puerto ((En jerga de programación se dice abrir un [[https://es.wikipedia.org/wiki/Socket_de_Internet|socket]])) y ponerse a escuchar. Esta acción que parece tan inocua realmente tiene mucho peligro. Es un hecho que los programas de ordenador acaban teniendo problemas de seguridad , así que abrir un puerto para que cualquier Host de internet nos pueda enviar datos es un agujero por el que nos pueden hackear el ordenador.
Puede pasar por ejemplo que un programa lector de PDFs abriera un puerto para que se le envíe un documento Word y este programa retorne un PDF. Algo tan inofensivo como eso y hecho de buena fe, puede significar tener un agujero de seguridad. Aunque el ejemplo puede parecer un poco absurdo , el servidor de Windows que permitía compartir carpetas , durante mucho tiempo, tuvo fallos de seguridad.
Por ello los usuarios deberíamos poder decidir en que puertos se escucha y en cuales no. Para ello los sistemas operativos crearon los cortafuegos. Un cortafuego es un programa del sistema operativo que
* Impide que desde un proceso de otro Host pueda conectarse a un puerto abierto de nuestro Host. Se llama a ésto bloquear o denegar conexiones de entrada o **deny incoming**
* Impide que un proceso de nuestro Host se pueda conectar a puertos de otros Hosts. Se llama a ésto bloquear o denegar conexiones de salida o **deny outgoing**
Obviamente lo mas peligro son las conexiones de entrada pero también podemos desear impedir alguna conexión de salida.
Hay que destacar que cuando impedimos las conexiones de entrada a un puerto abierto, para el proceso de nuestro Host, el puerto está abierto. Es decir que el Sistema operativo permite que el proceso se ponga a escuchar en el puerto pero si lo hemos bloqueado con el cortafuego, simplemente nunca le llegará ningún dato.
Pasemos ahora a ver como usar el cortafuegos de Linux. El comando a usar es **ufw**, que significa "Uncomplicated Firewall". No voy a explicar como hacerlo ya que está perfectamente explicado en los siguientes tutoriales, por lo que deberéis leerlos:
* [[https://medium.com/@klvst3r/c%C3%B3mo-configurar-ufw-en-ubuntu-18-o-debian-67dab8c72170|Cómo configurar UFW en Ubuntu 18 o Debian]]
* [[https://www.hostinger.es/tutoriales/como-configurar-firewall-ubuntu|Cómo configurar un Firewall en Ubuntu 18.04 con UFW]]
* [[https://www.digitalocean.com/community/tutorials/como-configurar-un-firewall-con-ufw-en-ubuntu-18-04-es|Cómo configurar un firewall con UFW en Ubuntu 18.04]]
Ahora que ya sabemos como usar el cortafuegos de Linux, resulta que tiene un problema.El problema es que en cada ordenador de nuestra red, debemos tener un cortafuego. Y puede pasar que:
* Se nos olvide activar y configurar el cortafuegos
* No sepamos usar el cortafuegos de ese sistema operativo. ¿Como funciona el cortafuegos en Windows?¿Y en MAC? ¿Android?. etc.
* Ese Host no tenga cortafuegos. Como por ejemplo en una Smart TV. ¡Y son muy fáciles de Hackerar! [[https://andro4all.com/2018/02/se-pueden-hackear-smart-tvs|Sí, tu Smart TV también se puede hackear, y es más fácil de lo que crees]]
Por lo tanto lo que se hace es poner una cortafuego en el router de entrada a nuestra red. De esa forma solo tenemos que preocuparnos de un único cortafuegos en toda nuestra casa o empresa. Así que en nuestra casa, el router tambien hace de cortafuegos.
{{:clase:daw:si:3eval:firewall.png|}}
En la imagen el dibujo del muro significa el router que hace de cortafuegos. De esa forma con un único cortafuegos evitamos conexiones entrantes a todos los ordenadores de nuestra red de nuestra empresa o de nuestra casa.
Los cortafuego de los routers por defecto están configurados de la siguiente forma:
* Denegar todas las conexiones de entrada
* Permitir todas las conexiones de salida.
Por lo tanto los ordenadores de la red interna se pueden conectar a servidores de Internet pero nadie se puede conectar a servidores internos de nuestra red, evitando así lo problemas de seguridad.
Después de ver los cortafuegos en los router, resulta que ahora los routers tiene una parte interna (la que queremos proteger) y una parte externa. Estas dos redes tienen también los siguientes nombres
* La red interna también se puede llamar: **LAN**, red privada, red interior, etc.
* La red externa también se puede llamar: **WAN**, red pública, red exterior ,etc.
Recordar que el problema que tenemos es que los procesos abren puertos que son un problema de seguridad y no queremos que desde cualquier Host de Internet se puedan conectar.
Ya hemos visto el ejemplo del smart TV, que tiene abierto un puerto para permitir que lo controlemos desde el móvil pero no queremos que cualquiera lo pueda hacer desde "china". Y lo mismo con nuestra XBox, etc, etc etc. Es decir , ahora casi todos los cacharros tienen una dirección IP y están esperando a que les enviemos ordenes para manejarlos , así que son potenciales agujeros de seguridad.
No vamos a explicar ahora como configurar el cortafuegos de un router ya que depende de NAT , que es un concepto que vamos a ver posteriormente.
===== DMZ =====
Seguimos con los cortafuegos pero ahora vamos a ver el caso en el que queramos que desde Internet se puedan conectar a algún servidor nuestro. El caso mas común es que en nuestra empresa queramos tener un servidor Web. El problema de permitir conexiones a nuestro servidor Web es que hay posibilidad de que sea Hackeado. Y una vez hayan entrado en el servidor Web , desde ahí pueden entrar al resto de ordenadores de nuestra red. Para evitar eso, la red se organiza creando la Zona desmilitarizada o DMZ.
Mas información:
* [[https://es.wikipedia.org/wiki/Zona_desmilitarizada_(inform%C3%A1tica)|DMZ]]
Para explicar la DMZ, veamos los ordenadores que tenemos en nuestra empresa:
^ Servidor ^ Uso ^Acceso desde ^
| Servidor web público | Es un servidor donde está alojada la información pública de nuestra empresa.\\ Es el típica página web de cualquier emrpesa. | Internet |
| Servidor web privado | Es un servidor donde está alojada la información privada de nuestra empresa.\\ Es una web donde están todos los cliente, ventas, comprar ,contabilidad ,etc de nuestra emrpesa | Interior de la empresa |
| Ordenadores de la propia empresa | Son los ordenadores que usan los trabajadores | Interior de la empresa |
¿Como organizamos la red para que se cumpla lo que hemos puesto en la anterior tabla? Pues en la siguiente imagen se ve como queda todo:
{{:clase:daw:si:3eval:dmz_base.png|}}
Lo importante es que ahora hay dos cortafuegos:
* Cortafuego externo: Solo permite conexiones entrantes para el puerto 80 y 443 que vayan para el servidor web público.
* Cortafuegos interno: No permite ninguna conexión entrante.
Es decir, que el cortafuegos interno , no permite ninguna conexión de fuera. Por lo que lo pueden hackear desde el exterior ni a los ordenadores de la empresa ni al servidor web privado. Pero como todos ellos están en la misma red, pueden comunicarse entre ellos sin ningún problema. Por otro lado el cortafuegos externo solo permite las conexiones para el servidor web público. Esto hace que el servidor web público si que pueda ser hackeado pero si eso ocurriera, no pondría en peligro ni al servidor web privado ni a los ordenadores de la empresa. Por otro lado , desde los ordenadores de la empresa , siempre es posible acceder a el servidor público (y obviamente también a internet) ya que el cortafuegos interno permite las conexiones de salida.
Por lo tanto la DMZ es simplemente una red en la que hay uno o mas servidores en las cuales el cortafuegos permite las conexiones de entrada desde Internet pero que en caso de ser hackeada no compromete el resto de los ordenadores de la empresa. Ya que éstos últimos están protegidos con otro cortafuegos.
===== NAT =====
NAT se creo debido a que con $2^{32}$ direcciones IPs no son suficientes para todos los Host del mundo. Así que hicieron un "truco" para tener mas Hosts conectados a Internet que IP existen. Es decir que actualmente hay muchos mas de 4.294.967.296 Hosts en Internet.
Mas información:
* [[https://openwebinars.net/academia/aprende/tcp-ip/3640/|Openwebinars: Breve introducción a NAT]]
Para explicar todo ésto vamos a usar como ejemplo nuestras casa. Cuando contratamos internet el operador le asigna a nuestra casa una única IP. Hace 20 años eso no era un problema ya que no había móviles con internet ni las consolas se contactaban a internet, etc. etc. Así que solo había un único ordenador que necesitaba acceso a internet. En aquella época, esa IP que nos asignaba nuestro operador de telecomunicaciones era la que tenía nuestro ordenador y no había un router ya que no tenía sentido al haber un único ordenador en nuestra casa.
Pero pasó el tiempo y empezamos a tener mas de un Host en nuestra casa conectado a Internet, pero debido a la escasez de IPs, nuestro operador de telecomunicaciones seguía dándonos una única IP. Esa IP es la que ahora llamamos la IP Pública. Podemos decir que es una IP "normal y corriente".
Pero entonces, ¿Que IPs tenían el resto de aparatos de nuestra casa?. En ese caso se hizo la siguiente transformación:
* Nuestro operador ya nos daba un router, ya que ahora teníamos varios Host y el roter tenía que enrutar los datagramas a cada uno de los Hosts.
* El IP Pública se asigno a la interfaz de red del router que está hacia Internet.
* Cada uno de nuestros Hosts tenía una IP privada.
* El router también tiene una IP Privada
¿Que significa una IP Privada? Es una IP con la que no se puede navegar por internet ya que no es única. Cualquiera es su propia casa puede tener la misma IP que nosotros. Las IP privadas son las siguientes:
* 10.0.0.0 a 10.255.255.255
* 172.16.0.0 a 172.31.255.255
* 192.168.0.0 a 192.168.255.255
Normalmente en nuestra casa la red que tenemos es del tipo 192.168.1.0/24. Lo que significa que por ejemplo la IP 192.168.1.100 la pueden tener miles y miles de personas en sus ordenadores de casa. Así que si algún router enviara por error un datagrama con esa IP, el resto de routers no sabrían a cual de las miles y miles de casas habría que enviarlo , así que simplemente se descartan siempre esos datagramas.
Pero, ¿entonces como podemos navegar por internet todos los días aun teniendo una IP Privada?. Pues gracias a NAT. NAT es un truco que pusieron en los routers para permitir que un Host con una IP privada pueda navegar por internet.
Vamos a explicarlo con un ejemplo en el que el Host A inicia una conexión con el servidor del Host B pasando por el router.
En las siguientes imágenes veremos los segmentos que se envían desde el Host A hacia el Host B y luego al revés.
{{:clase:daw:si:3eval:nat_envio.png|}}
Al enviar los datos el Host A, podemos ver que el segmento TCP que envía el Host A es "normal" con las IPs y puertos que esperaríamos en el segmento TCP pero si vemos el segmento TCP que envía el router hacía el Host B, vemos que la IP origen ha cambiado, es la IP pública del router y el puerto tampoco es el mismo es otro distinto. ¿Porque ha ocurrido ésto? Era obvio que la IP privada de 192.168.100 no podía salir por el router, así que había que poner otra IP y la única posible es la IP pública del router. Vemos también que el puerto cambia ya que como hemos comentado no es importante el puerto origen.
{{:clase:daw:si:3eval:nat_respuesta.png|}}
Veamos ahora la respuesta desde el Host B. El segmento TCP que envía el Host B, es el que esperaríamos para lo que sabe el Host B. Es decir que el host B piensa que la respuesta va para la IP pública del Router, aunque realmente vaya para el Host A.
Pero ahora viene lo interesante, cuando le llega el segmento TCP al router , aunque la IP de destino sea la IP pública del propio router, él sabe que no es para él ese segmento sino que es para el Host A. Por lo tanto cuando reeenvía el segmento TCP al Host A , el router cambia la IP destino para que sea la del Host A.
Es decir que un router con NAT hace lo siguiente con las IPs ((también se cambia el puerto pero no lo hemos indicado aquí por no complicar mas la explicación)):
* En los segmentos de salida: Poner como IP de origen, la IP pública del router ya que le llegan al router con una IP origen privada de un ordenador.
* En los segmentos de entrada: Poner como IP destino la del Ordenador al que nos queríamos comunicar ya que le llegan al router con la IP pública del router
Los cambios no parecen muy complicados, pero el problema está en los segmentos de entrada. ¿Como sabe el router a que ordenador de la casa va ese segmento si la IP destino es la pública del router? Este es el quid de la cuestión. Volvamos a explicar el problema. Cuando el Host B envía datos de vuelta, la IP destino es la IP pública del router. ¿Como sabe el router que no va para el propio router? ¿Y como sabe a cual de todos los ordenadores de su red interna va ese segmento?
La respuesta es sencilla, lo sabe porque **primero** ya envió un segmento hacia el Host B, que venía desde el Host A. Así que cuando vuelven datos, sabe que es para el Host A. Por lo tanto ésto es lo importante. El Host A , debe iniciar la conexión ya que de esa forma el router sabrá cuando lleguen los datos que van hacía el Host A. Esa información de quien inicia la petición para saber luego cuando se envían datos desde el Host destino a que Host entregarla de la red interna se guarda en lo que se llama "Tabla NAT".
Pero eso nos crea un problema, ¿Que pasa si alguien de fuera quiere conectarse a un servidor de nuestra red interna? Es decir si ahora la conexión se inicia desde el Host B hacía el Host A. ¡Pues por defecto no puede! y eso es bueno ya que no queríamos que dese cualquier punto de internet alguien se pueda conectar a nuestros servidores. Así que al tener NAT , hemos creado indirectamente un cortafuegos. Veamos un ejemplo de porque es un indirectamente cortafuegos.
Si llega una petición de conexión al router por el puerto 80, éste no puedo redirigirla a ningún ordenador de nuestra red ya que no sabe a cual de todos ellos debería redirigirla ,en el peor de los casos podría ir para el propio router pero éste no tiene abierto el puerto 80 en la red externa así que el router no hace nada y por lo tanto hemos creado un cortafuegos ya que no puede conectarse nadie desde fuera a un ordenador de la red interna.
El concepto de NAT se puede aplicar a nivel de una empresa de telecomunicaciones entera. Es decir , que un proveedor de internet para no tener tantas IP (pensar que hay pocas y valen caras) podría poner un router con NAT delante de todos sus clientes. Eso se llama CGNAT. La consecuencia obvia de ello es que la IP pública de nuestro router ahora tendría una IP privada.
Mas información:
* [[https://www.adslzone.net/reportajes/operadores/que-es-cg-nat-operadores/|Qué es CG-NAT y por qué tu operador te hace compartir IP público con los demás]]
* [[https://openwebinars.net/blog/que-es-cgnat/|Qué es CGNAT y por qué es importante conocerlo]]
* [[https://es.wikipedia.org/wiki/Carrier_Grade_NAT|Wikipedia:Carrier Grade NAT]]
Hasta aquí lo que es el NAT pero....
===== Abrir puertos =====
Acabamos de contar que si nuestro router hace NAT, nadie se puede conectar a un servidor que haya en la red interna, pero eso aunque es una ventaja , realmente podemos querer montar un servidor Web y permitir que desde cualquier ordenador podamos conectarnos a él. Es justamente lo que hicimos con el cortafuegos de la DMZ.
Así que los router con NAT tienen una solución para permitir que en nuestra red interna aceptemos conexiones desde fuera. **¡¡Esto es lo que llamamos abrir puertos!!**. En el router aparece con el nombre de "Virtual Server".
Vamos a ver como hacer en el router lo siguiente: Queremos que cuando llegue una conexión desde internet a la IP pública de nuestro router al puerto 80 por TCP, se redirija todo al puerto 80 del Host 192.168.1.210.
La siguiente imagen muestra como abrir un puerto
{{:clase:daw:si:3eval:abrir_puerto_80.png|}}
Los datos son:
* Service Port: El de puerto que usará el router externamente. Es decir el puerto que se verá desde internet.
* Internal Port: El puerto de nuestro Host al que se redirigen los datos
* IP Address: La IP de nuestro Host al que se redirigen los datos.
* Protocol: Si el protocolo de red es TCP o UDP.
Hay que fijarse que hay dos puertos. Es así porque el puerto que se ve desde internet puede ser el que queramos pero internamente nuestro servidor puede estar escuchando en otro distinto. Es decir que si nuestro servidor está escuchando en el puerto 80, de cara al exterior podemos usar el puerto que queramos.
En la siguiente tabla se ven los puerto que tiene abierto el router (que son el 80,443,8080 y 1234):
{{:clase:daw:si:3eval:abrir_puerto_listado.png|}}
Podemos ver que:
* Si llega al router datos para los puertos 80 y 443, los redirige al Host 192.168.1.210
* Si llega al router datos para el puerto 8080, lo redirige al Host 192.168.1.211 pero al puerto 80 (**no al 8080**)
* Si llega al router datos para el puerto 1234, lo redirige al Host 192.168.1.212 pero al puerto 3306 (**no al 1234**)
Por último decir que los routers que tenemos en casa realmente no implementan un cortafuegos sino que simplemente implementan NAT que implícitamente funciona similar a un cortafuegos. Y que lo que en un cortafuegos era "Permitir conexiones de entrada" es lo que en el router se llama "Virtual Server" o como nosotros lo llamamos "abrir puertos".
Para acabar diremos que realmente nuestro router tiene o puede tener las siguientes funciones:
* Obviamente de Router
* De servidor DNS
* De servidor DHCP
* De NAT y cortafuegos
* De switch ya que permite conectar varios Host por Ethernet
* De Wifi (ya hablaremos en el siguiente tema de la Wifi)
===== Ejercicios =====
==== Ejercicio 1 ====
Usando comandos de Linux, indica las direcciones IP de los siguientes dominios:
* [[http://www.fpmislata.com|www.fpmislata.com]]
* [[http://www.empleafp.com|www.empleafp.com]]
* [[http://www.logongas.es|www.logongas.es]]
* [[http://matricula.fpmislata.com|matricula.fpmislata.com]]
¿Hay algo extraño en alguna de las IPs?
==== Ejercicio 2 ====
Muestra los servidores DNS que usa tu Linux
Modifica tu linux de forma que si haces ping a los siguientes nombres de dominio se haga ping a las siguientes IPs
^ Nombre de Dominio ^ IP ^
| dns1.google.com | 8.8.8.8 |
| dns2.google.com | 8.8.4.4 |
| router | La IP de tu puerta de enlace , es decir del router de tu casa |
Y luego prueba que funciona:
logongas@beren:~$ ping dns1.google.com
logongas@beren:~$ ping dns2.google.com
logongas@beren:~$ ping router
==== Ejercicio 3 ====
Haz capturas de pantalla de tu router para mostar:
* la IP y la máscara de enlace de la red interna de tu router
* La IP pública del router
* La configuración del servidor de DHCP
* la tabla ARP o sino la asignación de direcciones IP que ha dado por DHCP
==== Ejercicio 4 ====
Configura el cortafuego de tu linux para:
* Denegar todas las conexiones de entrada
* Permitir todas las conexiones de salida.
* Arranca un servidor de TCP en el puerto 3306 ((usa netcat))
* Permite las conexiones entrantes en el puero 3306 por TCP
* Desde Windows te conectas con putty ((**pero en el tipo de conexión pon RAW**)) al puerto 3306 de tu Linux, y comprueba que puedes conectarte
* Deniega las las conexiones entrantes en el puero 3306 por TCP
* Desde Windows te conectas con putty ((**pero en el tipo de conexión pon RAW**)) al puerto 3306 de tu Linux, y comprueba que NO puedes conectarte
* Permite las conexiones entrantes en el puero 3306 por **UDP**
* Desde Windows te conectas con putty ((**pero en el tipo de conexión pon RAW**)) al puerto 3306 de tu Linux, y comprueba que NO puedes conectarte
==== Ejercicio 5 ====
Si tienes la siguiente red:
{{:clase:daw:si:3eval:dmz_base.png|}}
Indica como organizarías para ello rellena las siguientes tablas:
^ Nombre Host ^ Dirección IP ^ Mascara de red ^ Puerta de enlace ^
| Ordenador de empresa 1 | | |
| Ordenador de empresa 2 | | |
| Servidor Web Privado | | |
| Servidor Web Publico | | |
Ordenes en Linux del cortafuego para configuralo en las siguientes ordenadores (suponemos que todos son linux)
* Ordenador de empresa 1: Solo se permiten conexiones de salida
* Ordenador de empresa 2: Solo se permiten conexiones de salida
* Servidor Web Privado: Solo se permiten conexiones de salida y entrantes al puerto 80 y 443
* Servidor Web Publico: Solo se permiten conexiones de salida , entrantes al puerto 8080 y 8443 , y entrantes al puerto 22 pero solo de Hosts de la parte interna de la empresa (la que no es la DMZ)
^ Nombre Router ^ Dirección IP Publica ^ Mascara de red Publica ^ Dirección IP Privada ^ Mascara de red Privada ^ Puerta de enlace ^ Rango DHCP ^
| Externo | | | | | | |
| Interno | | | | | | |
Desde internet solo queremos que se pueda acceder por el puerto 80 y 443 al servidor de la DMZ ,así que rellena la siguiente tabla para ver como se abren los puertos.
^ Nombre Router ^ Service Port ^ Internal Port ^ IP Adress ^ Protocol ^
| | | | | |
| | | | | |
==== Ejercicio 5: Solución ====
^ Nombre Host ^ Dirección IP ^ Mascara de red ^ Puerta de enlace ^
| Ordenador de empresa 1 | 192.168.1.100 | 255.255.255.0 | 192.168.1.1 |
| Ordenador de empresa 2 | 192.168.1.101 | 255.255.255.0 | 192.168.1.1 |
| Servidor Web Privado | 192.168.1.10 | 255.255.255.0 | 192.168.1.1 |
| Servidor Web Publico | 192.168.2.15 | 255.255.255.0 | 192.168.2.1 |
^ Nombre Router ^ Dirección IP Publica ^ Mascara de red Publica ^ Dirección IP Privada ^ Mascara de red Privada ^ Puerta de enlace ^ Rango DHCP ^
| Externo | 158.42.4.23 | 255.255.0.0 | 192.168.2.1 | 255.255.255.0 | 158.42.4.1 | 192.168.2.100-192.168.2.200 |
| Interno | 192.168.2.10 | 255.255.255.0 | 192.168.1.1 | 255.255.255.0 | 192.168.2.1 | 192.168.1.100-192.168.1.200 |
^ Nombre Router ^ Service Port ^ Internal Port ^ IP Adress ^ Protocol ^
| Externo | 80 | 8080 | 192.168.2.15 | TCP |
| Externo | 443 | 8443 | 192.168.2.15 | TCP |
#En todos los ordenadores
sudo ufw default allow outgoing
sudo ufw default deny outgoint
#Servidor web privado
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
#Servidor web público
sudo ufw allow 8080/tcp
sudo ufw allow 8443/tcp
sudo ufw allow from 192.168.2.10 to any port 22
==== Ejercicio 6 ====
* Si montas un servidor de Minecraft en tu casa y quieres que tus amigos puedan jugar desde sus casas. ¿Que puertos deberías abrir en el router? ¿Deberías tambien abrirlos en tu cortafuegos de tu ordenador?
* ¿Porque es recomendable abrir los puestos del eMule? Explica tu respuesta
* Si el proveedor de Internet que da acceso a la red anterior, usa CGNAT. ¿Hay algún problema?
==== Ejercicio 7 ====
**NOTA: Este ejercicio es optativo**
Indica como podrías hacer en tu router que a tu ordenador Linux se le de siempre la misma IP.
==== Ejercicio 8 ====
**NOTA: Este ejercicio es optativo**
En virtulabox , donde pusiste la opción de "Adaptador puente" , pincha en "Avanzadas" y verás la dirección MAC de tu Linux. A la derecha esta un icono azul que permite cambiar la MAC de tu tarjeta de red.
{{:clase:daw:si:3eval:virtualbox_configuracion_red.png|}}
* Comprueba en Linux que tienes MAC que se indica en VirtualBox.
* Apaga el linux y cambia la MAC desde VirtualBox usando el icono azul de la derecha
* Comprueba en Linux que ahora tienes la MAC que se indica en VirtualBox.
Al cambiar la MAC , ¿El router ahora te dará la misma IP que antes? Explica porqué