pbonfanti
(usa Debian)
Enviado em 16/06/2018 - 15:46h
Pessoal,é o seguinte: sou iniciante e estou vendo umas vídeo aulas para estudar,só que chegou em um ponto em que o professor falou para eu mudar a policy da cadeia INPUT para DROP (único comando até agora) e logo depois ele me apresentou o comando "iptables -A INPUT -p icmp -icmp-type echo-request -j ACCEPT".até ai tudo bem.Esse comando serve para uma maquina ter permissão de pingar o meu servidor,mas ai logo depois começou a confusão,pois eu precisava ativar também a regra para o meu servidor pingar na maquina com o seguinte comando "iptables -A INPUT -p icmp -icmp-type echo-reply -j ACCEPT".
A duvida é: pq que eu tenho que usar essa ultima regra sendo que para o meu servidor mandar dados (no caso o ping) para outras maquinas se usa o OUTPUT e não o INPUT? eu só alterei a policy do input (pacotes direcionados ao servidor) e não o OUTPUT (pacotes que saem do servidor).Pq eu tenho que usar essa ultima regra sendo que eu só alterei a policy do input?
Já tentei pingar na maquina usando o servidor e não deu certo com a policy de input dropando tudo que não esta nas regras.Pq?
O iptables funciona como uma pilha e cada Target possui o seu proprio conjunto de regras empilhadas uma em cima da outra.
Cada vez que você adiciona uma regra como -A você está adicionando uma regra abaixo da ultima que você criou.
Cada vez que você adiciona uma regra como -I você está adicionando uma regra no topo daquela pilha abaixo da ultima que você criou.
Vou tentar demonstrar através de uma VM zerada que nunca rodeu um comando iptables:
Esse comando me mostra as Targets , cada uma delas é uma pilha de regras independente das outras, no caso estão todas zeradas e com a politica padrão ACCEPT,
esse firewall não está bloqueando absolutamente nada.
root@betelgeuse:~# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
A função da target INPUT é controlar os pacotes que entram na interface de rede, ou seja destinados a sua máquina,
por exemplo, um ping vindo de fora que aponta para o seu IP.
Então vamos testar um ping:
#ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=63 time=5.54 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=63 time=5.37 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=63 time=5.29 ms
64 bytes from 8.8.8.8: icmp_seq=4 ttl=63 time=5.61 ms
64 bytes from 8.8.8.8: icmp_seq=5 ttl=63 time=5.58 ms
64 bytes from 8.8.8.8: icmp_seq=6 ttl=63 time=5.37 ms
64 bytes from 8.8.8.8: icmp_seq=7 ttl=63 time=5.68 ms
64 bytes from 8.8.8.8: icmp_seq=8 ttl=63 time=5.11 ms
--- 8.8.8.8 ping statistics ---
8 packets transmitted, 8 received, 0% packet loss, time 7013ms
rtt min/avg/max/mdev = 5.116/5.447/5.682/0.182 ms
8 pacotes transmitidos e 8 recebidos, excelente.
Agora vamos mudar apenas a politica padrão do INPUT
#iptables -P INPUT DROP
Verificando
#iptables -L
Chain INPUT (policy DROP)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Testando o ping novamente:
#ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
--- 8.8.8.8 ping statistics ---
23 packets transmitted, 0 received, 100% packet loss, time 22526ms
Perda total os pacotes saem, mas os pacotes de resposta nao sao recebidos
Colocando a primeira regra agora:
#iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
Dessa vez eu vou usar -nL para mostrar o tipo numerico
#iptables -nL
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 icmptype 8
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Agora teste do ping:
#ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
--- 8.8.8.8 ping statistics ---
7 packets transmitted, 0 received, 100% packet loss, time 6139ms
Novamente os pacotes sairam e nenhum retornou, mas o que eh o pacote icmp
echo-request, que tambem eh chamado de tipo 8?
Pense numa testemunha de jeova batendo na sua porta domingo de manha, pra
saber se voce esta em casa. Essas batidas na porta sao os pacotes echo-request
Se voce ignorar , vc dropou os pacotes, se responder, mesmo com um
xingamento, a sua resposta são pacotes echo reply.
Como nesse caso sou eu que estou batendo na porta do google e nao o
contrario, o google so tenta me enviar pacotes echo-reply que nao estao
liberados.
Agora empilhando mais uma regra:
#iptables -A IMPUT -p icmp --icmp-type echo-reply -j ACCEPT
#iptables -nL
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 icmptype 8
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 icmptype 0
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Agora eu tenho a liberacao de pacotes echo-reply, vamos ver o que acontece:
#ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=63 time=5.44 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=63 time=5.38 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=63 time=5.29 ms
64 bytes from 8.8.8.8: icmp_seq=4 ttl=63 time=5.08 ms
64 bytes from 8.8.8.8: icmp_seq=5 ttl=63 time=5.17 ms
--- 8.8.8.8 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4006ms
rtt min/avg/max/mdev = 5.083/5.276/5.443/0.132 ms
Nenhuma perda de pacote, esta funcionando como esperado.
A primeira regra permite que eu ouca alguem batendo na minha porta
(verificando se eu estou online)
A segunda regra permite que ao bater na porta alheia
(pingar outras maquinas para saber se estao online),
eu possa ouvir a resposta (em forma de pacotes icmp echo-reply)
Sobre o servidor não estar pingando a sua máquina , é possivel que vcê tenha digitado uma das regras com a sintaxe errada
(a primeira regra eu suponho) e ela não entrou na pilha, ou tem firewall bloqueando icmp no proprio servidor. Convém vc verificar quais as regras estão realmente rodando no cliente e no servidor com o comando:
iptables -L
Iptables é espinhoso, caso eu tiver cometido algum deslize/erro, é só apontar que eu retifico,
mas que me lembre a primeira impressão é isso mesmo.