ipchains - IP administración de cortafuegos
ipchains -[ADC] cadena especificación-de-regla
[opciones]
ipchains -[RI] cadena numero-regla especificación-de-regla
[opciones]
ipchains -D cadena numero-regla [opciones]
ipchains -[LFZNX] [cadena] [opciones]
ipchains -P cadena objetivo [opciones]
ipchains -M [ -L | -S ] [opciones]
Ipchains se usa para configurar, mantener e inspeccioar las
reglas de cortafuegos IP del núcleo Linux. Estas reglas se pueden
dividir en 4 categorías diferentes: la cadena de entrada IP, la
cadena de salida IP, la cadena de reenvío IP y las cadenas definidas
por el usuario.
Para cada una de estas categorías se mantiene una tabla de
reglas separada, cualquiera de las cuales podría remitir a una de las
cadenas definidas por el usuario.
Váease ipfw(4) para más detalles.
Una regla de cortafuegos especifica citerios para un paquete y un
objetivo. Si el paquete no concuerda se examina la siguiente regla de la
cadena; si concuerda, la siguiente regla se especifica por el valor del
objetivo, que puede ser el nombre de una cadena definida por el usuario o
uno de los valores especiales ACCEPT, DENY, REJECT,
MASQ, REDIRECT o RETURN.
ACCEPT significa dejar pasar el paquete. DENY
significa tirar el paquete al suelo (denegar). REJECT significa lo
mismo que denegar, pero más educado y fácil de depurar, ya que
devuelve en mensaje ICMP al remitente indicando que el paquete fue
elliminado. (Observe que DENY y REJECT son lo mismo para
paquetes ICMP).
MASQ es sólo legal para reenvío y cadenas
definidas por el usuario, y sólo se puede usar cuando el
núcleo está compilado con CONFIG_IP_MASQUERADE
definida. Con esto, los paquetes se enmascaran como si estuvieran originados
desde el host local. Más aún, los paquetes devueltos
serán reconocidos y desenmascarados automáticamente y entonces
pasados a la cadena de reenvío.
REDIRECT es sólo legal para las cadenas de entrada y
definidas por el usuario, y sólo se puede usar cuando en
núcleo linux está compilado con
CONFIG_IP_TRANSPARENT_PROXY definido. Con esto, los paquetes se
redirigen al socket local, incluso si son enviados a un host remoto. Si el
puerto de redirección especificado es 0, que es el valor por defecto,
el puerto objetivo de un paquete se usa como puerto de redirección.
Cuando se usa este objetivo, se puede suministrar un argumento extra, el
número de puerto.
Si se llega al final de una cadena definida por el usuario, o se
concuerda con una regla con objetivo RETURN, se examina la siguiente
regla de la cadena previa (llamada). Si se llega al final de una cadena
predefinida o se concuerda con una regla de la cadena predefinida con el
objetivo RETURN el objetivo especificado por la política de la
cadena determina el destino del paquete.
Las opciones que reconoce ipchains se pueden dividir en
varios grupos diferentes.
Estas opciones indican la acción específica que hay
que realizar; sólo se puede especificar una de ellas en la
línea de mandatos, salvo que más abajo se especifique lo
contrario. En todas las versiones largas de los nombres de mandatos y
nombres de opciones, sólo es necesario especificar suficientes letras
para asegurarse de que ipchains puede distinguirla de las otras
opciones.
- -A, --append
- Añade una o más reglas al final de la cadena seleccionada.
Cuando los nombres origen y/o destino se resuelven a más de una
dirección, se añade una nueva regla para cada posible
combinación de dirección.
- -D, --delete
- Elimina una o más reglas de la cadena seleccionada. Hay dos
versiones de este comando: la regla se puede especificar como el
número de la cadena (empezando en 1 para la primera regla) o como
una regla que concuerde.
- -R, --replace
- Sustituye una regla de la cadena seleccionada. Si los nombres origen y/o
destino se resuelven a múltiples direcciones, el mandato
fallará. Las reglas se numeran comenzando por 1.
- -I, --insert
- Inserta una o más reglas en la cadena seleccionada con el
número indicado de regla. Así, si la regla tiene el
número 1 la regla o reglas se insertan al principio de la
cadena.
- -L, --list
- Muestra todas las reglas de la cadena seleccionada. Si no hay cadena
seleccionada, se listan todas las cadenas. Es legal especificar la
opción -Z (cero) también, en cuyo caso no se puede
especificar cadena. La salida exacta está determinada por los otros
argumentos indicados.
- -F, --flush
- Vacía la cadena seleccionada. Es equivalente a borrar todas las
reglas una a una.
- -Z, --zero
- Pone a cero los contadores de octetos y paquetes de todas las cadenas. Es
legal specificar la opción -L, --list (list) también,
para ver los contadores inmediatamente antes de que sean borrados; si se
hace esto no se puede indicar una cadena específica. (Esto
mostrará y borrará todo).
- -N, --new-chain
- Crea una nueva cadena definida por el usuario con el nombre dado. No puede
haber un objetivo con ese nombre existente.
- -X, --delete-chain
- Borra la cadena definida por el usuario especificada. No pueden haber
referencias a la cadena (si hay tiene que borrar o sustituir las referidas
reglas antes de poder borrar la cadena). Si no se dan argumentos,
intentará eliminar todas las cadenas no predefinidas.
- -P, --policy
- Fija la política para la cadena con un destino dado. Véase
la sección OBJETIVOS para los objetivos legles. Sólo
las cadenas no definidas por el usuario pueden tener políticas, y
ni las cadenas predefinidas ni las definidas por el usuario pueden ser
objetivos de política.
- -M, --masquerading
- Esta opción permite ver las conexiones enmascaradas actualmente (en
conjunción con la opción -L) o fija los
parámetros de enmascaramiento del núcleo (con la
opción -S).
- -S, --set tcp tcpfin
udp
- Cambia los plazos de tiempo (timeouts) usados para enmascaramiento Este
comando siempre toma 3 parámetros, que representan los valores de
los temporizadores (en segundos) para sesiones TCP, sesiones TCP tras
recibir un paquete FIN, y paquetes UDP respectivamente. Un valor de
temporizador 0 significa que se conserva el valor correspondiente de la
entrada. Esta opción sólo está permitida en
combinación con la bandera -M.
- -C, --check
- Verifica el paquete dado con la regla seleccionada. Es extremadamente
útil para comprobar, ya que se usan las mismas rutinas del
núcleo para verificar paquetes "reales" se usan para
verificar este paquete. Se puede usar para verificar cadenas definidas por
el usuario y cadenas predefinidas. Los mismos argumentos que se usan para
especificar reglas de cortafuegos son los que se usan para construir el
paquete el paquete que se quiere comprobar. En particular son obligatorias
las banderas -s (origen), -d (destino), -p
(protocolo) y -i (interfaz).
- -h
- Ayuda. Da una descripción (actualmente breve) de la sintaxis del
mandato.
Los siguientes parámetros afectan las especificaciones de
reglas (como se usan en los mandatos add, delete, replace, append y
check).
- -p, --protocol[!]
protocol
- El protocolo de la regla del paquete que se quiere verificar. El protocolo
especificado puede ser uno de los siguientes: tcp, udp,
icmp o all, o puede ser un valor numérico, que
representa uno de estos protocolos u otro diferente. También
está permitido un protocolo de nombre de /etc/protocols. Un
argumento "!" antes del protocolo invierte el test. El
número cero es equivalente a all. Protocolo all
concordará con cualquier protocolo y es tomado por defecto cuando
se omite esta opción. All no se puede usar en
combinación con el mandato check.
- -s, --source [!]
dirección/máscara] [!]
[puerto[:puerto]]
- Especificación de origen. Dirección puede ser un
nombre de host, un nombre de red o una simple dirección IP. La
máscara puede ser una máscara de red o un simple
número que especifique el número de unos (1) a la izquierda
en la máscara de red. Así, una máscara de 24
es equivalente a 255.255.255.0. Un argumento "!" antes de
la especificación de dirección invierto el sentido de la
dirección.
El origen puede incluir especificaciones de puertos o tipo
ICMP. Esto puede ser bien un nombre de servicio, un número de
puerto, un tipo numérico ICMP o uno de los nombres de tipo ICMP
mostrados por el mandato ipchains -h icmp. Observe que muchos de
estos nombres ICMP se refieren al tipo y código, lo que significa
que un código ICMP tras la bandera -d es ilegal. En el
resto de este párrafo, un port significa bien una
especificación de puerto o un tipo ICMP. Se puede especificar un
rango usando el formato puerto:puerto. Si se omite el
primer puerto se supone "0"; si se omite el último, se
supone "65535".
Los puertos se pueden especificar sólo en
combinación con los protocolos tcp, udp o
icmp Un "!" antes de la especificación de puerto
invierte el sentido. Cuando se especifica el mandato check, se requiere
sólo un puerto, y si se especifica la bandera -f
(fragmento) no se permiten puertos. La bandera --src es un alias
para esta opción.
- --source-port
[!] [puerto[:puerto]]
- Esto permite separar las especificaciones del puerto origen o rango de
puertos. Véase la descripción anterior de la bandera
-s para más detalles. La bandera --sport es un alias
de esta opción.
- -d, --destination [!]
dirección[/máscara] [!]
[puerto[:puerto]]
- Especificación de destino. Véase la descripción de la
bandera -s (origen) para una detallada descripción de la
sintaxis. Para ICMP, que no tiene puertos un "puerto destino" se
refiere a un código numérico ICMP. La bandera --dst
es un alias de esta opción.
- --destination-port
[!] [puerto[:puerto]]
- Esto permite separar especificacioens de puertos. Véase la
descripción de la bandera -s para los detalles. la bandera
--dport es un alias de esta opción.
- --icmp-type
[!] nombre-de tipo
- Esto permite especificaciones de tipo ICMP This allows specification of
the ICMP type (use la opción -h icmp para ver los nombres de
tipo ICMP válidos). Con frecuencia es más conveniente
añadirlo a las especificacones de destino.
- -j, --jump
objetivo
- Esto especifica el objetivo de la regla; i.e., qué hacer con el
paquete si concuerda con la regla. El objetivo puede ser una cadena
definida por el usuario (no en la que está la regla) o uno de los
objetivos especiales que decide el destino del paquete de forma inmediata.
Si omitimos esta opción en una regla, entonces la concordancia no
tendrá efecto sobre el destino del paquete, pero se
incremnetarán los contadores de la regla.
- -i, --interface [!]
nombre
- Nombre opcional de un interfaz a través del cual se reciben los
paquetes, o mediante el cual salen los paquetes se envían. Cuando
se omite esta opción se supone una cadena vacía, que tiene
un significado especial, y concordará con cualquier nombre de
interfaz. Cuando se usa el argumento "!" antes del nombre de
interfaz, se invierte el sentido. Si el nombre de interfaz termina en un
"+" entonces concordará cualquier nombre de interfaz que
empiece con ese nombre.
- [!] -f, --fragment
- Esto significa que la regla sólo se refiere al segundo o siguientes
fragmentos de paquetes fragmentados. Como no hay forma de indicar los
puertos origen y destino de tales paquetes (o tipo ICMP), esos paquetes,
tales paquetes no verificarán ninguna regla que los especifique.
Cuando el argumento "!" precede a la bandera -f, se invierte el
sentido.
Se pueden especificar las siguientes opciones adicionales:
- -b,
--bidirectional
- Modo bidireccional. La regla concordará con los paquetes IP en
ambas direcciones; esto tiene los mismos efectos que repetir la regla
cambiando origen y destino.
- -v, --verbose
- Salida documentada. Esta opción hace que el mantato list muestre la
driección del interfaz, las opciones de la regla (si hay) y las
máscaras TOS. Los contadores también se muestran con los
sufijos 'K', 'M' o 'G' para multiplicadores 1000, 1,000,000 y
1,000,000,000 respectivamente (pero vea la bandera -x para cambiar
esto). Cuando se usa en combinación con -M, la
información relativa a los núeros de secuencia delta
también se mostrarán. Para añadir, insertar, borrar y
sustituir, esto hace que se muestre inforamción detallada sobre la
regla.
- -n, --numeric
- Salida numérica Las direcciones IP y los números de puertos
se imprimirán en formato numérico. Por defecto, el programa
intentará mostrarlos como nombres de hosts, nombres de redes o
servicios (cuando sea aplicable).
- -l, --log
- Activa el registro del núcleo de los paquetes que concuerden.
Cuando esta opción está activa para una regla, el
núcleo Linux imprimirá cierta información de todos
los paquetes que concuerden (como la mayoría de los campos de
cabeceras IP) mediante printk().
- -o, --output
[tamaño-máximo]
- Copia los paquetes al dispositivo espacio de usuario. Esto es en la
actualidad principalmente para desarrolladores que quieren jugar con
efectos de cortafuegos en su espacio. El argumento opcional
tamaño-máximo se puede usar para limitar el máximo
número de bytes del paquete que se van a copiar. Esta opción
sólo es válida si el núcleo se ha compilado con
CONFIG_IP_FIREWALL_NETLINK activo.
- -m, --mark
valor-marca
- Marca paquetes concordados. Los paquetes se pueden marcar con un valor
entero sin signo de 32 bits que (algún día) puede cambiar su
manejo interno. Si no es un "kernel hacker" no es probable que
tenga que preocuparse por esto. Si la cadena valor-marca empieza
con + o -, este valor se añade o resta del valor actual del valor
de marca de paquetes (que empieza en cero).
- -t, --TOS andmask
xormask
- Máscara usada para modificar el campo TOS de la cabecera IP. Cuando
un paquete concuerda con una regla, a su campo TOS, priemero se hace un
and con la primera máscara y al resultado de esto se le hace un xor
con la segunda máscara. Las máscaras se tiene que
especificar como valores hexadecimales de 8-bit. Como el LSB del campo TOS
debe quedar inalterado (RFC 1349), los valores TOS, que hicieran que se
alterase, se rechazan, como es cualquier regla que siempre ponga
más que el bit TOS. Las reglas que podrían poner
múltiples bits TOS para ciertos paquetes originan avisos (enviados
a stdout) que se pueden ignorar si sabe que paquetes con valores TOS
nuncan alcanzarán esta regla. Obviamente manipular el TOS es un
gesto sin sentido si el objetivo de la regla es DENY o
REJECT.
- -x, --exact
- Expande números. Muestra el valor exacto de los contadores de bytes
y paquetes en lugar de sólo los números redondeados en K
(múltiplos de 1000) M (múltiplos de 1000K) o G
(múltiplss de 1000M). Esta opción sólo es relevante
para el mandato -L.
- [!] -y, --syn
- Sólo concuerda con paquetes TCP con el bit SYN activo y los bits
ACK y FIN limpios. Tales paquetes se usan para las solicitudes de inicio
de conexión TCP; por ejemplo, bloqueando tales paquetes entrantes
en un interfaz, prevendrá las conexiones TCP, pero las conexioenes
salientes no se verán afectadas. Esta opción sólo
tiene sentido cuando el tipo de protocolo está como TCP. Si la
bandera "!" flag precede al "-y", el sentido de la
opción se invierte.
/proc/net/ip_fwchains
/proc/net/ip_masquerade
No hay forma de reiniciar los contadores de paquetes y bytes en
una única cadena. Es una limitación del núcleo.
No se realiza la detección de bucles en ipchains; los
paquetes en un bucle se eliminan y se registran, pero esto será lo
primero que encontrará sobre esto si accidentalmente crea un
bucle.
La explicación de qué efectos tiene marcar un
paquete es vaga intencianlamente hasta que se publique la
documentación del núcleo que describe las rutinas de
secuenciación de paquetes del núcleo.
No hay forma de poner a cero los contadores de política
(i.e. las cadenas predefinidas).
Este ipchains es muy diferente al ipfwadm by Jos Vos, ya
que usa los nuevos árboles de cortafuegos IP. Su funcionalidad
incluye ipfwadm, y hay normalmente una aplicación 1:1 de los
mandatos. Hay, sin embargo, algunos cambios con los que debería tener
cuidado.
Los fragmentos se manejan de diferente forma. Todos los fragmentos
tras el primero usado se dejan pasar (que normalmente es seguro); ahora se
pueden filtrar. Esto significa que probablemente añadirá una
regla específica para aceptar fragmentos si los está
convirtiendo. También busque las antiguas reglas de contabilidad que
verifican los puertos origen y destino de 0xFFFF (0xFF para paquetes ICMP)
que era la anterior forma de contabilizar los fragmentos.
La reglas de contabilidad ahora simplemente están
integradas en las cadenas de entrada y salidad; puede simular el anterior
comportamiento como:
ipchains -N acctin
ipchains -N acctout
ipchains -N acctio
ipchains -I input -j acctio
ipchains -I input -j acctin
ipchains -I output -j acctio
ipchains -I output -j acctout
Esto crea tres cadenas definidas acctin, acctout y
acctio, que son para contener cualquier regla de contabilidad (estas
reglas se deberían especificar sin una bandera -j para que los
paquetes simplemente lo pasen sin perjudicar nada).
A MASQ o REDIRECT objetivos encontrados por el
núcleo fuera de lugar (i.e. no durante una regla de reenvío o
de entrada respectivamente) ocasionarán un mensaje a syslog y que el
paquete sea descartado.
El anterior comportamiento de concordancias con SYN y ACK (que era
previamente ignorado para paquetes no TCP) ha cambiado; la opción SYN
no es válida para reglas no específicas TCP.
La opción de concordancia ACK ( -k) ya no se
soporta; la combinación de ! y -y proporcionan la
equivalencia).
Ahora es ilegal especificar una máscara TOS que acitve o
modifique el bit TOS menos significativo; previamente las máscaras
TOS eran modificadas silenciosamente por el núcleo si intentaban
hacer esto.
La bandera -b ahora se gestiona simplemente insertando o
borrando un par de reglas, una con las especificaciones de origen y destino
intercambiadas.
No hay forma de especificar un interfaz por dirección: use
su nombre.
Rusty Russell <Paul.Russell@rustcorp.com.au>