Neste artigo preocupei-me em abordar um assunto que ainda gera muita discussão, um firewall. Descrevo como mínimo porque as tecnologias que exemplifico são as mínimas necessárias para uma rede de qualquer tamanho e que vejo muita gente tendo problemas para executar tarefas extremamente simples, como bloquear um messenger com eficiência.
Neste artigo descrevo como implantar e configurar uma máquina com Debian Sarge como firewall, roteador internet ou o nome que quiserem dar. Preocupei-me em disponibilizar um artigo de como implantar as principais tecnologias que tenho visto em funcionamento em empresas de pequeno porte, que não podem gastar absurdos com a implantação de sistemas, mas que precisam ter um controle mínimo do que está ocorrendo em sua rede.
Outra preocupação foi criar um artigo que não contivesse a seguinte expressão, BOM ENTÃO É ISSO PESSOAL, AGORA O RESTO É ASSUNTO PARA O PRÓXIMO ARTIGO, DEIXANDO A TODOS COM CARA DE BOBO POR UMA SEMANA.
OU
NÃO VOU ABORDAR A COMPILAÇÃO DO KERNEL PORQUE TEM MUITA DOCUMENTAÇÃO NA INTERNET E NEM MESMO EU SEI COMO COMPILAR UM, SE VIRA AÍ.
Nossa máquina será instalada com base no CD 1 do Debian Sarge e sua instalação será a mínima, não precisamos instalar milhares de pacotes inúteis que serão baixados durante horas e dependendo da velocidade da internet demorará dias, não sou nenhum especialista em Debian, mas me disseram que são 14 CDs, eu baixei só o primeiro e pronto, minto, ganhei um CD de Debian e decidi aprender, nada melhor do que sofrer os problemas do dia-a-dia e ter que solucioná-los sem conhecer completamente o sistema. :)
Indo direto ao ponto, estarão disponíveis os seguintes serviços:
Monitoramento de banda com software MRTG;
Proxy transparente com software SQUID;
Monitoramento de sites acessados e criação de relatórios com software SARG;
Controle de acesso com software iptables com suporte a layer 7;
Antes de começar, temos algumas preocupações a serem verificadas:
1. A internet deve estar disponível;
2. Você deve saber seu endereço IP e Gateway;
3. Instalar na máquina duas placas de rede com suporte nativo pelo Debian Sarge ou providenciar os drivers para versão 2.6 do kernel;
[3] Comentário enviado por agk em 26/02/2007 - 15:45h
Blz de artigo, parabéns.
Só acho que tem um errinho aqui:
cp /boot/config-2.6.8-2-386 /boot/.config
O .config você tem que copiar para dentro de /usr/src/linux
Ficando assim:
cp /boot/config-2.6.8-2-386 /usrc/src/linux/.config
[5] Comentário enviado por juninho (RH.com) em 27/02/2007 - 09:25h
Tenho 3 servidores rodando, mas agora achei muita coisa adicional no seu artigo, como você disse, não deixou nada pra depois ( nem mesmo o editor vim ), já adicionei a meus favoritos.
[6] Comentário enviado por robson..pba em 27/02/2007 - 10:58h
pessoal o que estou fazendo de errado que nao consigo acessar o meu firewall de fora via ssh segue meu script abaixo, uma outra duvida porque quando executo meu script aparece:
FATAL: Module iptables not found.
iptables: No chain/target/match by that name
obs: eth0 (ethernet - adsl) 10.1.1.254
eth1 rede interna 10.0.0.6
lembrando que ja fiz o redirecionamento da porta 22 no modem para o ip 10.1.1.254
#!/bin/sh
# Ativa o modulo natmodprobe iptable_nat
modprobe iptables
modprobe iptable_nat
# ativa proteção contra pacote danificados
iptables -A FORWARD -m unclean -j DROP
# Compartilha a Conexão
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# Abre algumas portas (opcional)
iptables -A INPUT -p tcp --destination-port 22 -j ACCEPT
# Abre para a rede local
iptables -A INPUT -p tcp --syn -s 10.0.0.0/255.255.255.0 -j ACCEPT
# Redirecionando a porta 22 para o servidor
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 22 -j DNAT --to-dest 10.1.1.254
iptables -A INPUT -p tcp -i eth0 --dport 22 -d 10.1.1.254 -j ACCEPT
# Fecha para o resto
iptables -A INPUT -p tcp --syn -j DROP
[7] Comentário enviado por hugoalvarez em 27/02/2007 - 11:53h
Olá amigos, sobre o erro comentado da cópia do .config está correto, na verdade essa cópia não é necessária, ela é como uma cópia da configuração atual em caso de kernel panic dá pra descobrir o que aconteceu de errado, eu sinceramente nesse caso recompilaria porque são milhares de opções de kernel para achar onde está o problema na mão.
Com certeza ainda devem haver alguns detalhes que passaram desapercebido obrigado pela colaboração.
Vlws
Sobre o erro Robson tente remover a seguinte linha no seu script onde coloquei o #
# Ativa o modulo natmodprobe iptable_nat
##modprobe iptables##
modprobe iptable_nat
o iptables está nativo no kernel não precisa ser carregado.
# Estabeleço a relação de confiança entre estações da rede
iptables -A INPUT -i eth1 -s 10.0.0.0/24 -j ACCEPT
iptables -A INPUT -i eth1 -m state --state NEW -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Aceita conexões entrantes pela eth0(internet) na porta 22
iptables -A INPUT -i eth0 -p tcp -m tcp --dport 22 -j ACCEPT
# Nega TUDO de qualquer host entrando pela eth0 (placa de rede da internet)
iptables -A INPUT -i eth0 -j DROP
# Redireciona todas as tentativas de conexão na porta 80 para a porta 3128 do Squid
iptables -t nat -A PREROUTING -s 10.0.0.0/255.255.255.0 -p tcp --dport 80 -j REDIRECT --to-port 3128
# Compartilha a Conexão
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
echo " pronto "
Sobre bloquear forward dos pacotes unclean e syn nunca os estudei a fundo nesse caso não vejo necessidade é interessante caso se precise liberar uma porta que pode sofrer um ataque tipo nmap e outros, se você estabelecer a relação de confiança entre suas máquinas as maquinas da internet por padrão vão ser rejeitadas com o DROP da chain INPUT. Pode fazer o teste coloque no ar e vá até a LAN HOUSE, o nmap não vai detectar nem a sua porta 22 que está aberta, e acho que ninguem vai tentar dar um brute force num SSH né, fala sééériu hehehe, e se tentarem vc bloqueia e ip do kra e acaba com a brincadeira, dar uma olhada no syslog uma vez por dia não custa nada e ninguem vai quebrar a senha de um SSH tão facil assim, a não ser que seja 123456,
Segue abaixo o resultado do comando
nmap eth0(internet)
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
111/tcp open rpcbind
139/tcp open netbios-ssn
443/tcp open https
445/tcp open microsoft-ds
646/tcp open unknown
905/tcp open unknown
2049/tcp open nfs
3128/tcp open squid-http
6000/tcp open X11
[11] Comentário enviado por hugoalvarez em 27/02/2007 - 16:45h
Olá Robson,
o grande segredo é organizar as regras, eu costumo deixar tudo que é INPUT primeiro, depois FORWARD e depois NAT, as vezes todas as regras estão corretas mas na ordem errada um pacote pode ser bloqueado antes de chegar na regra que vai redirecioná-lo,
o INPUT -i eth0 -j DROP é lei, o que você não liberou não tem acesso e pronto, o DROP no INPUT não impede que pacotes que você enviou da rede interna não consigam retornar, eles retornam normalmente pq foram originados internamente, o DROP impede que qualquer um na internet acesse os serviços na sua máquina, portanto, deixe sempre ativo,
agora para funcionar o 5900, VNC se não me engano, verifique internamente se funciona, estando ok, tente assim:
Nesse caso a regra de INPUT deve obrigatoriamente estar antes da regra que bloqueia tudo, ex:
iptables -A INPUT -p tcp -i eth0 --dport 5900 -j ACCEPT
iptables -A INPUT -i eth0 -j DROP
A linha com PREROUTING está correta e pode ser colocada junto com as demais regras.
A linha do FORWARD é obrigatória porque o pacote deve ser encaminhado para a máquina que está na rede interna.
Se você tirar o -j DROP da eth0 os portscan e até tentativas de conexão na sua máquina estarão disponíveis, se eu tiver o seu ip consigo conectar remotamente e vou parar na tela da senha, com o DROP ativo scanners não conseguem descobrir os serviços rodando logo vai cair muito as tentativas de acesso pq como vou acessar um serviço que nem sei se existe, acabo desistindo,
Sobre os serviços rodando uma questão legal que levantei depois do artigo, olhem o resultado do meu netstat -na
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:3128 0.0.0.0:* LISTEN
tcp 0 0 192.168.100.5:3128 192.168.100.30:3587 TIME_WAIT
tcp 0 0 192.168.100.5:3128 192.168.100.30:3592 TIME_WAIT
tcp6 0 0 :::22 :::* LISTEN
tcp6 0 0 ::ffff:192.168.100.5:22 ::ffff:192.168.100:1260 ESTABLISHED
tcp6 0 132 ::ffff:192.168.100.5:22 ::ffff:192.168.100:2741 ESTABLISHED
udp 0 0 0.0.0.0:3130 0.0.0.0:*
udp 0 0 0.0.0.0:67 0.0.0.0:*
udp 0 0 0.0.0.0:3550 0.0.0.0:*
raw 0 0 0.0.0.0:1 0.0.0.0:* 7
Tenho Listen na 80, meu webserver local para o mrtg, tenho a 3128 do squid, e tenho a 22 do ssh, a internet só pode conectar na 22, onde quero chegar,
Eu removi os serviços da minha inicialização definitivamente executando o seguinte comando:
update-rc.d -f gpm remove
Com este comando removi todos os scripts de inicialização do gpm (mouse) porém o script principal continua dentro de /etc/init.d, para deixar só o ssh que foi instalado removi tudo que não uso assim:
[12] Comentário enviado por robson..pba em 28/02/2007 - 11:58h
Hugo ai esta minhas regras, testei o vnc localmente e esta funcionando, porem de fora nao consigo acessar o mesmo, não consigo ver onde estou errando
so corrigindo um erro meu
eth1 é minha ethernet
eth0 rede interna
no modem direcionei a porta 5900 para o ip da minha eth1 10.1.1.254
# Compartilha a Conexão
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
# ESTABELEÇO A RELAÇÃO DE CONFIANÇA ENTRE ESTAÇÕES DA REDE
iptables -A INPUT -i eth0 -s 10.0.0.0/24 -j ACCEPT
iptables -A INPUT -i eth0 -m state --state NEW -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# ACEITA CONEXOES ENTRANTES ETH1(INTERNET) NA PORTA 22
iptables -A INPUT -i eth1 -p tcp -m tcp --dport 22 -j ACCEPT
# BARRO RESTANTE
iptables -A INPUT -i eth1 -j DROP
#REDIRECIONO CONECXOES DA PORTA 5900 PARA O IP DEFINIDO
iptables -A FORWARD -i eth1 -p tcp --dport 5900 -j ACCEPT
iptables -A FORWARD -i eth1 -p tcp --dport 5912 -j ACCEPT
# REDIRECIONA CONEXOES DA PORTA 80 PARA 3128 (SQUID)
iptables -t nat -A PREROUTING -s 10.0.0.0/255.255.255.0 -p tcp --dport 80 -j RED
IRECT --to-port 3128
[14] Comentário enviado por lacierdias em 04/03/2007 - 17:17h
Hugo gostaria de te parabenizar não só pelo artigo mais por toda a atenção dada as pessoas que te solicitam.
Se tivéssemos mais pessoas assim o universo do Linux seria muito melhor.
Grande abraço.
[15] Comentário enviado por angeloshimabuko em 07/03/2007 - 08:55h
Algumas observações quanto ao particionamento.
Em primeiro lugar, o número máximo de partições e unidades lógicas em um disco PATA é 63. P. ex., caso o disco seja /dev/hda (master da IDE primária), as partições primárias serão hda1, hda2, hda3 e hda4. Se uma dessas partições for estendida, poderão ser criadas até 59 unidades lógicas nela: hda5, hda6, ..., hda63.
Caso o disco seja SATA ou SCSI, o número máximo de partições e unidades lógicas é 15. P. ex., /dev/sda => primárias e/ou estendida: sda1, sda2, sda3 e sda4; unidades lógicas: sda5, sda6, ..., sda15.
Essas limitações são impostas pelo mantenedor de números maiores e menores do Linux (atualmente o Torben Mathiasen). Veja mais em: <http://www.lanana.org/docs/device-list/>.
Segundo: no seu exemplo, a partição hda4 não foi suprimida. Nesse caso, é uma partição estendida. alguns particionadores não a mostram, mas use o "fdisk", p.ex., e você a verá.
Terceiro: o melhor local para o espaço de swap é o início do disco e não o meio (o tempo de acesso mede-se em milissegundos e não em nanossegundos). Por causa da geometria do disco (v_linear = v_ang x raio) e pelo fato da velocidade angular (v_ang) ser constante (em discos SATA e PATA, atualmente, 5400 RPM ou 7200 RPM), o início do disco (parte externa do disco) é lido com mais desempenho que o interior.
Quanto à compilação das aplicações, uma recomendação. Siga o padrão LSB e o FHS quando for escolher os locais para instalar os binários. Caso faça uma instalação a partir dos fontes, deixe o padrão, que é usar a pasta /usr/local. As pastas /usr/bin e /usr/sbin devem ser utilizadas para a instalação dos binários da distribuição. Caso instale binários que não sejam da distribuição, e que não tenham sido compilados por você, coloque-os em /opt.
[17] Comentário enviado por hugoalvarez em 09/03/2007 - 15:54h
Olá amigos,
obrigado pelas críticas também adicionou bastante para eu mesmo estudar, sobre o particionamento colhi a informação de uma conceituada escola para certificação LPI, teremos agora também que descobrir se isso ocorre também no windows, porque estudo windows tambem e segundo outra escola conceituada é possivel o numero de partições que citei, eu nunca testei, sobre o local onde os pacotes serão instalados pode-se definir o /usr/local/bin e sbin para softwares compilados na mão sem problemas, é só mudar a linha prefix, eu não uso nada no local quando uso a debian, deixo como nativo(só utilizo o local na slack), normalmente instalo os pacotes como nativos do sistema, se instalasse pelo apt assim seria, só não utilizei o apt porque as versões disponíveis são mais antigas do que a que eu queria instalar, portanto isso fica a critério,
gusfreire,
sobre o kernel panic, tem jeito de resolver sim, eu mesmo já peguei uns 3 ou 4 problemas diferentes de kernel panic em maquinas diferentes, um deles mesmo era até cabacisse minha :D, esqueci de colocar na linha do make-kpkg a opção --initrd, e ele dava um kernel panic relativo à detecção do teclado, coloque as ultimas linhas até o kernel panic da sua máquina que solucionaremos com certeza.
[18] Comentário enviado por gusfreire em 10/03/2007 - 10:30h
Hugo o erro é o seguinte: Kernel Panic not sync atempted to kill init e lista o seguinte: atkbd.c: Spurios ACK on isa0060/serio0. Some program might be trying access hardware direcly.
O 2.4 ta funcionando normalmente quando eu ecolho no Grub iniciar o 2.6 da esse erro acima.
Será que da pra resolver, parece que eh um patch esse atkbd.c ou uma biblioteca, mas não sei como resolver.
[19] Comentário enviado por hugoalvarez em 12/03/2007 - 11:33h
Esse é justamente o erro que comentei acima, peguei quando esqueci de colocar a opção -initrd na linha do make-kpkg, no seu caso segundo a sua mensagem você utilizou a instalação do kernel 2.4 correto?
Se sim será necesário recompilar os modulos da versão tambem, por isso logo no começo do artigo coloquei linux26 durante a inicialização da instalação, assim evitei o trabalho de ter que recompilar os módulos para versão 2.6 do kernel, então temos 2 opções:
tentar compilar os modulos para versão 2.6:
dentro de /usr/src/linux
make modules; make modules_install
ou instalar já com kernel 2.6, o sarge instala o kernel 2.6.8 se digitar linux26 no prompt de instalação, não esqueça de colocar o -initrd na linha do comando make-kpkg ou erro irá acontecer, eu fiquei batendo a cabeça uma semana tentando entender pq não funcionava, deixe um post caso não conseguir, vou ficar de olho.
[20] Comentário enviado por gusfreire em 12/03/2007 - 12:17h
Hugo fiz o que você falou e notei que no seu artigo quando manda compilar o kernel novo está sim com a opção -inittrd olha:
Neste Link: http://www.vivaolinux.com.br/artigos/verArtigo.php?codigo=6108&pagina=11
Após instalar o kernel-package, inicie a compilação do novo kernel:
# make-kpkg -initrd kernel_image
[21] Comentário enviado por gusfreire em 12/03/2007 - 12:26h
Não sei se ajuda mas o meu servidor tem a seguinte configuração:
Processador: P4 2.8 HT
Placa Mãe: Intel, Controladora Scsi, um HD Scsi da Seagate de 40 GB 1 GB de memória Ram e duas placas de rede RTL8169S 1000 MBPS
[22] Comentário enviado por hugoalvarez em 12/03/2007 - 14:11h
está correto, eu estava passando por esse erro quando estava usando assim:
make-kpkg kernel_image
o correto é como está no artigo, você já tentou compilar os modulos ou instalar com a opção linux26 e o erro persiste?
A todos os amigos que lerem esse artigo, gostaria de pedir um grande favor de cooperação, quando tentarem realizar algum procedimento descrito e não obtiverem sucesso, podem deixar um comentário ou enviar o problema para o meu e-mail hugoalvarez@ig.com.br, pois, estou criando uma espécie de CHANGELOG para disponibilizar em meu site, com objetivo de portar e documentar minhas instalações para criar um padrão, instalável em qualquer máquina que tenha OS baseado nas 3 distribuições principais,
[26] Comentário enviado por rdalvarenga em 03/12/2007 - 14:29h
Sou iniciante em linux e estou tentando instalar um servidor debia, segui passo a passo e esta ocorrendo a seguinte msg
Qndo executo o comando make all e make install:
debian:/usr/src/squid-2.6.STABLE7# make all
make: *** Sem regra para processar o alvo `all'. Pare.
debian:/usr/src/squid-2.6.STABLE7# make install
make: *** Sem regra para processar o alvo `install'. Pare.
debian:/usr/src/squid-2.6.STABLE7#
[30] Comentário enviado por mcsba em 09/09/2009 - 12:01h
Olá Hugo, eu uso o debian 5 lenny
tentei fazer seu script de firewall mas quando tento executar mostra o seguinte erro.
The "nat" table is not intended for filtering, hence the use of DROP is deprecated and will permanently be disabled in the next iptables release. Please adjust your scripts.
[31] Comentário enviado por hugoalvarez em 09/09/2009 - 15:04h
Mcsba,
provavelmente trata-se de incompatibilidade entre versões, se você estiver utilizando uma versão nova do iptables será necessário reescrever algumas regras, a tabela NAT não é mais utilizada para fazer filtragem de pacotes e isso é permanente, foi uma modificação no software mesmo, esse artigo ainda serve para dar algumas idéias mas em geral é obsoleto e não recomendo segui-lo passo a passo.
Substitua todas as linhas onde a ação DROP e tabela NAT estão especificadas e coloque essas regras na tabela filter, vai resolver o problema.
Aconselho também que utilize políticas em DROP, todas elas,
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
e através do parametro -m state (consulte os states possíveis no man) libere o retorno dos pacotes, esse artigo é realmente muito obsoleto não serve para os dias atuais.
[32] Comentário enviado por ton.work em 18/08/2010 - 16:20h
Olá hugo configurei um firewall com suas dicas e acabei usando o script do "robson..pba" que me serviu como uma luva, só tive que mudar algumas coisinhas para funcionar pra mim mas já está mamão com açucar.
# Compartilha a Conexão
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
# ESTABELEÇO A RELAÇÃO DE CONFIANÇA ENTRE ESTAÇÕES DA REDE
iptables -A INPUT -i eth0 -s 10.0.0.0/24 -j ACCEPT
iptables -A INPUT -i eth0 -m state --state NEW -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# ACEITA CONEXOES ENTRANTES ETH1(INTERNET) NA PORTA 22
iptables -A INPUT -i eth1 -p tcp -m tcp --dport 22 -j ACCEPT
# BARRO RESTANTE
iptables -A INPUT -i eth1 -j DROP
#REDIRECIONO CONECXOES DA PORTA 5900 PARA O IP DEFINIDO
iptables -A FORWARD -i eth1 -p tcp --dport 5900 -j ACCEPT
iptables -A FORWARD -i eth1 -p tcp --dport 5912 -j ACCEPT
# REDIRECIONA CONEXOES DA PORTA 80 PARA 3128 (SQUID)
iptables -t nat -A PREROUTING -s 10.0.0.0/255.255.255.0 -p tcp --dport 80 -j RED
IRECT --to-port 3128
Obrigado a vocês por deixarem este material valioso para muitas pessoas pois sem isso seria impossivel pra mim instalar o squid ou qualquer distro linux.
E só uma pergunta, fiz teste de portas no shields up e no pc flank e mostraram todas as portas em stealth, gostaria de saber se posso ficar tranquilo com isso ou preciso melhorar a segurança de alguma forma?
Obrigado
[33] Comentário enviado por hugoalvarez em 18/08/2010 - 20:03h
Olá Antonio,
inicialmente agradeço pelo comentário, mas como deve ter visto no meu comentário acima esse script é bem antigo e já precisa de várias modificações, eu começaria mudando todas as políticas para DROP logo de cara, estabeleceria relações de confiança de dentro da rede para fora da rede e em serviços essenciais mesmo e que iniciam conexão "na rua" por um cliente seriam os únicos permitidos.
Com as opções RELATED e ESTABLISHED fica lindo de fazer, consulte a opção -m state --state e vai achar para que servem todas, para não ter q refazer tudo do zero vc pode começar mudando tudo pra FORWARD DROP e procurar o que parou de funcionar em sua rede, um a um vc elimina todos os buracos e vai criando um novo firewall enquanto não pára a empresa.
Sua LAN deve estar totalmente fora de alcance dos invasores em uma rede que tem relação com uma outra rede(DMZ) através de um switch(veja bem isso não é uma regra, é apenas um modelo que eu gosto de trabalhar, que tem como ponto cego falha de hardware do firewall), DMZ só responde para LAN se LAN iniciar conexão com DMZ -> DMZ não consegue iniciar conexões com LAN -> DMZ fica com tudo fechado, serviços ficam liberados parcialmente, a LAN pode tudo que estiver configurado em serviços, a internet só nas portas corretas, as relações de internet não ficam setadas como relacionadas, apenas conectam e desconectam.
Nas portas abertas para internet mida os níveis de conexões, por exemplo não deixar SSH aceitar mais do que 4 conexões por minuto, se houver 4 DROP(vc não vai errar sua senha mais do que 4 vezes em um minuto), sobre os outros serviços sempre medir os acessos, se vc tem um website qtos clientes vão se conectar simultaneamente? Vc sabe que tem possíveis X clientes, eu recebo 200 visitas por dia no site da empresa, a CAIXA recebe milhões de conexões, vale configurar bem o APACHE nesse caso, esconder banner do seu SMTP, assim por diante.
Com esse script nunca fui hackeado, mas ele não é bom.
[36] Comentário enviado por hugoalvarez em 12/01/2012 - 14:51h
Meu véi,
esse artigo é de 2007 é muito véio,
vou postar aqui uma mão, coisa bem básica hein um script empresarial tem q ser muito melhor que isso nos dias de hoje, é que peguei aqui um script funcional e dei umas digitadas rápidas pra ajhudar pq to no trampo e tá correria aqui, aí vai, em baixo tem umas explicações:
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP
iptables -A OUTPUT -o eth0 -p icmp -j ACCEPT
iptables -A INPUT -i eth0 -p icmp -j ACCEPT
iptables -A FORWARD -i eth1 -o eth0 -p icmp -j ACCEPT
iptables -A FORWARD -i eth0 -o eth1 -p icmp -m state --state ESTABLISHED,RELATED -j ACCEPT
#Aceitamos conexoes SSH iniciadas por EMPRESA
iptables -A INPUT -s 200.200.200.199 -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -d 200.200.200.199 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -o eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
#Libera o PROXY das filiais para EMPRESA
iptables -A INPUT -s 200.200.200.199 -p tcp --dport 3128 -j ACCEPT
iptables -A OUTPUT -d 200.200.200.199 -m state --state ESTABLISHED,RELATED -j ACCEPT
#Atravessa squid por fora
iptables -A INPUT -s 200.200.200.202 -p tcp --dport 3128 -j ACCEPT
iptables -A OUTPUT -d 200.200.200.202 -m state --state ESTABLISHED,RELATED -j ACCEPT
# Autoriza o trafego local sem encaminhamento
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# Aceitamos todas as conexoes da LAN
iptables -A INPUT -i eth1 -s 192.168.4.0/24 -j ACCEPT
iptables -A INPUT -i eth1 -m state --state NEW -j ACCEPT
iptables -A OUTPUT -o eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT
#TCP estabelecida pela LAN recebe resposta
#iptables -A OUTPUT -o eth0 -p tcp -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
#DNS liberado para resposta desde que a conexao seja iniciada na LAN
iptables -A OUTPUT -o eth0 -d 4.2.2.2 -p udp --dport 53 -j ACCEPT
iptables -A INPUT -i eth0 -s 4.2.2.2 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -o eth0 -d 200.30.0.97 -p udp --dport 53 -j ACCEPT
iptables -A INPUT -i eth0 -s 200.30.0.97 -m state --state ESTABLISHED,RELATED -j ACCEPT
#Ativa o encaminhamento de pacotes entre a LAN e EMPRESA, EMPRESA e LAN
iptables -A FORWARD -i eth0 -s 200.200.200.199 -o eth1 -d 192.168.4.0/24 -j ACCEPT
iptables -A FORWARD -i eth1 -s 192.168.4.0/24 -o eth0 -d 200.200.200.199 -j ACCEPT
#Ativa o encaminhamento de pacotes entre a LAN e o servidor DPI, DPI e LAN
iptables -A FORWARD -i eth0 -s 200.230.57.43 -o eth1 -d 192.168.4.0/24 -j ACCEPT
iptables -A FORWARD -i eth1 -s 192.168.4.0/24 -o eth0 -d 200.230.57.43 -j ACCEPT
#Ativa o redirecionamento VNC/tcp para a maquina designada
iptables -t nat -A PREROUTING -i eth0 -s 200.200.200.199 -p tcp --dport 5900 -j DNAT --to 192.168.4.109
iptables -t nat -A PREROUTING -i eth0 -s 200.200.200.199 -p tcp --dport 3389 -j DNAT --to 192.168.4.126
#Ativa o mascaramento de conexão
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Basicamente é o seguinte, com um pouco de leitura vc vai entender o script e ver que tem alguns exemplos de serviços já liberados:
No começo tem algumas interfaces eth0 definidas a mais, são ips da internet do local
192.168.4.0/0 é a rede utilizada, LAN
O INPUT e FORWARD por padrão fechados, evita scans
OUTPUT pode sair a vontade, no meu caso servia mas você pdoe fechar
EMPRESA era a matriz onde eu trabalhava, ip de internet tambem, então ela podia tudo no firewall, conectar ssh, etc.
Na regra atravessa squid era uma liberação para eu de qualquer lugar da internet navegar pelo squid da empresa, tipo pra simular um ip quente diferente, útil pra acessar jogos, no meu caso, eu chegava em casa, ssh na eth0 liberada, pegava um ip dinamico da minha conexao, liberava no firewall, liberava no proxy, arrumava o squid, configurava o proxy do meu navegador com o ip quente da conexao da empresa e vualá, ip da minha conexão maqueado.
Tem umas regras de liberação de serviços, tipo VNC e CAT(software de acidentes do governo)
Você vai ver no script várias --state ESTABLISHED,RELATED , o conceito é esse, tudo de dentro pra fora póde, mas o que está fora só responde se quem estiver dentro pedir, fóra nunca inicia conexão, exceto no caso de sh por exemplo que tem liberação explicita, pra um compartilhamento de internet pode remover quase tudo daí, deixando só os forwards e o postrouting.