[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