Compartir conexión a internet en linux (compatible con Windows XP)

+1
0
-1

Muchas veces tenemos en casa más de un PC que accede a través del nuestro a internet con la conexión compartida de windows xp, y queremos hacer lo mismo con linux para que los demás puedan seguir conectandose a internet mientras usemos linux.

Doy por supuesto que ya teneis configurado los 2 dispositivos de red, uno conectado a la red local y otro a internet (para el ejemplo supondremos que nuestro pc tiene en la red local la ip 192.168.0.1 y mascara de subred 255.255.255.0)
La mejor manera es crear un script que se cargue al iniciar el sistema y que configure las reglas de iptables, que es un firewall integrado en el kernel que también permite el enroutamiento de conexiones.

Tenemos que hacer lo siguiente:

1.- Creamos un nuevo archivo que vamos a editar:


$ sudo gedit /etc/init.d/iptablesconf

2.- Ahora copiamos y pegamos el siguiente script en el editor de texto, sólo tenemos que modificar las 5 cadenas que están en negrita, donde pone eth1 y eth0 lo revisaremos para ver si efectivamente eth1 y eth0 son nuestros dispositivos de red conectados a internet y a la red local respectivamente.

Lo siguiente es por si queremos redigir cierto puerto a un ordenador de la red (que llamaremos pc2) local para que pueda por ejemplo usar el emule o tener activo un servidor ftp, etc.. , se supone que en el ejemplo redirigiremos en puerto 7778 tcp y 7779 udp al pc con la ip 192.168.0.2

Si no estamos interesados en redirigir puertos podemos borrar/comentar esas 3 variables.

#### SCRIPT DE CONFIGURACION DE IPTABLES ####
#!/bin/bash

# Dispositivo de red de internet
EXIF="eth1"
# Dispositivo de red local
INIF="eth0"

# Puertos tcp que se desean redirigir (separados por espacios)
puertosTCP="7778"
# Puertos udp que se desean redirigir (separados por espacios)
puertosUDP="7779"
# ip a la que se le redirigen los puertos
pc2="192.168.0.2"

fail=0

[ -f /etc/default/rcS ] && . /etc/default/rcS
. /lib/lsb/init-functions

log_begin_msg "Aplicando Reglas de Firewall..."

## Borrado de reglas anteriores
iptables -F || fail=1
iptables -X || fail=1
iptables -Z || fail=1
iptables -t nat -F || fail=1

## Establecemos politica por defecto
iptables -P INPUT ACCEPT || fail=1
iptables -P OUTPUT ACCEPT || fail=1
iptables -P FORWARD DROP || fail=1
iptables -t nat -P PREROUTING ACCEPT || fail=1
iptables -t nat -P POSTROUTING ACCEPT || fail=1

# Marcar paquetes salientes con su ip de origen
iptables -t nat -A POSTROUTING -o $EXIF -j MASQUERADE || fail=1
# Reenvio de IP
echo 1 > /proc/sys/net/ipv4/ip_forward || fail=1

# Aceptar paquetes para reenviar procedentes de la red local
iptables -A FORWARD -i $INIF -o $EXIF -j ACCEPT || fail=1
# Aceptar paquetes para reenviar procedentes de internet de conexiones ya establecidas
iptables -A FORWARD -i $EXIF -o $INIF -m state --state RELATED,ESTABLISHED -j ACCEPT || fail=1

##Se redirigen los puertos configurados arriba

for puerto in $puertosTCP
do
iptables -A FORWARD -i $EXIF -o $INIF -p tcp --dport $puerto -j ACCEPT || fail=1
iptables -t nat -A PREROUTING -i $EXIF -p tcp --dport $puerto -j DNAT --to $pc2:$puerto || fail=1
done

for puerto in $puertosUDP
do
iptables -A FORWARD -i $EXIF -o $INIF -p udp --dport $puerto -j ACCEPT || fail=1
iptables -t nat -A PREROUTING -i $EXIF -p udp --dport $puerto -j DNAT --to $pc2:$puerto || fail=1
done

# Se muestran los resultados
log_end_msg $fail

if [ $fail -eq 0 ]
then
log_success_msg "Verifique que lo que se aplica con: iptables -L -n."
else
log_warning_msg "Se ha producido un error al aplicar alguna de las reglas"
fi

#### FIN SCRIPT DE CONFIGURACION DE IPTABLES ####

3.- Guardamos los cambios y le damos permisos de ejecucion:

$ sudo chmod -v 755 /etc/init.d/iptablesconf


el modo de «iptablesconf» cambia a 0755 (rwxr-xr-x)
Lo ejecutamos:

$ sudo /etc/init.d/iptablesconf


si todo ha ido bien veremos este mensaje:
* Aplicando Reglas de Firewall... [ ok ]
* Verifique la reglas: iptables -L -n.
Ahora utilizamos el siguiente comando para que script se cargue cada vez que arranque el sistema:

$ sudo update-rc.d iptablesconf start 20 2 .


#### ATENCIÓN AL PUNTO DEL FINAL, HAY QUE PONERLO ####

Adding system startup for /etc/init.d/iptablesconf ...
/etc/rc2.d/S20iptablesconf -> ../init.d/iptablesconf

4.- Ahora podemos probar si todo funciona, nos vamos a los otros PCs y configuramos la red con ips estaticas (por ej 192.168.0.2 , 192.168.0.3 , etc..) y su correspondiente mascara de subred (255.255.255.0 para el ejemplo) utilizamos como puerta de enlace el pc que comparte la conexión (192.168.0.1 en el ejemplo) y como servidores dns utilizamos los mismos que tenga configurados el pc que da acceso a internet, que podemos verlos utilizando

$ cat /etc/resolv.conf

Ahora si todo ha ido bien debería funcionar internet en los otros PCs una vez configurados.

Comentarios

Imagen de ExDead

Yo tengo cablemodem en mi casa y mi hermana tiene el interent y me pasa un poco por lan. en windows XP tenia que configurar desde la PC de mi hermana para tener red/internet pero en la instalacion de ubuntu me lo dectecto automaticamente. chevere no? gracias detodos modos mober por el post.

------------------------------
ExDead: Pablo_calderon_piedra@hotmal.com para el MSN

Imagen de ZialdoKA

A mi me sucedio lo mismo cosa qeu me alegro enormemente, instalar y que sin hacer nada pues ya estés en Internet. Maravilloso.

Si bien, no me queda claro que aun teniendo esa suerte, es recomendable hacer lo que comentas con los iptables, por mayor seguridad.

Imagen de lifeguarda

Joer to lo que hay que hacer!!! Yo me quité de lios y compre un router, a mi me costo bastante pero ahora te los regalan hasta con la mortadela.

Imagen de mober

Bueno, si, es cierto que hay formas más fáciles de hacerlo, como han dicho antes con firestarter por ejemplo, pero igual a alguien le interesa aprender algo de iptables y tal, yo hasta hace un par de semanas no sabía nisiquiera lo que era iptables y después de leerme mucha documentacion/howtos/manuales/tutoriales etc.. pues he aprendido a configurarlo bastante a fondo hasta el punto de hacerme el script.
Además muchos preferimos hacer las cosas de esta manera y aprender como funciona internamente el sistema que usar un asistente que te lo hace todo y mágicamente las cosas funcionan si saber como.
Saludos ;D

Imagen de Anónimo

excelente artículo!, me ha resultado tan fácil como el firestarter

Imagen de Anónimo

no he seguido exactamente lo que dice esta guia pero viene a cuento.

tengo en casa dos ordenadores con kubuntu 5.10 instalados en los dos.
la cuestion es q kiero q uno de ellos (el mas viejo) comparta la conexion, asi k en el "servidor" he puesto estas reglas:

iptables --table nat --append POSTROUTING --out-interface ppp0 -j MASQUERADE
iptables --append FORWARD --in-interface eth0 -j ACCEPT
echo 1 > /proc/sys/net/ipv4/ip_forward

---
donde ppp0 es la interfaz q esta conectada a internet, (uso in winmodem de mierda) y eth0 es la conexion local, q da salida al otro ordenador.

despues he puesto esto en el cliente:

route add default gw 192.168.0.1

y con eso, el cliente puede hacer ping, y puede visualizar la pagina de google y hacer busquedas. pero cuando trato de entrar en alguna pagina ahi se keda.

pense que seria por las DNS, asi k he probado a poner en los dos la misma q traia el kubuntu y nada, y tb he probado a poner en los dos las que dan en telefonica (ip dinamica) y tp, pasa lo mismo, y por ultimo pues probe una distinta en cada uno (por probar.. kien sabe) y tampoco nada de nada, ahi se keda, en google.

despues de leerme muchos post y manuales me kedo igual.
¿alguna sugerencia?

gracias.

Imagen de mober

para saber si lo que fallan son las dns prueba a hacer un ping a un host y después a su ip, si el ping al host falla y a la ip recibes respuesta es porque falla la dns

$ ping www.cisco.com
$ ping 198.133.219.25

y tampoco estoy seguro pero las dns no son prueba a añadir
iptables -A FORWARD -i eth0 -o ppp0 -m state --state RELATED,ESTABLISHED -j ACCEPT

Imagen de Anónimo

hola mober,

pues parece ser q tienes razon y las dns no son, porque si que funciona hacer ping a cisco.com por ejemplo.

he probado ha poner la regla del iptables que has escrito, y nada, lo mismo, de la pagina de google no pasa, esta tan cerca...

gracias de todos modos.

Imagen de Anónimo

Hola,

Mober muchas gracias por tu ayuda- Es realmente muy claro. El único problema que tengo es que funciona con algunas páginas y con otras no. En la PC cliente no puedo entrar a páginas como www.clarin.com o www.uol.com.ar. La máquina que accede a internet usa Mandriva 2006 y la cliente Windows ME. Desactivé Squid.

¿Alguna idea?

Imagen de LoncO

Alguien tendrá por casualidad el squid configurado para una lan, donde el proxy está en la 192.168.0.1, y usa un proxy transparente, limitando el ancho de banda para X maquinas?
No puedo dar en la tecla.
Alguno me podrá pasar su squid.conf por favor?
Desde ya, mil gracias!

Imagen de Hermes81

Gracias...ayer estube dandole la vuelta todo el dia con el Firestarter no me funciono nunca la conexion compartida a Internet. Pero probe el Script y funciono muy bien...Se agradece

Imagen de Anónimo

sudo iptables -F
sudo iptables -X
sudo iptables -Z
sudo iptables -t nat -F
sudo bash -c "echo 1 > /proc/sys/net/ipv4/ip_forward"
sudo /sbin/iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

weno y si por ahi sabes hacer un forward de puertos para el puerto 80 a una makina de mi red internna me lo pasas porfa que toy que me rompo la cabeza buscando jajaja...byes..

Imagen de mober

a ver, me parece que no ha quedado claro, el tutorial es para compartir la conexion a internet en tu pc con linux y que los demás se conecten a internet a través de él. No para conectarte a internet a través de un pc con windows xp, xp monta un servidor dhcp al configurar la conexión compartida a internet y en resto de PCs no hay q configurar nada, el servidor dhcp sirve los datos de la configuración al resto de PCs

Imagen de Anónimo

Yo lo hago Firestarter y su opcion de compartir internet....Creo que es mucho mas sencillo que todo lo de arriba. Aunque envidio tus conocimientos de redes e iptables :D

Imagen de mober

ups ;P

Imagen de ronald

Hola Mober,
Muy bueno su aporte, interesante, pero debemos pensar también en el usuario final, para ello simplemente el Firestarter[1] sencillo y efectivo.

[1] http://www.fs-security.com/
Salu2,
Ronald E.
Linux User: 366835
Ubuntu Rules!

Salu2,
Ronald E.
Linux User: 366835
Ubuntu Rules!

Imagen de Anónimo

Borrado de Reglas

¿Esto no nos deja sin el cortafuegos de cara al exterior para nuestra maquina con linux?

¿No habria que asegurarse que el script cargara primero que nuestro cortafuegos?

Buen articulo.

Imagen de Anónimo

Esto borra las reglas del iptables para acto seguido aplicar nuevas reglas, el script que aqui he puesto simplemente sirve para enroutar las conexiones y en ningún momento he aplicado reglas para hacer uso de él como cortafuegos pues como veis en el script la politica por defecto para los paquetes entrantes y salientes es aceptar, el que quiera aparte de enroutar conexiones tendrá que modificar el script para adaptarlo a sus necesidades o bajarse un cortafuegos como el firestarter

Imagen de arriero

Firestarter no es un cortafuegos, en realidad es un fronted de iptables
el cual usaras como cortafuegos en linux aunque es algo mas q un fronted es tu mejor amigo para manejar las iptables y sus reglas mas facilmente, q tener q hacerlas y buscarlas por internet como un poseso. :-)
..................................................
Las mejores ideas son propiedad de todos.
Séneca.Epístolas, siglo I d.C.
Mi blog

Si reparas tu problema, añade(Solucionado)en el asunto de tu primer post, así es mas fácil para el que busca después.Mi Blog

Imagen de Anónimo

Gracias y enhorabuena.
Me ha funcionado de maravilla.
Incluso he puesto los puertos del emule de mi XP y me ha dado ip alta :-)

# Puertos tcp que se desean redirigir (separados por espacios)
puertosTCP="4661 4662 4672"
# Puertos udp que se desean redirigir (separados por espacios)
puertosUDP="4661 4662 4672"
# ip a la que se le redirigen los puertos
pc2="192.168.0.3"

Mi pregunta es ¿Cómo puedo redirigir otros puertos a otros equipos de la red. Como quedaría?

Gracias.

Imagen de Anónimo

En el caso de que la red interna se conecte a través de tarjetas inalámbricas ¿habría alguna variación en cuanto al script o al proceso en general?

Gracias.

Imagen de Anónimo

Mira, la wifi se comparta como una red local, siempre y cuando estes conectado.

Lo he hecho y me ha funcionado.

Imagen de Anónimo

por favor diganem que esta mal:/ de este script no funciona el forward de direcciones del puerto 80:(.....
#!/bin/sh
echo -n Aplicando Reglas de Firewall
##FLUSH
sudo iptables -F
sudo iptables -X
sudo iptables -Z
sudo iptables -t nat -F
##Politica por defecto
sudo iptables -P INPUT ACCEPT
sudo iptables -P OUTPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -t nat -P PREROUTING ACCEPT
sudo iptables -t nat -P POSTROUTING ACCEPT

#REDIRECCIONES eth0= internet, eth1= local
#todo lo que venga del exterior y vaya al puerto 80 lo redirigimos a una maquina interna
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 192.168.0.2:80
#Acceso de redlocal al exterior
sudo iptables -A FORWARD -s 192.168.0.0/24 -i eth1 -p tcp --dport 80 -j ACCEPT
sudo bash -c "echo 1 > /proc/sys/net/ipv4/ip_forward"
sudo /sbin/iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Imagen de Anónimo

Instalando Squid (proxy server) y configurándolo (cambiando una única línea del fichero /etc/squid/squid.conf) para que sólo las ip's de nuestra LAN permitan cruzar el proxy.

Ésto hace que sea seguro puesto que sólo permites a tus ip´s salir a internet. En fin, sin complicaciones.

Imagen de dexter0308

Hola amigos, por favor quisiera saber cuales son los pasos para compartir internet en una LAN con 21 computadoras, una de ellas le instalado el Linux Ubuntu; y tengo 2 tarjetas de red instalado por una de ellas entra mi linea de internet y por la otra quiero que salga al resto de las computadoras; quisiera una ayuda paso por paso porque recien estoy aprendiendo linux ubuntu. Enviar una respuesta al pdextre03@hotmail.com
Espero su apoyo gracias.

Imagen de Anónimo

en win xp ocupu un cable cruzado para poder tener el otro pc con internet..
aqui en linux para dar internet cual ocupo.. uno punto a punto o el mismo cruzado..
por que intentado y no me resulta para nada..
si alguien es amable en ayudr.. aqui dejo mi msn
subcool_69@hotmail.com

saludos!

Imagen de Anónimo

Hola.
Gracias a este post pude resolver un problema que tenia en mi casa, porque tengo internet con un equipo con Windows 2000 y Xubuntu, con el que comparto internet a otro equipo con Windows 98.

Pero no se porque... ahora quise hacerlo de nuevo, y no me sale.

Segun los pasos, esta todo OK.
Pero no consigo que el segundo PC tenga internet.

Al poner:
iptables -L -n

Me da el siguiente resultado:

Chain INPUT (policy ACCEPT)
target prot opt source destination

Chain FORWARD (policy DROP)
target prot opt source - destination
ACCEPT all -- 0.0.0.0/0 - 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 - 0.0.0.0/0 - state RELATED,ESTABLISHED
ACCEPT tcp -- 0.0.0.0/0 - 0.0.0.0/0 - tcp dpt:7778
ACCEPT udp -- 0.0.0.0/0 - 0.0.0.0/0 - udp dpt:7779

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

No se mucho, no se como interpretar la tabla que me muestra
Pero me imagino que esos "0.0.0.0/0" no deberian salir
y en vez de eso deberia salir en alguna parte el 192.168.0.1, 192.168.0.2, mi IP actual... etc.

Ojala me puedan ayudar, gracias

No se si habrá influido en algo el que haya instalado squid, como decian aqui, pero no lo pude hacer funcionar, y prefiero hacerlo "a mano" y tratar de aprender como funciona, en vez de que un programa me lo haga todo.