Acho que você está colocando suas regras na ordem errada. No iptables, o -A
acrescenta à cadeia, não o insere antes dela. Normalmente você tem ...
iptables -A INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT
e, em seguida,
# Drop any tcp packet that does not start a connection with a syn flag.
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
Em vez de alterar a ordem, você pode reescrevê-la com -I INPUT 1
, de modo que cada regra seja inserida antes da anterior, ou seja, na parte superior. Mas as regras tail ping / icmp terão que ser movidas nesse caso.
Agora, voltemos à sua pergunta:
iptables -N SSH_CHECK
iptables -N HTTP_CHECK
iptables -A INPUT -p tcp --dport 22 -j SSH_CHECK
iptables -A INPUT -p tcp --dport 80 -j HTTP_CHECK
iptables -A INPUT -p tcp --dport 443 -j HTTP_CHECK
iptables -A SSH_CHECK -s x.x.x.x -j ACCEPT -m comment --comment "allow joe to ssh from his IP"
iptables -A HTTP_CHECK -s y.y.y.y -j ACCEPT -m comment --comment "allow mary to visit my HTTP/S server"
Sua política de descarte padrão cuida dos IPs que não estão em conformidade.