lunes, 21 de julio de 2008

Dial-up y PPP en FreeBSD (un resumen-receta)

En este mensaje deseo contarles mi experiencia en la conección dial-up sobre FreeBSD (fbsd de ahora en más) pues es un mecanismo muy diferente a lo que sucede en linux, pero es iguál de interesante y además para ampliar las fronteras en el conocimineto sobre el mundo Unix-like.
A diferencia de linux en fbsd existe un programa que se encarga de gestionar la conección PPP tanto por "dial-up" como sobre ADSL, sería PPPoE, y hasta PPP sobre TCP. El homologo programa llamado "ppp", este programa actúal sobre el pppd y el chat, pero no es un script como puede ser el ip-up ú otros, es un programa que supervisa el NAT Network Address Traslation, y el PPF Primary Packet Filter, es decir el "ip-masquerade" y un primer "firewall" sobre el protocolo ppp o en pppoe o en pppoatm, etc. Es un mecanismo cetralizado muy completo pero insuficiente si deseamos póliticas de cortafuegos (firewall) muy sofisticadas, sin enbargo en fbsd existe un programa-demonio muy sofisticado para ello el ipfw, no confundir con el ipfwadm de linux este es 1000 veces más sofisticado, y por lo menos 100 veces más que el ipchain. Pero ipfw no admite NAT, esta se gestiona a este nivel por el uso del demónio natd.
En resumen ppp está diseñado para una completa gestión cuando uno desea hacer un "gateway" sobre PPP.
Antes de comensar comentaré algunos detalles colaterales ;). A diferecnia de linux en fbsd se usan dos pseudo dispositivos en las conecciones dial-up uno es el que representa el modem, /dev/cuaa1 en mi caso, COM2, y otro que representa al protocolo PPP, /dev/tunX, donde X=0,1,..etc. dependiendo de cuantas coneccinones concurrentes querramos. Ahora bien en fbsd se tratan a los modem internos como puertos series, para saber si este está instalado basta con hacer:

oscura# dmesg | grep sio
sio0 at port 0x3f8-0x3ff irq 4 flags 0x10 on isa0
sio0: type 16550A
sio1 at port 0x2f8-0x2ff irq 3 on isa0
sio1: type 16550A

sio0 corresponde al mouse y sio1 al modem. Una vez vericada la detección del modem isa-ibm (si es marca IBM aunque no lo crean) hay que activar el registro de ip-foward del núcleo. A diferencia del nucleo linux que usa el pseudo directório /proc en fbsd esto se consigue con el comando "sysctl" ingresando:

oscura# sysctl -w net.inet.ip.forwarding=1

pues la filosofía de trabajo tanto en OpenBSD como en fbsd es comunicarse con los registros del núcleo a travez de "socket-unix". Para que esto se ejecute automáticamente en el booteo basta con poner :

net.inet.ip.forwarding=1

en el archivo /etc/sys.conf. El ppp usa como archivo de pretenciones el /etc/ppp/ppp.conf, un ejemplo es el siguiente:

------------------------------------------------------------------------------
default: #opciones comunes a todos
# instrucciones de "debug"
# set log Phase Chat LCP IPCP CCP tun command
set log Phase Chat tun
ident user-ppp VERSION (built COMPILATIONDATE)

# Ensure that "device" references the correct serial port
# for your modem. (cuaa0 = COM1, cuaa1 = COM2)
#
set device /dev/cuaa1

set speed 57600 #velocidad del modem
set dial "ABORT BUSY ABORT NO\\sCARRIER TIMEOUT 5 \
\"\" AT OK-AT-OK ATE1Q0 OK \\dATDT\\T TIMEOUT 40 CONNECT"
set timeout 600 # 5 minute idle timer (the default)
set openmode active 5 #Espera 5 segundos antes de iniciar LCP
set server /var/run/internet "" 0177 # socket para pppctl
enable dns # request DNS info (for resolv.conf)
resolv readonly
#Paquete que no se desea que mantengan nuestra conección activa

set filter alive 1 permit 0/0 0/0
set filter alive 2 deny 0/0 MYADDR icmp # Ping to us from outside

fonosur: #mi proveedor ISP
#
# edit the next three lines and replace the items in caps with
# the values which have been assigned by your ISP.
#

#Conecciones permitidas el resto por defecto es rechazada
set filter in 0 permit icmp # pings
set filter out 0 permit icmp # pings
set filter out 1 permit tcp dst eq 22 # ssh
set filter in 1 permit tcp src eq 22 estab # ssh
set filter out 2 permit tcp dst eq 80
set filter in 2 permit tcp src eq 80 estab
set filter out 3 permit tcp dst eq 110
set filter in 3 permit tcp src eq 110 estab
set filter out 4 permit tcp dst eq 25
set filter in 4 permit tcp src eq 25 estab
set filter out 5 permit tcp dst eq 119
set filter in 5 permit tcp src eq 119 estab
set filter out 6 permit tcp dst eq 21 # ftp
set filter in 6 permit tcp src eq 21 estab # ftp
set filter in 6 permit tcp src eq 21 estab # ftp
set filter out 7 permit tcp dst eq 20 # ftp-data
set filter in 7 permit tcp src eq 20 dst gt 1023 # ftp-data
set filter out 8 permit udp dst eq 53 # DNS
set filter in 8 permit udp src eq 53 # DNS
set filter in 9 permit 192.168.1.0/24 0/0 # Donde yo laburo
set filter out 9 permit 0/0 192.168.1.0/24 # Donde yo laburo
set filter in 10 permit tcp dst eq 113 # ident
set filter out 10 permit tcp src eq 113 # ident
set filter in 11 permit udp dst gt 1023
set filter out 11 permit udp src gt 1023
set filter in 12 permit tcp dst gt 1023
set filter out 12 permit tcp src gt 1023
set filter in 13 permit tcp src eq 443 estab
set filter out 13 permit tcp dst eq 443

set phone 06106661061
set authname hcaste
set authkey *********
delete default
set ifaddr 10.0.0.1/0 10.0.0.2/0 255.255.255.0 0.0.0.0
add default HISADDR # Add a (sticky) default route
dial
------------------------------------------------------------------------------

Esto merece algunas explicaciones, el archivo se divide en dos secciones

default:

---- instrucciones comunes a todas las conecciones ----

fonosur:

------ propias del ISP fonosur ------

yahoo:

-------- propias del yahoo ISP -----

Con el comando

set log Phase Chat LCP IPCP CCP tun command

obtengo la mayor condición de reportes pero una vez verificada la calidad
de conección hay que reducir los reportes a los mínimos necesarios como se
ve en el ejemplo

(0) set timeout 600 #600 segundos
(1) set openmode active 5 #Espera 5 segundos antes de iniciar LCP
(2) set server /var/run/internet "" 0177 # socket para pppctl
(3) enable dns # request DNS info (for resolv.conf)
(4)resolv readonly

En (0) indico el tiempo de conección inactiva máxima, si se coloca el valor "0" es dedicada.

En (1) le digo que esté en modo pasivo por 5 segundos a espera de la negociación LCP (Line Control Protocol) por parte del proveedor, esto es para evitar cuelgues por conflicto de protocolos.

En (2) le digo donde colocar el socket-unix por el cuál el programa "pppctl" se comunicará con el ppp para cambiar políticas en tiempo real, es decir puedo cambiar cualquier parámetro definidos por el archivo en tiempo de conección, sin tener que hacer ningún hang-up.

En (3) le digo que habilite el uso de dns del proveedor

En (4) le digo que anexe el mío sin modificación, acto contrario si existe conflicto lo decarta si uso solo (3) sin (4).

La instrucción filter permite definir los filtros de paquetes para evitar que se cuelen "piratas hijos de bush ;)", puede estar ubicadas para todos o para cada proveedor, como programarlos es largo de explicar .... Pero admite hasta 40 filtros por sección para algo más fino ya conviene apelar a ipfw y a natd. Las instrucciones para mi proveedor fonosur:

(1) set phone 06106661061
(2) set authname ********
(3) set authkey *********
(4) delete default
(5) set ifaddr 10.0.0.1/0 10.0.0.2/0 255.255.255.0 0.0.0.0
(6) add default HISADDR # Add a (sticky) default route
(7) dial

En (1) se dá en número de TE, (2) y (3) los mecanismos de autenticación PAP

En (4) borro cualquier ruta por defecto, que será restablecida una vez finalizada la conección "dial-up"

En (5) es la parte más indocumentada y es una receta que se usa para buscar mi ip-dinámica

En (6) se usa el router por defecto del proveedor

En (7) se indica que comience el proceso de discado y conección.

Pero falta más aún, debemos indicarle al syslogd que envíe los mensajes del ppp a un archivo en especial, eso lo conseguimos añadiendo lo siguiente en /etc/syslog.conf

!ppp
*.* /var/log/ppp.log

por supuesto hacemos efectivos estos cambios con "killall -HUP syslogd".

Para completar y que no nos aparesca el molesto mensajes "No route to host ipv6" hay que definir un alias al localhost en ipv6, para ello hay que agregar esto en el archivo /etc/hosts:

127.0.0.1 localhost.intranet.ar localhost
::1 localhost.intranet.ar localhost

::1 es el equivalente a la red tipo A reservada 127.x.x.x en ipv6, el fbsd ya viene compilado para entblar conecciones ipv6 como se muestra algunas aplicaciones con el comando sockstat

USER COMMAND PID FD PROTO LOCAL ADDRESS FOREIGN ADDRESS
root sshd 174 8 tcp6 ::1:6010 *:*
root sshd 87 3 tcp46 *:22 *:*
root lpd 85 6 tcp6 *:515 *:*
root syslogd 71 4 udp6 *:514 *:*

Pero mi proveedor tiene Wincho y se niega a negociar con ipv6 como lo indica este mensaje.

Apr 9 15:19:24 oscura ppp[790]: tun0: Phase: deflink: IPV6CP protocol reject closes IPV6CP !

grr! que desperdicio de oprtunidad.

Para finalizar les muestro lo que resulta del comando ifconfig -a este
es diferente al de linux

ed0: flags=8843 mtu 1500
inet 192.168.1.11 netmask 0xffffff00 broadcast 192.168.1.255
inet6 fe80::200:21ff:fea8:4614%ed0 prefixlen 64 scopeid 0x1
ether 00:00:21:a8:46:14
lp0: flags=8810 mtu 1500
lo0: flags=8049 mtu 16384
inet6 ::1 prefixlen 128
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x3
inet 127.0.0.1 netmask 0xff000000
ppp0: flags=8010 mtu 1500
sl0: flags=c010 mtu 552
faith0: flags=8002 mtu 1500
tun0: flags=8010 mtu 1500

ed0 = targeta de red conectado a mi red interna. Tiene dos direcciones una ipv4 y otra ipv6 además del "ethernet-address"

lp0 = impresora

lo0 = red local

ppp0 = no es el ppp de linux sino que se usa en conecciones dedicada por
medio del demónio pppd.

el resto no tiene importancia

tun0 = el asociado al ppp

En este último caso no reporta nada pues no esto conectado, sino da todos los datos.

Y finalmete como root ingreso el comando

oscura# ppp -nat -background fonosur

para conectarme a mi proveedor, cabe destacar que la opción -nat le dice a ppp que utilice toda la ingeniría NAT (ip-foward, masquerade) -background que pase como demonio y con "fonosur" elijo a quien conectarme.

Para desconectarse basta con tipear

oscura# pppctl /var/run/internet set timeout 300\; close

Y esto cierra la conección correctamente, otra mas peligrosa es matar al demonio pero yo no la recomiendo.

Finalemte cuando nos conectemos las tablas de ruteo serán

default 200.43.48.132 UGSc 0 0 tun0
localhost localhost UH 0 64 lo0
localnet link#1 UC 2 0 ed0
clara 00:00:21:43:ca:26 UHLW 1 3239 ed0 1132
oscura 00:00:21:a8:46:14 UHLW 1 64 lo0
200.43.48.132 tc151.steel.com.ar UH 2 0 tun0

fijense que el dispositivo es el tun0 no el ppp0!

1 comentario:

Anónimo dijo...

Hola

intente hacer una conexión desde Freebsd 7.0 y no me funciona.

Me sale esto :

Warning:0.0.0./0: Change route: failed: errno: Network is unreachable