Foro de elhacker.net

Comunicaciones => Redes => Mensaje iniciado por: leogtz en 21 Febrero 2011, 23:41 pm



Título: Duda básica
Publicado por: leogtz en 21 Febrero 2011, 23:41 pm
Hola, qué tal, estoy desarrollando un script que se encarga de setear un tipo de conexión. Tengo que hacer un script que dada una IP me devuelva algunas datos.

La sintaxis del programa que estoy haciendo es esta:
Código
  1. script -r estatica 172.26.0.35

-r : estática o dinámica
y la ip

Por ejemplo, yo teniendo la IP 172.26.0.35, cómo debería ser la "network", "broadcast", "gateway", "address", "gateway", "netmask", es decir, ¿cómo cambiarían de acuerdo a la IP dada?


Esto lo necesito porque editaré un archivo, concretamente el archivo "/etc/network/interfaces".

¿Y cómo sería para una red dinámica?



Título: Re: Duda básica
Publicado por: madpitbull_99 en 22 Febrero 2011, 00:29 am
En Linux para pasar de IP estatica a dinamica hay que cambiar esta linea en el fichero de configuracion:

Código:
iface eth0 inet dhcp 
Dinámica.

por

Código:
iface eth0 inet static
Estática.

Cuando esta configurada por DHCP, no hay que poner mas datos, pero si vas a configurar una IP estática hay que poner los siguientes valores:

address 172.26.0.35        <- Ip del interfaz.
netmask 255.255.255.0    <- Mascara de red.
network 172.26.0.0         <- Dirección de la red.
broadcast 172.26.0.255   <- Dirección de broadcast.
gateway 172.26.0.1        <- Ip de la puerta de enlace.
dns-nameservers 8.8.8.8  <- Ip del servidor DNS.

Para detectar si esta puesta en dinámica puedes buscar dentro del fichero de configuración la palabra "dhcp" si no se encuentra es que esta en estática.

Para calcular los demás datos puedes echar un vistazo a las calculadoras IP y a los tutoriales que he puesto en el post de abajo:
Calculo Mascara (http://foro.elhacker.net/redes/calculo_mascara-t319850.0.html)

Si tienes dudas de como calcular los parametros, pudes mirar proyectos ya hechos como: PHP Subnet, Calculator (http://sourceforge.net/projects/subntcalc/), IP Net Calculator (http://www.phpclasses.org/package/6456-PHP-Compute-the-common-mask-from-multiple-IP-addresses.html).
Los dos están en PHP, pero si sabes scripting se entiende y tambien los hay en otros lenguajes. Para Webmin hay un plugin (http://www.niemueller.de/webmin/modules/nettools/) (en Perl) que mirar para ver como calcula los parámetros.


Título: Re: Duda básica
Publicado por: leogtz en 22 Febrero 2011, 00:59 am
Gracias, me has aclarado la duda, solo esa parte me faltaba para ponerme a trabajar, gracias.

Cualquier duda te comento.


Título: Re: Duda básica
Publicado por: leogtz en 28 Febrero 2011, 07:37 am
@madpitbull_99

Y si mi fichero está como sigue?


Código:
auto lo
iface lo inet loopback

¿En qué está?

Te explico mi duda.

Mira, mi script es algo así:

comando -r dinamica IP

¿Si el usuario me da "dinamica" solo tengo que volcar al archivo /etc/network/interfaces lo siguiente?

Código:
iface eth0 inet dhcp

¿qué es lo que debiera tener en cuenta? ¿o solo así como te lo pongo?

¿Se pueden tener varias interfaces?

¿Es decir, con cada llamada al script puedo sobreescribir los valores o tengo que agregar al final dependiendo de lo que me de el usuario?


Título: Re: Duda básica
Publicado por: madpitbull_99 en 28 Febrero 2011, 08:18 am
Citar
Y si mi fichero está como sigue?


Código:
auto lo
iface lo inet loopback
¿En qué está?
El interface lo es es el interface de bucle local o el loopback, ese tiene que estar obligatoriamente en el archivo de configuración de la tarjeta de red.

Citar
¿Si el usuario me da "dinamica" solo tengo que volcar al archivo /etc/network/interfaces lo siguiente?

Código:
iface eth0 inet dhcp
¿qué es lo que debiera tener en cuenta? ¿o solo así como te lo pongo?
Si, así pediría una IP por DHCP al servidor que hay en la red. Debes tener en cuenta que el nombre del interfaz es diferente en cada sistema.
En un equipo se puede llamar eth0 y en otro se puede llamar eth3. Para ver el nombre que tiene la tarjeta de red en un equipo puedes ejecutar el comando ifconfig -a y luego parsear (con regex, por ejemplo) la palabra que empieza por eth* y así sacar el nombre del interfaz de red.

Citar
¿Se pueden tener varias interfaces?
Si, un equipo puede tener mas de una tarjeta de red, si se trata de un servidor proxy o un firewall, tendrá mas de una tarjeta de red.

Citar
¿Es decir, con cada llamada al script puedo sobreescribir los valores o tengo que agregar al final dependiendo de lo que me de el usuario?
Puedes sobreescribirlo, al final del script si todas las acciones se han realizado bien, reinicia el daemon de la tarjeta de red: /etc/init.d/networking restart.



Mira un script parecido a lo que quieres hacer:

Código
  1. #/bin/bash
  2. # Author: Joshua Bailey
  3. # Name: netHome
  4. # Syntax: netHome
  5. # Summary: used to fix your network settings after
  6. # changing them for another location (or dhcp)
  7.  
  8. function getCurIP
  9. {
  10. # $1 should be the device
  11. ifconfig $1 | grep inet > ~/ip.find
  12. cat ~/ip.find | awk '{print $2}' > ~/ip.find
  13. CUR_IP=`cat ~/ip.find`
  14. CUR_IP=${CUR_IP:5:${#CUR_IP}-5}
  15. rm ~/ip.find
  16. }
  17.  
  18. # setting the domain name
  19. read -p "Please input your domainname (`domainname`): " DMN
  20. if [[ ${#DMN} == 0 ]]
  21. then
  22. DMN=`domainname`
  23. fi
  24. # end setting domain name
  25.  
  26. # setting the hostname
  27. read -p "Please input your hostname (`hostname`): " HSN
  28. if [[ ${#HSN} == 0 ]]
  29. then
  30. HSN=`hostname`
  31. fi
  32. # end setting hostname
  33.  
  34. # setting the device
  35. read -p "Please input your the device you will be using (eth0): " DEV
  36. if [[ ${#DEV} == 0 ]]
  37. then
  38. DEV=eth0
  39. fi
  40. # end setting device
  41.  
  42. # get the current ip
  43. getCurIP $DEV
  44.  
  45. # setting the ip
  46. read -p "Please input your chosen IP for this machine ($CUR_IP): " IP
  47.  
  48. if [[ ${#IP} == 0 ]]
  49. then
  50. IP=$CUR_IP
  51. fi
  52.  
  53. ifconfig $DEV up
  54. ifconfig eth0 | grep $IP > /var/null
  55.  
  56. if [[ $? != 0 ]]
  57. then
  58. ifconfig $DEV down
  59. echo "*** IP not set ***"
  60. echo "*** Setting ***"
  61. ifconfig $DEV $IP
  62. ifconfig $DEV up
  63. else
  64. echo "*** IP matches ***"
  65. echo "*** No changes made ***"
  66. fi
  67. # end setting the ip
  68.  
  69. # setting the default gateway
  70. echo "*** Checking default gateway ***"
  71. echo "*** This may take some time ***"
  72. echo "*** Please wait ***"
  73.  
  74. route > ~/test.route
  75. cat ~/test.route | awk '{if ($1 == "default") print $2;}' > ~/test2.route
  76. CUR_DEF=`cat ~/test2.route`
  77. read -p "Please input your default gateway ($CUR_DEF): " DEF
  78.  
  79. if [[ ${#DEF} == 0 ]]
  80. then
  81. DEF=$CUR_DEF
  82. fi
  83.  
  84. cat ~/test.route | awk -v GW=$DEF '{if ($2 == GW) print $2;}' > ~/found.route
  85. FOUNDIT=`cat ~/found.route`
  86.  
  87. if [[ $FOUNDIT == $DEF ]]
  88. then
  89. echo "*** Default gateway matches ***"
  90. echo "*** No changes made ***"
  91. else
  92. route del default 2> /dev/null
  93. # route add default gw $DEF dev $DEV
  94. echo "*** Default gateway set ***"
  95. fi
  96.  
  97. rm -f ~/*.route
  98. # end setting the default gateway
  99.  
  100. # begin setting dns
  101. grep search /etc/resolv.conf >~/search.dns
  102. TEMP=`grep -n nameserver /etc/resolv.conf`
  103. echo $TEMP > nameserver.dns
  104.  
  105. cat ~/search.dns | awk '{print $2;}' > ~/search.dns
  106. CUR_PRIM=`echo $TEMP | awk '{print $2}'`
  107. CUR_SEC=`echo $TEMP | awk '{print $4}'`
  108.  
  109. read -p "Please input your primary dns ip ($CUR_PRIM): " PRIM
  110. if [[ ${#PRIM} == 0 ]]
  111. then
  112. PRIM=$CUR_PRIM
  113. fi
  114.  
  115. read -p "Please input your secondary dns ip ($CUR_SEC): " SEC
  116. if [[ ${#SEC} == 0 ]]
  117. then
  118. SEC=$CUR_SEC
  119. fi
  120.  
  121.  
  122.  
  123. echo "*** Checking DNS entries ***"
  124. CON=`cat /etc/resolv.conf | grep $DMN`
  125. CON2=`cat /etc/resolv.conf | grep $PRIM`
  126. CON3=`cat /etc/resolv.conf | grep $SEC`
  127. if [[ ! ${#CON} -gt 0 || ! ${#CON2} -gt 0 || ! ${#CON3} -gt 0 ]]
  128. then
  129. echo "*** Editing /etc/resolv.conf ***"
  130. echo "search $DMN" > /etc/resolv.conf
  131. echo "nameserver $PRIM" >> /etc/resolv.conf
  132. echo "nameserver $SEC" >> /etc/resolv.conf
  133. else
  134. echo "*** All DNS entries match ***"
  135. echo "*** No changes made ***"
  136. fi
  137. # end setting dns
Fuente (http://usalug.com/phpBB3//viewtopic.php?t=1844)


Título: Re: Duda básica
Publicado por: leogtz en 28 Febrero 2011, 08:29 am
Gracias, mañana lo miro con detenimiento, creo que mis dudas por ahora están solventadas.

Por cierto, para la configuración estática creo que tendré que recurrir a esto:

Citar
Si tienes dudas de como calcular los parametros, pudes mirar proyectos ya hechos como: PHP Subnet, Calculator, IP Net Calculator.
Los dos están en PHP, pero si sabes scripting se entiende y tambien los hay en otros lenguajes. Para Webmin hay un plugin (en Perl) que mirar para ver como calcula los parámetros.

Pero vaya, estoy solo con shell script, y mi script se ejecutará en varias máquinas, así que debo buscar la manera de hacer esos calculos en el mismo script, sabes como podría hacerle sin usar esos programas?

¿podría hacer el calculo con los mismos comandos del sistema ó como podría generalizarlo?


Título: Re: Duda básica
Publicado por: leogtz en 1 Marzo 2011, 01:47 am
Nunca me pensé que fuera a ser tan complicado el cálculo ese, pero bueno, tendré que usar "ipcalc", un pequeño ejecutable en c, lo compilo, uso y borro.

Una pregunta, para estos parámetros:

script -r estatica 172.26.0.35

Los siguientes valores son los que me da el programa:


Código:
leo@leo-desktop:~/Escritorio/proyectos/345$ ipcalc 172.26.0.35
Address:   172.26.0.35          10101100.00011010.00000000. 00100011
Netmask:   255.255.255.0 = 24   11111111.11111111.11111111. 00000000
Wildcard:  0.0.0.255            00000000.00000000.00000000. 11111111
=>
Network:   172.26.0.0/24        10101100.00011010.00000000. 00000000
HostMin:   172.26.0.1           10101100.00011010.00000000. 00000001
HostMax:   172.26.0.254         10101100.00011010.00000000. 11111110
Broadcast: 172.26.0.255         10101100.00011010.00000000. 11111111
Hosts/Net: 254                   Class B, Private Internet

leo@leo-desktop:~/Escritorio/proyectos/345$

¿Me puedes ayudar a saber cómo crear los dns públicos en el /etc/resolv.conf?

Saludos.


Título: Re: Duda básica
Publicado por: y0g-s0th0th en 1 Marzo 2011, 03:47 am
es q esos datos dependen exclusivamente de la red en la q estes. podes poner dns genericos, pero los q van no tenes forma de conseguirlos sin tener una conexion activa.

el netmask q pones en el ejemplo podria ser tranquilamente /16 en lugar de /24 ya q la ip es de clase b, pero cualquiera de los 2 va a funcionar en todo caso. el gw tampoco tiene un lugar fijo, lo pueden haber puesto en cualquier lado.


saludos


Título: Re: Duda básica
Publicado por: leogtz en 1 Marzo 2011, 03:50 am
Gracias, pregunto porque en el script que me encargaron no me dieron ningún otro dato, y no sé sobre estas configuraciones. Mira lo que me pusieron:


Citar
Y crear los dns públicos que queramos en el /etc/resolv.conf.
La forma de uso sería: mtk -r estatica 172.26.0.35

Pero no me dicen qué valores debe tener.

¿Me podrías decir como poner dns genéricos?


Título: Re: Duda básica
Publicado por: madpitbull_99 en 1 Marzo 2011, 11:58 am
¿Me podrías decir como poner dns genéricos?

Los DNS no hay que calcularlos. Simplemente tienes que poner la IP del servidor DNS que quieras para ese equipo.

Eso se hace en el archivo /etc/resolv.conf de la siguiente manera:

Código:
nameserver 8.8.8.8
nameserver 8.8.4.4
Ese ejemplo es completamente valido, ya que, se tratan de los servidores DNS públicos de Google.

En caso de disponer de un servidor de nombres (DNS) en la red, habrá que poner la IP de ese servidor en el fichero de configuración DNS.
Por ejemplo, si la IP del servidor DNS de mi red es: 172.26.0.100 y el nombre de dominio de mi red es: elhacker.net el fichero /etc/resolv.conf quedaría de la siguiente manera:

Código:
search elhacker.net
nameserver 172.26.0.100
Como ya he dicho, en la configuración DNS no tienes que calcular nada.