Primeira coisa: -I
significa inserir na cabeça, ou seja, prefixar . Use -A
para acrescentar no final. -A
pode não funcionar como esperado se você não também examinar outras regras do iptables que já tenham sido colocadas antes. Então, vamos continuar usando -I
, mas com um número de linha incrementado depois de escolher onde inserir e ter as regras na ordem usual.
Seu problema é lidar com as regras stateful . Um fluxo de conntrack é NEW
com o primeiro pacote. Qualquer pacote de resposta não será novo, mas iniciará o estado ESTABLISHED
. Suas regras só permitem NEW
states para que nada funcione corretamente.
Não conhecer todas as outras regras ou configurações de rede resultará em regras prováveis de sub-ótimos / duplicados nesta resposta, mas deve funcionar de qualquer maneira.
Primeiro, adicione regras genéricas que permitirão resposta, assim como pacotes relacionados (por exemplo: para udp
com icmp
ou para módulos auxiliares como ftp
data), uma regra por direção. Essas regras não permitirão tráfego somente porque um novo fluxo é sempre NEW
(portanto, não ESTABLISHED
ou RELATED
) por definição. Portanto, você só precisa se preocupar com NEW
states ( -m conntrack --ctstate
substituído -m state --state
, então você deve usá-lo se disponível, senão substitua todas as strings por -m state --state
):
iptables -I FORWARD 1 -i br2 -o br0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -I FORWARD 2 -i br0 -o br2 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
Agora você pode lidar com (apenas) os novos fluxos:
Observe que a regra anterior e a próxima regra podem ser combinadas em apenas uma regra com todos os 3 estados ou nenhuma verificação de estado em tudo desde que sempre será um desses 3 estados (ok, ao lado de INVALID)
iptables -I FORWARD 3 -i br0 -o br2 -m conntrack --ctstate NEW -j ACCEPT
iptables -I FORWARD 4 -i br2 -o br0 -d 192.168.1.38 -p tcp --dport 1883 -m conntrack --ctstate NEW -j ACCEPT
iptables -I FORWARD 5 -i br2 -j DROP
Para sua última pergunta, duvido que o que você escreveu permita o acesso à Internet, porque provavelmente a Internet não estará disponível na interface do br0
. Estaria disponível na interface que possui o IP público. Isso deve funcionar sem saber qual interface é, simplesmente por não declará-la (executar após os comandos anteriores ou reordenar números de acordo. iptables-save
e iptables-restore
são seus amigos):
iptables -I FORWARD 5 -o br2 -d 192.168.7.5 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -I FORWARD 6 -i br2 -s 192.168.7.5 -m conntrack --ctstate NEW -j ACCEPT
Mas as informações perdidas adicionadas na pergunta ajudariam com certeza: ip -br link
; %código%; %código%; ip -4 -br address
(e possivelmente ip route
). Então as regras provavelmente poderiam ser mais genéricas ainda sem reduzir a segurança.
UPDATE: ip rule
correspondência para corresponder a um endereço MAC .
É possível combinar um endereço mac em vez de um IP. Esta informação só pode ser usada como fonte e só faz sentido na rede correta. Portanto, iptables-save
não pode ser usado para corresponder ao MAC. Vamos apenas substituir a regra 5 acima por uma mais genérica (o que ainda é bom para a segurança). Usando mac
para substituir as regras 5 e 6 acima, ajuste (novamente: -o br2
é útil):
iptables -R FORWARD 5 -o br2 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -R FORWARD 6 -i br2 -m mac --mac-source 02:03:04:05:06:07 -m conntrack --ctstate NEW -j ACCEPT
E no final você recebe:
iptables -I FORWARD 1 -i br2 -o br0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -I FORWARD 2 -i br0 -o br2 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -I FORWARD 3 -i br0 -o br2 -m conntrack --ctstate NEW -j ACCEPT
iptables -I FORWARD 4 -d 192.168.1.38/32 -i br2 -o br0 -p tcp -m tcp --dport 1883 -m conntrack --ctstate NEW -j ACCEPT
iptables -I FORWARD 5 -o br2 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -I FORWARD 6 -i br2 -m mac --mac-source 02:03:04:05:06:07 -m conntrack --ctstate NEW -j ACCEPT
iptables -I FORWARD 7 -i br2 -j DROP
O quinto é um superconjunto do segundo, porque provavelmente deve haver a interface WAN adicionada na regra, mas eu não sei.