Eu estava aprendendo as opções do comando ping. Nela encontrei a opção -m para definir a marca de um pacote.
O comando abaixo envia o pacote com marcação 10 para o 192.168.2.65.
ping -m 10 192.168.2.65
Usando o comando abaixo, posso receber esse pacote no destino.
iptables -A INPUT -m mark --mark 0xa -j ACCEPT
Mas o comando acima não recebe o pacote marcado. O comando iptables acima não retorna nada.
Nota: Nós dois temos permissão de root.
Responder1
Essa marca é interna e não está incluída em nenhum lugar do pacote ou em nenhum de seus cabeçalhos.
Isso significa que ele se perde ao fazer a conexão de saída real e não ficaria visível na INPUT
tabela do servidor de destino, mas você o veria na OUTPUT
tabela da máquina inicial.
O objetivo de oferecer suporte a uma marca no ping é permitir regras de roteamento de saída.
Responder2
A resposta de @Julie Pelletier está 100% correta, mas provavelmente não é muito compreensível para você.
Primeiro, como mencionado diversas vezes nos comentários, a marca énãocolocado no pacote Ethernet no fio. Portanto, se você executar ping no servidor B do servidor A, o servidor B nunca será capaz de detectar a marca. Se quiser fazer alguma coisa, você terá que usar o servidor A sozinho. Então, você terá que inserir/acrescentar uma regra à cadeia OUTPUT doremetentepara ver qualquer coisa.
Agora vamos ver como usar iptables
. Primeiro, queremos ver quais regras estão ativas em OUTPUT:
root@roran:~# iptables -L OUTPUT -n -v
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
root@roran:~#
Ok, sem regras. Vamos definir uma regra:
root@roran:~# iptables -I OUTPUT -m mark --mark 0xa -j ACCEPT
root@roran:~#
Como você vê, nenhuma saída. Mas a tabela do kernel agora tem uma entrada:
root@roran:~# iptables -L OUTPUT -n -v
Chain OUTPUT (policy ACCEPT 177 packets, 120K bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 mark match 0xa
root@roran:~#
As colunas "pkts" e "bytes" são ambas 0, pois nenhum pacote foi enviado ainda. Agora, faça ping em um servidor diferente,semmarcando uma marca:
root@roran:~# ping -c 1 bermuda
PING bermuda (192.168.178.2) 56(84) bytes of data.
64 bytes from bermuda (192.168.178.2): icmp_seq=1 ttl=64 time=0.331 ms
[... some more lines omitted]
Depois disso, a tabela do kernel ainda não correspondeu a nada:
root@roran:~# iptables -L OUTPUT -n -v
Chain OUTPUT (policy ACCEPT 348 packets, 160K bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 mark match 0xa
root@roran:~#
Em seguida, tente executar ping com um conjunto de marcas:
root@roran:~# ping -m 10 -c 1 bermuda
PING bermuda (192.168.178.2) 56(84) bytes of data.
64 bytes from bermuda (192.168.178.2): icmp_seq=1 ttl=64 time=0.324 ms
[... some more lines omitted]
e olhe para a tabela novamente:
root@roran:~# iptables -L OUTPUT -n -v
Chain OUTPUT (policy ACCEPT 631 packets, 319K bytes)
pkts bytes target prot opt in out source destination
1 84 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 mark match 0xa
root@roran:~#
Agora, a regra encontrou um pacote com 84 bytes.
Se quiser experimentar, depois disso faça iptables -F OUTPUT
para limpar a mesa; iptables -I OUTPUT -m mark --mark 0x0a -j REJECT
para evitar que pacotes marcados saiam de sua máquina, execute ping na outra máquina com e sem marca. Você verá que os pacotes marcados não recebem resposta agora, pois a regra os descarta.