Eu tenho um servidor dhcp no meu raspberry pi. Eu configurei um firewall que permite apenas o serviço ssh, dns e samba. No entanto, o servidor dhcp também funciona como um encanto, mas por quê?
Aqui estão as regras do firewall:
table ip filter {
chain input {
type filter hook input priority filter; policy drop;
tcp flags == 0x0 drop
tcp flags & (fin | psh | urg) == fin | psh | urg drop
tcp flags & (syn | ack) == syn | ack ct state new drop
tcp dport { 22, 139, 445 } accept
udp dport { 53, 137, 138 } accept
ct state { established, related } accept
iifname "lo" accept
}
chain forward {
type filter hook forward priority filter; policy accept;
ip daddr { 10.0.0.2, 10.0.0.3 } meta mark set 0x00000002
ct mark set meta mark
}
}
table ip nat {
chain postrouting {
type nat hook postrouting priority filter; policy accept;
masquerade
}
}
Muitos clientes e servidores DHCP (IPv4) usam soquetes "brutos", que contornam o firewall de nível IP.
No lado do cliente, quando um cliente DHCP (IPv4) é inicializado, ele geralmente não possui nenhum endereço IP. Portanto, ele não pode usar soquetes UDP comuns e deve usar soquetes "brutos", onde cria seus próprios cabeçalhos UDP e até mesmo IP. Por várias razões, talvez porque o modo bruto ignora a pilha IP regular, ele também ignora o firewall IP. (Você pode notar a mesma coisa ao usar o tcpdump, que vê todos os pacotes antes que o firewall tenha a chance de rejeitá-los.)
No lado do servidor, a situação provavelmente é semelhante. O servidor receberá pacotes de broadcast de endereço nulo, ele precisa saber por qual interface eles chegam (alguns sistemas operacionais não tinham ganchos que informassem os aplicativos quando se trata de UDP), os desenvolvedores queriam apenas reutilizar o mesmo código, etc.
(Isso não se aplica ao DHCPv6, pois os hosts IPv6 sempre têm um endereço IP – o
fe80:...
endereço local de link – e o software pode usar soquetes UDP comuns, que são afetados pelo firewall e podem ser vinculados a um endereço de interface específico. )