realm :: Combina com o domínio de roteamento. "realms" de roteamento são utilizados em configurações de roteamento complexas envolvendo protocolos de roteamento dinâmico como o
bgp:
- [!] --realm value[/mask] :: Corresponde a um número de domínio dado (e, opcionalmente, máscara). Se não for um número, o valor pode ser um campo de nome /etc/iproute2/rt_realms (a máscara não pode ser usada neste caso).
- recent :: Permite criar dinamicamente uma lista de endereços ip e, em seguida, combina contra essa lista de algumas maneiras diferentes.
Por exemplo, você pode criar uma lista de pessoas "badguy" que tentam se conectar na porta 139 no firewall e, em seguida, usar drop para bloquear os pacotes.
"--set", "--rcheck", "--update" e "--remove" são mutuamente exclusivos.
- --name name :: Especifica a lista para usar os comandos. Se nenhum nome for dado, então o padrão será utilizado.
- [!] --set :: Isto irá adicionar o endereço de origem do pacote para a lista. Se o endereço de origem já está na lista isso irá atualizar a entrada existente. Sempre vai retornar sucesso (ou fracasso se "!" for setado).
- --rsource :: Combina/salva o endereço de origem de cada pacote na tabela de lista recente. Este é o padrão.
- --rdest :: Combina/salva o endereço de destino de cada pacote na tabela da lista recente.
- [!] --rcheck :: Verifico se o endereço de origem do pacote está atualmente na lista.
- [!] --update :: É como "--rcheck", exceto que ele irá atualizar o timestamp "last seen" se ele corresponder.
- [!] --remove :: Verifica se o endereço de origem do pacote está atualmente na lista; se o endereço for removido da lista, irá retornar true. Se o endereço não for encontrado, é retornado false.
- --seconds seconds :: Esta opção pode ser utilizada em conjunto com um --rcheck ou --update. Quando usada, vai diminuir a regra para acontecer somente se o endereço estiver na lista e dentro do número de segundos especificados (seconds).
- --hitcount hits :: Esta opção pode ser utilizada em conjunto com um de "--rcheck" ou "--update". Quando usada, vai diminuir apenas quando o endereço estiver na lista e os pacotes forem recebidos maior ou igual ao valor dado (hits).
Esta opção pode ser usada junto com "--seconds" para criar uma regra ainda mais estreita exigindo um certo número de visitas dentro de um prazo específico. O valor máximo para o parâmetro hitcount é dado pelo parâmetro "ip_pkt_list_tot" do módulo de kernel xt_recent. Superior a esse valor na linha de comando fará com que a regra seja rejeitada.
- --rttl :: Esta opção pode ser usada somente em conjunto com "--rcheck" ou "--update". Quando usada, vai diminuir a regra apenas quando o endereço estiver na lista e o TTL dos atuais pacotes marcados com "--set".
Isto pode ser útil se você tiver problemas com as pessoas simulando o endereço de origem a fim de ataque DoS. Através deste módulo você não permite o acesso de outros a seu site através do envio de pacotes falsos.
Exemplos:
iptables -a forward -m recent --name badguy --rcheck --seconds 60 -j drop
iptables -a forward -p tcp -i eth0 --dport 139 -m recent --name badguy --set -j drop
No site de
steve ipt_recent também tem alguns exemplos de uso.
/proc/net/xt_recent/* :: São as atuais listas de endereços e informações sobre cada entrada de cada lista.
/proc/net/xt_recent/ :: Pode ser lido para ver a lista atual ou gravar dois usando os seguintes comandos para modificar a lista:
Adicionar "addr" à lista padrão.
# echo +addr >/proc/net/xt_recent/default
Para remover "addr" da lista padrão:
# echo -addr >/proc/net/xt_recent/default
Para limpar a lista padrão (remover todas as entradas):
# echo / &t;/proc/net/xt_recent/default
O próprio módulo aceita parâmetros, padrões indicados:
- ip_list_tot=100 :: Número de endereços lembrados por tabela.
- ip_pkt_list_tot=20 :: Número de pacotes por endereço lembrado.
- ip_list_hash_size=0 :: Tamanho da tabela hash. 0 (zero) significa calcular com base no padrão ip_list_tot,: 512.
- ip_list_perms=0644 :: Permissões para /proc/net/xt_recent/*.
- ip_list_uid=0 :: UID numérico para as propriedades de /proc/net/xt_recent/*.
- ip_list_gid=0 :: GID numérico para as propriedades de /proc/net/xt_recent/*.
sctp
[!] --source-port,--sport port[:port]
[!] --destination-port,--dport port[:port]
[!] --chunk-types {all|any|only} chunktype[:flags] [...]
As flags acima, indicam as flags que combinam, se definidas, na parte inferior do caso indica a combinar se não estiverem definidas.
Tipos chunk: data init init_ack sack heartbeat heartbeat_ack abort shutdown shutdown_ack error cookie_echo cookie_ack ecn_ecne ecn_cwr shutdown_complete asconf asconf_ack
Tipos de chunk flags disponíveis:
data u b e u b e
abort t t
shutdown_complete t t
Obs.: Flags minúsculas significam "off", em letras maiúsculas significam "on".
Exemplos:
iptables -a input -p sctp --dport 80 -j drop
iptables -a input -p sctp --chunk-types any data,init -j drop
iptables -a input -p sctp --chunk-types any data:be -j accept
set :: Este módulo corresponde à conjuntos de IP, que podem ser definidos por ipset(8):
- [!] --match-set setname flag[,flag]... :: Onde as flags formam uma lista separada por vírgula de src e/ou especificações dst e não pode haver mais de seis especificações.
Daí o comando:
# iptables -a forward -m set --match-set test src,dst
Irá corresponder pacotes para os quais (se o tipo fixado for
ipportmap) o endereço de origem e de destino da porta pode ser encontrado no conjunto especificado. Se o tipo de conjunto especificado é de única dimensão (ipmap exemplo), então o comando irá corresponder pacotes para os quais o endereço de origem pode ser encontrado no conjunto especificado.
A opção "--match-set" pode ser substituída por "--set" se não colidir com uma opção de outras extensões. O uso de "-m" exige que o módulo ipset do kernel esteja levantado. Como kernels padrões não fornecem ainda, o pacote ipset ou xtables-addons precisa ser instalado.
socket :: Isso corresponde se um socket aberto puder ser encontrado fazendo uma pesquisa de sockets no pacote.
--transparent :: Ignorar sockets não transparentes.
state :: Este módulo, quando combinado com rastreamento de conexão, permite o acesso ao estado de rastreamento de conexão para este pacote.
[!] --state state :: Onde o estado é uma lista separada por vírgulas dos estados de conexão. Estados possíveis são invalid significa que o pacote não pode ser identificado por alguma razão, que inclui falta de memória e erros ICMP que não correspondem a qualquer conexão conhecida. "established" significa que o pacote está associado a uma conexão que viu pacotes em ambas direções, new significa que o pacote começou uma nova conexão, ou de outra forma associado a uma conexão que não viu pacotes em ambos os sentidos e related significa que o pacote está começando uma nova conexão, mas está associado a uma conexão existente, como um ftp de transferência de dados, ou um erro ICMP.
statistic :: Este módulo corresponde pacotes com base em alguma condição estatística. Ele suporta dois modos distintos configuráveis com a opção "--mode".
As opções suportadas:
- --mode mode :: Define o modo correspondente da regra correspondente, os modos suportados são "random" e "nth".
- --probability p :: Define a probabilidade 0 para 1 de um pacote ser aleatoriamente combinado. Ele só funciona com o modo random.
- --every n :: Combinar um pacote a cada pacote nth. Ele só funciona com o modo nth (ver também a opção "--packet").
- --packet p :: Define o valor inicial do contador (0 <= p <= n-1, padrão 0) para o modo de "nth".
string :: Este módulo corresponde a uma dada chain usando alguma estratégia de padrões. Ele requer um kernel linux >= 2.6.14.
- --algo {bm|kmp} :: Seleciona a estratégia padrão de correspondência ((bm = boyer-moore, kmp = knuth-pratt-morris).
- --from offset :: Define o deslocamento a partir do qual ele começa a verificar qualquer correspondência. Se não for especificado, o padrão é 0.
- --to offset :: Define o deslocamento a partir do qual ele começa a verificar qualquer correspondência. Se não for especificado, o padrão é o tamanho do pacote.
- [!] --string pattern :: Coincide com o padrão determinado.
- [!] --hex-string pattern :: Corresponde ao padrão dado, porém, em notação hexadecimal.
Nota do tradutor: Utilizar strings é interessante como ponto de checagem para permitir ou descartar um pacote. É uma técnica utilizada tanto para segurança como para economia de banda dentro da rede. O iptables checa se a string especificada está dentro do pacote.
Exemplo:
# iptables -a forward -m string --algo bm --string "sexo" -j drop
Nesta regra, ele irá bloquear (drop) o pacote que tiver a string "sexo" na chain forward. A opção "--algo" determina o algoritmo de busca utilizado, "boyer-moore" ou "knuth-pratt-morris".
A utilização de um ou outro depende da busca que se quer. O "bm" é mais adequado para quando a string procurada se assemelha ao "texto natural" (no caso, em português, logo, depende de onde está vindo o pacote) e faz suas comparações da direita para a esquerda; e o "kmp" é mais adequado para palavras curtas, sendo que ele procura uma palavra dentro de uma cadeia de texto principal e faz suas comparações da esquerda para a direita.
# iptables -a input -m string --string ! ".exe" -j accept
Esta regra somente permite a passagem de pacotes que não contém ".exe" em seu conteúdo.
tcp :: Esta extensão pode ser utilizada se '--protocolo tcp' estiver especificada. Ela oferece as seguintes opções:
- [!] --source-port,--sport port[:port] :: Porta de origem ou especificação de intervalo de portas. Isso pode ser um nome de serviço ou de um número de porta. Uma faixa também pode ser especificada usando o formato first:last. Se a primeira porta for omitida, "0" é assumido, se a última for omitida, "65535" é assumido. Se a primeira porta é maior do que a segunda, elas serão trocadas. A flag "--sport" é um apelido conveniente para essa opção.
- [!] --destination-port,--dport port[:port] :: Porta de destino ou especificação de intervalo de portas. A flag --dport é um álias conveniente para essa opção.
- [!] --tcp-flags mask comp :: Combina quando as flags TCP estão especificadas. O primeiro argumento mask é a flag que devemos examinar, escrito como uma lista separada por vírgulas, e o segundo argumento deve ser uma lista de flags separadas por vírgula. As flags são: syn ack fin rst urg psh all none.
Daí o comando:
# iptables -a forward -p tcp --tcp-flags syn,ack,fin,rst syn
Só irá corresponder pacotes com a flag syn e as flags fin, ack e rst não serão setadas.
- [!] --syn :: Somente corresponde pacotes TCP com o bit SYN e com os bits RST, ACK e FIN limpos. Esses pacotes são utilizados para solicitar o início da conexão TCP, por exemplo, bloquear esses pacotes em uma interface vai evitar conexões TCP de entrada, mas as conexões TCP de saída não serão afetadas. É equivalente a --tcp-flags syn, rst, ack, fin syn. Se o "!" precede a flag "--syn", o sentido da opção é invertido.
- [!] --tcp-option number :: Combina se a opção TCP está setada.
tcpmss :: Combina com o TCP MSS (tamanho máximo do segmento) campo do cabeçalho TCP. Você só pode usar isso em TCP SYN ou SYN/ACK, já que o MSS só é negociado durante o handshake TCP em tempo de inicialização de conexão.
[!] --mss value[:value] :: Corresponde a um dado valor TCP MSS ou intervalo.
time :: Combina se a chegada de pacotes de time/date está dentro de um determinado intervalo. Todas as opções são opcionais, mas serão anded quando especificadas:
- --datestart yyyy[-mm[-dd[thh[:mm[:ss]]]]]
- --datestop yyyy[-mm[-dd[thh[:mm[:ss]]]]] :: Somente corresponde durante o tempo determinado, que deve ser em notação iso 8601 "t". O intervalo de tempo possível é 1970-01-01t00: 00:00 a 2038-01-19t04: 17:07.
Se "--datestart" ou "--datestop" não estiverem especificados, o padrão será 1970/01/01 e 2038/01/19, respectivamente.
- --timestart hh:mm[:ss]
- --timestop hh:mm[:ss] :: Somente corresponde durante o dia determinado. O intervalo de tempo possível é de 00:00:00 a 23:59:59. Zeros à esquerda são permitidos (por exemplo, "06:03") e será corretamente interpretado como base-10.
- [!] --monthdays day[,day...] :: Corresponde aos dias do mês. Os valores possíveis são de 1 a 31. Note que especificar 31 não é funciona em meses que não têm um dia 31, o mesmo vale para 28 ou 29 de fevereiro.
- [!] --weekdays day[,day...] :: Corresponde aos dias da semana. Os valores possíveis são mon, tue, wed, thu, fri, sat, sun, ou valores de 1 a 7, respectivamente. Você também pode usar dois caracteres variantes (mo, tu, etc.)
- --utc :: Interpreta os tempos indicados para --datestart, --datestop, --timestart e --timestop em utc.
- --localtz :: Interpreta os tempos indicados para --datestart, --datestop, --timestart e --timestop se for hora do kernel local (padrão).
Exemplos: Para corresponder aos fins de semana, utilize:
-m time --weekdays sa,su
Ou, para combinar com (uma vez) em um bloco de feriado nacional:
-m time --datestart 2007-12-24 --datestop 2007-12-27
Desde que o "datestop" seja atualmente inclusivo, é necessário o datestop a seguir para não coincidir com o primeiro segundo do novo dia:
-m time --datestart 2007-01-01t17:00 --datestop 2007-01-01t23:59:59
Durante a hora do almoço:
-m time --timestart 12:30 --timestop 13:30
A quarta sexta-feira do mês:
-m time --weekdays fr --monthdays 22,23,24,25,26,27,28
Obs.: Note que explora uma determinada propriedade matemática. Não é possível especificar "quarta quinta-feira ou sexta-feira quarta" em uma regra. Somente é possível com várias regras.