murilo8812
(usa CentOS)
Enviado em 06/02/2015 - 00:26h
Boa noite pessoal,
Na empresa temos a seguinte estrutura:
Temos 2 links adsl vivo ligados a um balanceador de carga com o endereço:
192.168.250.1
neste balanceador esta configurado duas conexões PPPoe para os conexão com os 2 links,
portanto este é o GATEWAY principal da nossa rede.
neste balanceador, está ligado na porta LAN nosso servidor Linux Centos que possui 2 interfaces:
eth1 - 172.16.0.1 (REDE 172.16.0.0/27)
eth1:0 - 172.16.0.33 (REDE 172.16.0.32/27)
eth1:1 - 172.16.0.65 (REDE 172.16.0.64/27)
eth1:2 - 172.16.0.97 (REDE 172.16.0.96/27)
eth2 - 192.168.250.2 (REDE 192.168.250.0/24)
Ou seja, dividi nossa rede conforme os setores de forma que todas as redes não possuem comunicação uma com a outra, definidas pelas regras do iptables (FORWARD).
Até aí tranquilho, notem que estou usando apenas 1 interface para separar as redes mais internas para isso defini os IPs adicionais (IP Alias).
Há dois níveis de NAT, o primeiro nível ocorre no Centos, ou seja, todas as subredes 172.16.0.x/27 precisam ser mascaradas com o IP da interface eth2 (192.168.250.2) para que assim o próximo nível de NAT ocorra no meu Balanceador, assim finalmente o Balanceador faz o mascaramento da rede 192.168.250.x para a internet.
O que ocorre é que os hosts nas redes 172.16.0.x quando não possuem regra de mascaramento, a fim de evitar a conexão com a internet, estão se comunicando diretamente com a rede 192.168.250.x e assim o balanceador faz o NAT para esses IPs que não deveriam acessar a internet diretamente.
A fim de resolver este problema, defini uma regra para evitar que estes IPs tenham comunicação direta com a rede do Balanceador:
iptables -A FORWARD -i eth1 -o eth2 -s 172.16.0.0/27 -d 192.168.250.0/27 -j DROP
esta regra funcionou perfeitamente, os ips da rede interna não acessam diretamente o Balanceador quando não estão sob NAT.
Quando algum endereço da rede 172.16.0.x possui mascaramento, a conexão com a internet funciona.
O problema é que, não consigo acessar o Console do Balanceador, não consigo acessar nenhum IP da rede do balanceador.
Penso que o acesso deveria funcionar para os IPs da rede 172.16.0.x para a rede 192.168.250.0 somente via NAT, ou seja,
um host no endereço 172.16.0.14/32 com NAT aplicado seria "enxergado" pela rede do balanceador com 192.168.250.2:xxxx correto?
e os hosts sem nat aplicado seriam "enxergados" pelo balanceador com o endereço original da rede interna.
Afinal, na minha regra de bloqueio defini que um pacote entrando pela eth1, e saindo pela eth2, com origem em 172.16.0.0 e destino em 192.168.250.0 fossem bloqueados. Mas ele está bloqueando os endereços da própria rede do balanceador.
Não consigo entender, se alguém puder me ajudar ou tentar resolver de outra maneira, agradeço muito!
Abaixo segue meu script:
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# $want to do the full Sys V style init stuff.
# Autor: Murilo G. S. Mansano
# Data : 05/02/2015
#
# Descrição: Arquivo executo ao iniciliar o sistema operacional, inclui scripts para
# aplicação de regras do IPTABLES (Firewall).
# As regras estão separadas por REDE, cada rede ou setor possui uma função separada.
########################
### FUNÇÕES ###
########################
# Funcao que aplica o mascaramento NAT para cada IP de um Vetor passado por parametro
function masqueradeByIP()
{
#verifica se existe argumento passado para a funcao
if [ $# = 0 ] ; then
echo "Argumentos da funcao insuficientes"
return
fi
#Variavel que armazena todos os argumentos da chamada a funcao
#os parametros da funcao sao armazenados nas var $1,$2,$3.....$#
local array=($@)
#para cada argumento realize o masquerading
for i in ${array[@]}
do
echo "MASQUERADING aplicado para o IP de origem:" $i
iptables -t nat -A POSTROUTING -o $WAN -s $i -j MASQUERADE
done
}
# Funcao que aplica o mascaramento NAT para cada IP de destino
function masqueradeByIpDest()
{
#verifica se existe argumento passado para a funcao
if [ $# = 0 ] ; then
echo "Argumentos da funcao insuficientes"
return
fi
#Variavel que armazena todos os argumentos da chamada a funcao
#os parametros da funcao sao armazenados nas var $1,$2,$3.....$#
local array=($@)
#para cada argumento realize o masquerading
for i in ${array[@]}
do
echo "MASQUERADING aplicado para o dominio/IP de destino:" $i
iptables -t nat -A POSTROUTING -o $WAN -d $i -j MASQUERADE
done
}
# Funcao que aplica o mascaramento NAT para cada valor de porta de um Vetor passado por parametro
# param1: Array com os valores, cujo primeiro indice deve armazenar o valor do protocolo (udp|tcp)
function masqueradeByPortDest()
{
#Variavel que armazena todos os argumentos da chamada a funcao
#os parametros da funcao sao armazenados nas var $1,$2,$3.....$#
local protocolo=$1
local array=($@)
#para cada argumento realize o masquerading
#o primeiro valor do vetor se refere ao protocolo
for i in ${array[@]:1}
do
echo "MASQUERADING aplicado para a porta de destino:" $i "protocolo:" $protocolo
iptables -t nat -A POSTROUTING -o $WAN -p $protocolo --dport $i -j MASQUERADE
done
}
#Regras aplicadas à todas as subredes
function todasRedes()
{
echo -e '\n <todasRedes'
#MASQUERADING por porta
portasLiberadas[0]=tcp #Protocolo TCP
portasLiberadas[1]=3391 #RDP - Acesso a servidores DRP
portasLiberadas[2]=3389 #RDP - Acesso a servidores DRP
portasLiberadas[3]=587 #SMTP - E-mail SMTP
portasLiberadas[4]=3306 #MYSQL - Servidores mysql
portasLiberadas[5]=8087 #CFCA - Acesso CFCA NET
portasLiberadas[6]=5938 #TEAMVIWER - Acesso aos servidores TeamVi
masqueradeByPortDest ${portasLiberadas[@]}
unset portasLiberadas
portasLiberadas[0]=udp #Protocolo UDP
portasLiberadas[1]=53 #DNS - Consultas DNS
portasLiberadas[2]=5938 #TEAMVIEWER - Acesso aos servidores teamViewer
masqueradeByPortDest ${portasLiberadas[@]}
unset portasLiberadas
#MASQUERADING por dominio/servicos ----
#Domínios diversos
dominiosLiberados=("www.dglnet.com.br" "mailhost.dglnet.com.br" "www.antaresautoescola.com.br"
"mail.antaresautoescola.com.br" "hcomm14.dns-wk.info" "mail.3visao.com.br" "aplicacao5.tst.jus.br" )
#Microsoft Windows Update
windowsUpdate=("microsoft.com" "update.microsoft.com" "windowsupdate.microsoft.com" "download.windowsupdate.com"
"www.download.windowsupdate.com" "redir.metaservices.microsoft.com" "c.microsoft.com")
#Cidadetran
cidadetran=("200.155.83.42" "200.155.82.124" "200.155.86.52")
#CFCA Net
cfcaNet=("database.keynet.com.br" "database2.keynet.com.br" "database3.keynet.com.br")
#E-cnh
ecnh=("www.e-cnhsp.sp.gov.br" "200.144.4.109" )
masqueradeByIpDest ${windowsUpdate[@]} ${dominiosLiberados[@]} ${cidadetran[@]} ${cfcaNet[@]} ${ecnh[@]}
#Gefor/SGDpro
iptables -t nat -A POSTROUTING -o $WAN -m iprange --dst-range 200.189.176.1-200.189.176.254 -j MASQUERADE
#CFCBPLUS
iptables -t nat -A POSTROUTING -o $WAN -m iprange --dst-range 173.194.42.1-173.194.42.254 -j MASQUERADE
iptables -t nat -A POSTROUTING -o $WAN -m iprange --dst-range 173.194.119.1-173.194.119.254 -j MASQUERADE
iptables -t nat -A POSTROUTING -o $WAN -m iprange --dst-range 173.194.118.1-173.194.118.254 -j MASQUERADE
iptables -t nat -A POSTROUTING -o $WAN -m iprange --dst-range 200.189.176.1-200.189.176.254 -j MASQUERADE
iptables -t nat -A POSTROUTING -o $WAN -d 187.61.15.162 -j MASQUERADE
iptables -t nat -A POSTROUTING -o $WAN -d 200.189.176.164 -j MASQUERADE
#MN SISTEMAS
iptables -t nat -A POSTROUTING -o $WAN -d 186.202.153.75 -j MASQUERADE
echo -e '/> \n'
}
function regrasInternas()
{
echo -e "\n Processando regras internas"
### GATEWAY
route add default gw 192.168.250.1
### Iniciando o IPTABLES
modprobe iptable_nat
modprobe ip_tables
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
### Limpando Regras Existentes
iptables -F
iptables -t nat -F
### Politicas de Regras
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
### FORWARDS - Regras do trafego que passa pelo firewall
iptables -A FORWARD -p tcp --dport 3391 -j LOG --log-level 1 --log-prefix 'REMOTE DEKTOP p3391>>> ' #log
iptables -A FORWARD -p tcp --dport 3389 -j LOG --log-level 1 --log-prefix 'REMOTE DEKTOP p3389>>> ' #log
#Limitação do ping do trafego entre interfaces. não vale para trafego na mesma interface (Redes internas)
iptables -A FORWARD -i eth1 -o $WAN -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
iptables -A FORWARD -o eth1 -i $WAN -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
echo -e "Regras internas OK"
}
function despachante()
{
echo -e '\n <despachante'
#Nome dos Hosts e IP's importantes
local SERVIDOR=172.16.0.2/32
local ESTDES01=172.16.0.3/32 #VALDIRENE
local ESTDES02=172.16.0.4/32 #RENATO
local DVR=172.16.0.62/32
local VOIP=172.16.0.29/32
#Para liberar os ips basta descomentar as linhas e inserir o ip na notação ip/bits mask
LAN_DESPACHANTE_IPSLIBERADOS[0]=$ESTDES02
LAN_DESPACHANTE_IPSLIBERADOS[1]=$ESTDES01
LAN_DESPACHANTE_IPSLIBERADOS[2]=$VOIP
LAN_DESPACHANTE_IPSLIBERADOS[3]=$SERVIDOR
LAN_DESPACHANTE_IPSLIBERADOS[4]=$DVR
#LAN_DESPACHANTE_IPSLIBERADOS[5]=
#LAN_DESPACHANTE_IPSLIBERADOS[6]=
#LAN_DESPACHANTE_IPSLIBERADOS[7]=
#LAN_DESPACHANTE_IPSLIBERADOS[8]=
#LAN_DESPACHANTE_IPSLIBERADOS[9]=
masqueradeByIP ${LAN_DESPACHANTE_IPSLIBERADOS[@]}
#REGRAS GERAIS - Adicione as regras especificas aqui
#fwantares - NÃO NECESSITA DE REGRAS FORWARD, Regras OUTPUT não serão necessárias, pois a politica padrão é ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
iptables -A INPUT -p tcp --dport 3392 -j ACCEPT #ssh Modificado
iptables -A INPUT -i eth1 -p tcp --dport 3128 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j LOG --log-level 1 --log-prefix 'SSH REMOTE p22>>> '
iptables -A INPUT -p tcp --dport 3392 -j LOG --log-level 1 --log-prefix 'SSH REMOTE p3392>>> '
iptables -A INPUT -s $LAN_DESPACHANTE -j ACCEPT #Todas as redes internas tem acesso ao firewall
iptables -A INPUT -s $LAN_PERICIA -j ACCEPT
iptables -A INPUT -s $LAN_AUTOESCOLA -j ACCEPT
iptables -A INPUT -s $LAN_CFC -j ACCEPT
iptables -A INPUT -s $LAN_3VISAO -j ACCEPT
#servidor
iptables -t nat -A PREROUTING -i $WAN -p tcp --dport 80 -j DNAT --to 172.16.0.2 #APACHE WEB SERVER
iptables -t nat -A PREROUTING -i $WAN -p tcp --dport 3391 -j DNAT --to 172.16.0.2:3389 #RDP - Microsoft remote desktop
iptables -A FORWARD -s $SERVIDOR -d 0/0 -j ACCEPT #O servidor precisa ter acesso a todas as redes internas ou externas
iptables -A FORWARD -d $SERVIDOR -s 0/0 -j ACCEPT #Todas as redes internas ou externas tem acesso ao servidor
#DVR
iptables -t nat -A PREROUTING -i $WAN -p tcp --dport 8080 -j DNAT --to 172.16.0.62
iptables -t nat -A PREROUTING -i $WAN -p tcp --dport 6036 -j DNAT --to 172.16.0.62
iptables -t nat -A PREROUTING -i $WAN -p udp --dport 6036 -j DNAT --to 172.16.0.62
iptables -A FORWARD -i eth1 -o $WAN -s 172.16.0.14/32 -d $LAN_BALANCEADOR -j DROP
#Acesso a outras redes pela interface WAN, acesso a rede Despachante pela interface WAN
#A rede despachante não poderá acessar outras redes internas
#O acesso da rede interna com destino a rede Despachante deve ser controlada nas outras subredes.
iptables -A FORWARD -i eth1 -o $WAN -s $LAN_DESPACHANTE -d 0/0 -j ACCEPT
iptables -A FORWARD -i $WAN -o eth1 -s 0/0 -d $LAN_DESPACHANTE -j ACCEPT
echo -e '/> \n'
}
function pericia()
{
echo -e '\n <pericia'
#Nome dos Hosts e IP's importantes
local ESTPER02=172.16.0.14 #Murilo
local ESTPER07=172.16.0.19 #Rogério
#Para liberar os ips basta descomentar as linhas e inserir o ip na notação ip/bits mask
LAN_PERICIA_IPSLIBERADOS[0]=$ESTPER02
LAN_PERICIA_IPSLIBERADOS[1]=$ESTPER07
#LAN_PERICIA_IPSLIBERADOS[2]=
#LAN_PERICIA_IPSLIBERADOS[3]=
#LAN_PERICIA_IPSLIBERADOS[4]=
#LAN_PERICIA_IPSLIBERADOS[5]=
#LAN_PERICIA_IPSLIBERADOS[6]=
#LAN_PERICIA_IPSLIBERADOS[7]=
#LAN_PERICIA_IPSLIBERADOS[8]=
#LAN_PERICIA_IPSLIBERADOS[9]=
masqueradeByIP ${LAN_PERICIA_IPSLIBERADOS[@]}
#REGRAS GERAIS - Adicione as regras especificas aqui
#ESTPER02 - tem acesso a todas as redes internas e todas as redes internas tem acesso a murilo
#iptables -A FORWARD -i eth1 -o eth1 -s $ESTPER02 -d 0/0 -j ACCEPT
#iptables -A FORWARD -i eth1 -o eth1 -d $ESTPER02 -s 0/0 -j ACCEPT
#Acesso desta rede com origem na interface eth1 (Rede interna) com destino a interface Wan (Redes externas)
#Acesso de outras redes com origem na interface Wan (Redes externas) com destino a interface eth1(Rede interna)
iptables -A FORWARD -i eth1 -o $WAN -s $LAN_PERICIA -d 0/0 -j ACCEPT
iptables -A FORWARD -i $WAN -o eth1 -d $LAN_PERICIA -s 0/0 -j ACCEPT
echo -e '/> \n'
}
function autoEscola()
{
echo -e '\n <autoEscola'
#Nome dos Hosts e IP's importantes
local ESTAES02=172.16.0.35/32 #ESTAES02 - Marinalva
local IX2=172.16.0.30/32 #IX2 Lenovo
#Para liberar os ips basta descomentar as linhas e inserir o ip na notação ip/bits mask
LAN_AUTOESCOLA_IPSLIBERADOS[0]=$ESTAES02
LAN_AUTOESCOLA_IPSLIBERADOS[1]=$IX2
#LAN_AUTOESCOLA_IPSLIBERADOS[2]=
#LAN_AUTOESCOLA_IPSLIBERADOS[3]=
#LAN_AUTOESCOLA_IPSLIBERADOS[4]=
#LAN_AUTOESCOLA_IPSLIBERADOS[5]=
#LAN_AUTOESCOLA_IPSLIBERADOS[6]=
#LAN_AUTOESCOLA_IPSLIBERADOS[7]=
#LAN_AUTOESCOLA_IPSLIBERADOS[8]=
#LAN_AUTOESCOLA_IPSLIBERADOS[9]=
masqueradeByIP ${LAN_AUTOESCOLA_IPSLIBERADOS[@]}
#REGRAS GERAIS - Adicione as regras especificas aqui
#IX2 - Lenovo
iptables -t nat -A PREROUTING -i $WAN -p tcp --dport 443 -j DNAT --to 172.16.0.30
#Acesso desta rede com origem na interface eth1 (Rede interna) com destino a interface Wan (Redes externas)
#Acesso de outras redes com origem na interface Wan (Redes externas) com destino a interface eth1(Rede interna)
iptables -A FORWARD -i eth1 -o $WAN -s $LAN_AUTOESCOLA -d 0/0 -j ACCEPT
iptables -A FORWARD -i $WAN -o eth1 -d $LAN_AUTOESCOLA -s 0/0 -j ACCEPT
echo -e '/> \n'
}
function cfc()
{
echo -e '\n <cfc'
#Nome dos Hosts e IP's importantes
local ESTCFC01=172.16.0.66/32 #Secretaria
local ESTCFC02=172.16.0.67/32 #Prova
local ESTCFC03=172.16.0.68/32 #Notebook CFC
local DVR=172.16.0.69/32 #DVR Intelbrás
#Para liberar os ips basta descomentar as linhas e inserir o ip na notação ip/bits mask
LAN_CFC_IPSLIBERADOS[0]=$ESTCFC01
LAN_CFC_IPSLIBERADOS[1]=$ESTCFC02
LAN_CFC_IPSLIBERADOS[2]=$ESTCFC03
LAN_CFC_IPSLIBERADOS[3]=$DVR
#LAN_CFC_IPSLIBERADOS[4]=
#LAN_CFC_IPSLIBERADOS[5]=
#LAN_CFC_IPSLIBERADOS[6]=
#LAN_CFC_IPSLIBERADOS[7]=
#LAN_CFC_IPSLIBERADOS[8]=
#LAN_CFC_IPSLIBERADOS[9]=
masqueradeByIP ${LAN_CFC_IPSLIBERADOS[@]}
#REGRAS GERAIS - Adicione as regras especificas aqui
#dvr
iptables -t nat -A PREROUTING -i $WAN -p tcp --dport 9090 -j DNAT --to 172.16.0.69
iptables -t nat -A PREROUTING -i $WAN -p tcp --dport 37777 -j DNAT --to 172.16.0.69
iptables -t nat -A PREROUTING -i $WAN -p udp --dport 37778 -j DNAT --to 172.16.0.69
#Acesso desta rede com origem na interface eth1 (Rede interna) com destino a interface Wan (Redes externas)
#Acesso de outras redes com origem na interface Wan (Redes externas) com destino a interface eth1(Rede interna)
iptables -A FORWARD -i eth1 -o $WAN -s $LAN_CFC -d 0/0 -j ACCEPT
iptables -A FORWARD -i $WAN -o eth1 -d $LAN_CFC -s 0/0 -j ACCEPT
echo -e '/> \n'
}
function terceiraVisao()
{
echo -e '\n <terceiraVisao'
#Nome dos Hosts e IP's importantes
#Para liberar os ips basta descomentar as linhas e inserir o ip na notação ip/bits mask
#LAN_3VISAO_IPSLIBERADOS[0]=
#LAN_3VISAO_IPSLIBERADOS[1]=
#LAN_3VISAO_IPSLIBERADOS[2]=
#LAN_3VISAO_IPSLIBERADOS[3]=
#LAN_3VISAO_IPSLIBERADOS[4]=
#LAN_3VISAO_IPSLIBERADOS[5]=
#LAN_3VISAO_IPSLIBERADOS[6]=
#LAN_3VISAO_IPSLIBERADOS[7]=
#LAN_3VISAO_IPSLIBERADOS[8]=
#LAN_3VISAO_IPSLIBERADOS[9]=
#masqueradeByIP ${LAN_3VISAO_IPSLIBERADOS[@]}
#REGRAS GERAIS - Adicione as regras especificas aqui
#DVR
iptables -t nat -A PREROUTING -i $WAN -p tcp --dport 8081 -j DNAT --to 172.16.0.58
iptables -t nat -A PREROUTING -i $WAN -p tcp --dport 37777 -j DNAT --to 172.16.0.58
iptables -t nat -A PREROUTING -i $WAN -p udp --dport 37777 -j DNAT --to 172.16.0.58
#RANGE 3VISAO
iptables -t nat -A POSTROUTING -o $WAN -m iprange --src-range 172.16.0.48-172.16.0.60 -j MASQUERADE
#Acesso desta rede com origem na interface eth1 (Rede interna) com destino a interface Wan (Redes externas)
#Acesso de outras redes com origem na interface Wan (Redes externas) com destino a interface eth1(Rede interna)
iptables -A FORWARD -i eth1 -o $WAN -s $LAN_3VISAO -d 0/0 -j ACCEPT
iptables -A FORWARD -i $WAN -o eth1 -d $LAN_3VISAO -s 0/0 -j ACCEPT
echo -e '/> \n'
}
#VARIAVIES globais
WAN=eth2
LAN_BALANCEADOR=192.168.250.0/24
LAN_DESPACHANTE=172.16.0.0/27
LAN_AUTOESCOLA=172.16.0.32/27
LAN_CFC=172.16.0.64/27
LAN_PERICIA=172.16.0.96/27
LAN_3VISAO=172.16.0.128/27
#MAIN
# OBSERVAÇÃO IMPORTANTE:
# A POLITICA FORWARD É DROP, PORTANTO QUALQUER ACESSO ENTRE AS REDES DEVEM ESTAR DEFINIDOS DE FORMA BIDIRECIONAL
# OU SEJA, CASO UMA REDE INTERNA(EHT1) OU EXTERNA(WAN) PRECISE SE COMUNICAR, É NECESSÁRIO ESPECIFICAR AS REGRAS
# E UTILIZANDO A AÇÃO "ACCEPT". AS DEMAIS CONEXÕES NÃO ESPECIFICADAS, SERÃO DESCARTADAS POR PADRÃO.
#Aplicar as regras
echo -e "\n ## Processando regras ##\n"
echo -e "OBS.: Nao sera exibida mensagens para regras especificas"
regrasInternas
despachante
pericia
autoEscola
cfc
terceiraVisao
todasRedes
echo -e 'REGRAS DO FIREWALL PROCESSADAS COM SUCESSO!!! \n'