Netfilter/Iptables
Linux como um roteador doméstico
Cenário 2
• Linux como um roteador SOHO (Stands Offices and Home Offices).– A máquina Linux irá atuar como um roteador semelhante ao que
temos em nossas residências.• Provendo a conexão ao Provedor Internet.• Compartilhando este acesso com as máquinas da LAN.
• Normalmente os roteadores SOHO possuem uma porta WAN e portas LAN.– Equipamento local do usuário (Modem DSL).
• Geralmente o provedor nos fornece um endereço IP público via DHCP.• PPPoE.
– Conexões Ethernet.– Conexões sem fio.
Topologia
Endereços
• O Roteador Linux tem:– O endereço público na interface eth0, fornecido
dinamicamente pelo provedor de acesso (modo NAT).– O endereço privado 192.168.1.1/24 na interface eth1,
configurado por você.• O Laptop possui o endereço 192.168.1.2.• O Desktop possui o endereço 192.168.1.11.• O PC das crianças possui o endereço 192.168.1.55.
Configurando a rede
• Configure as interfaces de rede e os nomes dos hosts conforme o slide anterior.
• É interessante criar configurações que se mantenham após a reinicialização das máquinas.
Definindo a política de segurança (1)
• As crianças precisam:– Usar o navegador para pesquisar na Internet.– Não queremos que elas acessem sites
pornográficos.– Não queremos que elas façam download de vírus.– Também não queremos que elas acessem
conteúdos P2P.• O Laptop pode:– Acessar qualquer coisa.
Definindo a política de segurança (2)
• O Desktop pode:• Acessar qualquer coisa.• Conectar-se à LAN a partir da Internet, via VNC.
• O Roteador Linux precisa:– Rodar SSH a partir da rede interna.
Construindo o proxy
• Inicialmente precisamos instalar em nossa máquina firewall, o proxy server Squid.
• www.squid-cache.org.– ./configure --prefix=/squid– make all– make install
Configurando o Squid (1)
• Adicione as linhas abaixo no arquivo /etc/squid.conf. As entradas se referem ao usuário que irá inicializar o Squid.
cache_effective_user Managercache_effective_group Manager
Configurando o Squid (2)
• Para ser capaz de usar o Squid como um Transparente Proxy, temos que adicionar a seguinte informação no arquivo de configuração em /squid/etc/squid.conf.http_port 3128 transparent
Criando lista de acesso no Squid
• Agora, precisamos definir listas de acesso para a rede interna acessar o Squid e para proibir o acesso a sites pornográficos e a arquivos perigosos.
• Faremos isso para a rede inteira, mas nós usaremos o Transparente Proxy somente para o computador das crianças.
• Qualquer arquivo pode ser um vírus. O que se segue é apenas um exemplo.
Criando lista de acesso no Squid (2)
• Insira em squid.conf as linhas abaixo:acl all src 0.0.0.0/0.0.0.0 (pré-definida)acl porn url_regex –i sex adult porn hardcore fetishacl downloads urlpath_regex\.exe$\.rar$\.zip$\.pif$ \.src$acl nossa_rede src 192.168.0.0/24http_access deny pornhttp_access deny downloadshttp_access allow nossa_redehttp_access deny all
ACLs
• A ACL chamada porn contém a lista de nomes que não são permitidas na URL.– Você não conseguirá acessar sites que possuem
estas palavras na URL, via proxy.• A ACL chamada downloads contém a lista de
tipos de arquivos não permitidos.– Não será possível fazer download de arquivos com
estas extensões.
Próximos passos
• Agora que já configuramos o proxy, vamos configurar o firewall cujas regras devem casar com as políticas de segurança que nós acabamos de construir.
Computador das crianças
• Para o computador das crianças nós executaremos o Transparent Proxy.– Significa que o computador acessará o proxy sem
precisar configurar o navegador.• Nós já configuramos o proxy server. Agora, nós
precisamos que todo o tráfego para a porta 80 TCP seja redirecionado para o proxy server.
• Nós também queremos que o computador das crianças acesse a porta 443 TCP (HTTPS).
Configurando
iptables –t nat –A PREROUTING –s 192.168.1.55 –p tcp – -dport 80 –j REDIRECT - –to-port 3128
iptables –t nat –A POSROUTING –o eth0 -s 192.168.1.55 –p tcp – -dport 443 –j MASQUERADE
Computador das criançasMasquerade
• Agora, vamos mascarar o computador das crianças quando ele enviar requisições DNS para nosso provedor de acesso.
iptables –t nat –A POSTROUTING –o eth0 –s 192.168.1.55 –p udp – -dport 53 –j MASQUERADE
• Requisições DNS usam a porta UDP 53.
Yahoo!
• Nós queremos que as crianças usem o “Yahoo!Messenger” somente para chat sem voz e sem transferência de arquivos.
• Lendo os manuais da ferramenta, vê-se que o Yahoo! Messeger usa as portas 20, 23, 25, 80, 119, 5050, 8001 e 8002.
• Também vê-se que os sites que o “Yahoo!Messenger” utiliza para Instant Messeger são: scs.msg.yahoo.com, scsa.msg.yahoo.com, scsb.msg.yahoo.com e scs.cmsg.yahoo.com.
MASQUERADE
• É melhor mascarar o computador das crianças quando ele acessa esses sites. Nós devemos fazer:
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.1.55 -d scs.msg.yahoo.com -j MASQUERADE
– NOTA: Ao inserir um nome de máquina ao invés do seu endereço IP, o DNS irá resolver este nome. Se um nome é resolvido para múltiplos endereços IP, o iptables irá inserir uma regra independente para cada endereço.
Proibindo o acesso aos demais hosts
• Agora que nós permitimos o acesso do computador das crianças a determinados sites, devemos agora proibir o acesso a outras portas e outros sites.
iptables –t nat –A POSTROUTING –o eth0 –s 192.168.1.55 –j DROP
Laptops e Desktop
• O Laptop e o Desktop precisam ser capazes de acessar qualquer site, então nenhuma regra é necessária a não ser o MASQUERADE para a nossa rede.
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.1.0/24 -j MASQUERADE
Protegendo o firewall
• Já fizemos todas as configurações necessárias a proteção de nossa rede local. Agora vamos proteger o nosso firewall.
• Em primeiro lugar nós precisamos rodar o SSH em nosso firewall para que ele possa ser administrado remotamente.
• Para isto precisamos criar uma nova chain. Podemos chamá-la de SSH.
• Se uma vulnerabilidade for descoberta no SSH, rapidamente haverá scanners de worms na porta padrão do SSH. A porta 22. Então devemos alterar essa porta.
Criando a chain SSH
• Criando a chain SSH.iptables –N SSH
• Agora, vamos inserir uma regra para pedir ao kernel para checar as regras na chain SSH, para toda conexão TCP na porta 1234.iptables –A INPUT –p tcp - -dport 1234 –j SSH
Inserindo regras na chain SSH
• Devemos inserir uma regra na chain SSH permitindo acesso somente para hosts confiáveis.
• Digamos que o endereço IP do PC do nosso escritório seja 1.2.3.4.
iptables –A SSH –s 1.2.3.4 –j ACCEPTiptables –A SSH –s 192.168.1.0/27 –j ACCEPT
iptables –A SSH –s 0/0 –j DROP
Significado das regras
• A primeira regra aceita conexões a partir do computador de nosso escritório.
• A segunda regra permite conexões SSH de entrada somente oriundas de computadores com endereços no intervalo de 192.168.1.1 à 192.168.1.32.
• A terceira regra descarta todos as demais conexões para a porta 1234.
Finalmente...
• O proxy Squid tem a sua própria segurança usando as Listas de Acesso. Mesmo assim vamos que pacotes TCP SYN, vindos da Internet estabeleçam conexão com nosso Squid/Router/Firewall, exceto na porta 1234 a partir de PC 1.2.3.4.
• Vamos também, liberar todos os pacotes vindos da interface loopback para IPC (processos internos de comunicação).
iptables –A INPUT –i lo –j ACCEPTiptables –A INPUT –i eth0 –p tcp - –syn –j DROP