Estou tentando auditar regras de firewall em um host. Isso normalmente é bastante simples de fazer com o nmap ou uma ferramenta de verificação semelhante. O problema é que só consigo executar a auditoria no próprio host. Normalmente, se você executar uma varredura de porta com o nmap no host atual, o nmap usará a interface de loopback. Isso é um problema porque os firewalls nos hosts que me interessam permitem todo o tráfego na interface de loopback:
[my-host ~][I]% sudo iptables -vL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
[...snip...]
2364K 123M ACCEPT all -- lo any anywhere anywhere
[...snip...]
E consequentemente, quando eu escaneio o host, todas as portas parecem ser permitidas pelo firewall:
[my-host ~][I]% sudo nmap -sA my-host
Starting Nmap 6.40 ( http://nmap.org ) at 2020-01-28 13:53 MST
Nmap scan report for my-host (172.20.48.30)
Host is up (0.000015s latency).
rDNS record for 172.20.48.30: my-host
All 1000 scanned ports on my-host (172.20.48.30) are unfiltered
Nmap done: 1 IP address (1 host up) scanned in 0.06 seconds
Então, tentei especificar a interface a ser usada, esperando forçar a varredura para rotear o tráfego pela interface de rede normal do host. Mas o nmap não consegue encontrar nenhuma porta aberta:
[my-host ~][I]% sudo nmap -sA my-host -e ens192 -Pn
Starting Nmap 6.40 ( http://nmap.org ) at 2020-01-28 13:54 MST
Nmap done: 1 IP address (0 hosts up) scanned in 0.44 seconds
No entanto, sei que, em seu firewall, o host permite pelo menos a porta 22 de qualquer outro host na mesma rede. Quando faço a varredura de outro host na mesma rede, é isso que vejo:
[my-other-host ~][I]% sudo nmap -sA my-host -Pn
Starting Nmap 6.40 ( http://nmap.org ) at 2020-01-28 13:55 MST
Nmap scan report for my-host (172.20.48.30)
Host is up (0.00021s latency).
rDNS record for 172.20.48.30: my-host
Not shown: 999 filtered ports
PORT STATE SERVICE
22/tcp unfiltered ssh
MAC Address: 00:50:56:A0:34:4D (VMware)
Nmap done: 1 IP address (1 host up) scanned in 4.51 seconds
Então, por que não consigo ver esses resultados ao digitalizar meu host a partir de si mesmo? Isso é devido à configuração do roteador (que infelizmente não tenho acesso), ou estou cometendo um erro em algum lugar?
O problema é que as tabelas de roteamento do Linux sempre roteiam o tráfego localmente através da interface de loopback e não o colocam na rede física se o sistema local tiver uma interface de rede escutando o endereço IP de destino. Você pode ver a tabela de roteamento local com
ip route show table local
- todos os pacotes que correspondem a uma regra na tabela de roteamento local são retornados. Além disso, a tabela de roteamento local é mantida automaticamente (as regras são adicionadas/removidas ao ativar/desativar as interfaces) e não podem ser alteradas manualmente. Portanto, os pacotes de varredura do nmap sempre terminarão na interface de loopback (e efetivamente perderão o firewall), mesmo quando especificar explicitamente a interface à qual se ligar.A solução é criar uma rede virtual com namespace para executar a verificação. Uma rede virtual com namespace tem suas próprias interfaces de rede virtual e tabelas de roteamento separadas de outras redes com namespace, incluindo o namespace da rede raiz. Isso significa que os pacotes enviados pelos namespaces parecem vir de uma rede externa e não são considerados pacotes locais.
Eu segui o guia aqui para criar uma rede com namespace. No final, o script para criar a rede ficou assim:
testns
é o nome da rede virtual com namespace; você pode chamar de seu como quiser.O IP de origem e o IP de destino podem ser qualquer endereço IP arbitrário, o que significa que você pode falsificar endereços IP de origem arbitrários ao executar uma verificação, o que é bastante útil. Tenha cuidado, no entanto, para não mascarar nenhum endereço IP real com o qual o sistema possa querer se comunicar.
Por fim, executar sua varredura nmap é uma questão de garantir que ela seja executada dentro da rede com namespace. Você também precisa verificar o endereço IP do adaptador ethernet virtual emparelhado no namespace raiz (NÃO o endereço IP real do sistema):
E você deve ver sua verificação sendo executada como se realmente viesse de 5.5.5.5.