IPTABLES: Negar acesso ao domínio para todos, exceto uma pequena lista de IPs

1

Eu tenho um par de servidores web públicos e algumas máquinas Ubuntu baseadas em casa. Eu mantenho alguns domínios especificamente para monitorar coisas como MySQL e Memcache. Idealmente, eu seria capaz de se conectar ao MySQL, Memcache, etc de minhas máquinas domésticas, enquanto negava a todos os outros acessos.

Então meus iptables atualmente são:

ACCEPT     tcp  --  home ip              0.0.0.0/0            tcp dpt:3306
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:222
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:443
ACCEPT     all  --  server 1 ip          0.0.0.0/0
ACCEPT     all  --  server 2 ip          0.0.0.0/0
ACCEPT     all  --  server 3 ip          0.0.0.0/0
DROP       all  --  198.245.49.225       0.0.0.0/0
DROP       all  --  0.0.0.0/0            0.0.0.0/0

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Eu gostaria de estender meus iptables de tal forma que eu possa acessar tudo de casa. Eu acho que é provavelmente uma boa prática adicionar uma linha para o meu ip home para cada porta que eu quero, em vez de dar o meu ip home para cada porta. Mas talvez isso não importe. Além disso, quero executar coisas como phpMemcachedAdmin sem exigir uma senha.

Por isso, fiz algumas pesquisas no Google sobre como negar acesso a um domínio para todo o mundo. Eu acho que coloquei uma linha permitindo meu ip na porta 80 logo acima da linha negando acesso ao domínio para todo o mundo e (dedos cruzados) eu deveria estar bloqueando todos, menos eu.

As postagens que vi nas minhas pesquisas no Google informaram que você poderia bloquear um domínio por meio de -m string "Host: domain.com" ou via --string "domain.com" . Nem parece funcionar. Aqui está o que eu tentei:

sudo iptables -I 9 -p tcp --dport 80 -m string "Host: domain.com" --algo bm -j DROP
sudo iptables -I 9 -p tcp --dport 80 -m string "domain.com" --algo bm -j DROP
sudo iptables -I 9 -p tcp --dport 80 --string "domain.com" --algo bm -j DROP

Os dois primeiros erros com o argumento Bad 'Host: ...' e o último erro na opção desconhecida "--string".

Para tornar as coisas um pouco mais complicadas, meu IP residencial é dinâmico e não estático. Por isso, seria bom ter (mas não essencial) a capacidade de permitir o meu ip home através de um domínio DynDNS que eu configurei. Eu tenho um script para parar e iniciar o iptables, então se eu precisar, eu sempre posso parar e reiniciá-lo para forçar o IP a atualizar. (Eu li em vários lugares que o iptables só verifica um IP para domínio na inicialização).

Congratulo-me com qualquer aconselhamento relacionado à segurança sobre o uso de iptables para o seu servidor padrão também.

Obrigado

17/3/14 Adições: Eu encontrei o erro de sintaxe na minha linha iptables - o -m string deve ser -m string --string . Agora parece que eu tenho o iptables reconhecendo o domínio que eu quero manter as pessoas fora. No entanto, o problema tornou-se a ordem das regras do iptables.

Meus novos iptables se tornaram:

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
ACCEPT     all  --  Server 1 IP          0.0.0.0/0
ACCEPT     all  --  Server 2 IP          0.0.0.0/0
ACCEPT     all  --  Server 3 IP          0.0.0.0/0
DROP       all  --  198.245.49.225       0.0.0.0/0
DROP       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80 STRING match  "str_for_matching" ALGO name bm TO 65535
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:222
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:443
DROP       all  --  0.0.0.0/0            0.0.0.0/0

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

A idéia seria pegar meu IP antes do DROP que corresponde à string. Se o DROP é a primeira linha, ele o pega e eu recebo um erro 502. No entanto, se os iptables são como eu listei, então as solicitações passam - o IP de minha casa ainda não está na tabela de regras.

O que funciona é assim:

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  Server 1 IP          0.0.0.0/0
ACCEPT     all  --  Server 2 IP          0.0.0.0/0
ACCEPT     all  --  Server 3 IP          0.0.0.0/0
ACCEPT     all  --  My Home IP           0.0.0.0/0
ACCEPT     all  --  My Laptop IP         0.0.0.0/0
DROP       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80 STRING match  "str_to_match" ALGO name bm TO 65535
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
DROP       all  --  198.245.49.225       0.0.0.0/0
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:222
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:443
DROP       all  --  0.0.0.0/0            0.0.0.0/0

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Consegui incluir meus IPs dinâmicos simplesmente usando seu nome de domínio DynDNS em vez de um IP.

Eu provavelmente poderia fazer disso a resposta, mas gostaria de receber alguns conselhos sobre as melhores práticas em relação a esse problema.

    
por Gabe Spradlin 17.03.2014 / 19:29

0 respostas