[LUG.ro] Point-to-Point en FreeBSD (un resumen-receta)
Horacio Castellini
lugro@lugro.org.ar
Thu, 10 Apr 2003 15:27:21 -0300 (ART)
Hola Linuxeros:
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, ATM, 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).
Como no existe driver para el voice-modem interno que usa micro pctel,
justo se dió la oportunidad y compré un modem isa-ibm, no jumperless de
33.4 kbs. Que si lo reconoce el núcleo generico del fbsd, 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
psudo 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 "hun-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 progrmarlos 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 mustro lo que resulta del comando "ifconfig -a" (este
es diferente al de linux ;( )
ed0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> 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<POINTOPOINT,SIMPLEX,MULTICAST> mtu 1500
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
inet6 ::1 prefixlen 128
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x3
inet 127.0.0.1 netmask 0xff000000
ppp0: flags=8010<POINTOPOINT,MULTICAST> mtu 1500
sl0: flags=c010<POINTOPOINT,LINK2,MULTICAST> mtu 552
faith0: flags=8002<BROADCAST,MULTICAST> mtu 1500
tun0: flags=8010<POINTOPOINT,MULTICAST> 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!
Bueno espero que esto los entuciasme.
Saludos Horacio