Controlar acesso a determinados sites a faixas de IPs com iptables

1. Controlar acesso a determinados sites a faixas de IPs com iptables

Jesus Leal
jjleal

(usa Debian)

Enviado em 19/11/2017 - 17:02h

Olá pessoal! Peço desculpas por erros que venha a ter nesta dúvida, sou novo no VOL.

Eu estou criando UM de poucos Firewall(s) que já montei e estou com uma dificuldade em liberar poucos sites para uma determinada faixa de IPs. Eu pesquisei vários artigos aqui e os colaboradores responderam ser melhor usar com Squid o que eu concordo se as regras de negócio da empresa que usa este servidor forem muitas, então, se alguém puder me ajudar seria muito bom e eu ficaria muito agradecido.

Vou postar o Firewall que montei abaixo e comentar no meio do código onde preciso criar/mudar as regras específicas e logo abaixo do script está meu problema.

#!/bin/bash
#
#
### BEGIN INIT INFO
# Provides: firewall
# Required-Start: networking
# Required-Stop:
# Should-Start: S
# Should-Stop:
# Default-Start: 2 3 4 5
# Default-Stop:
# Short-Description: Firewall
# Description: Firewall
### END INIT INFO

### Carregando os modulos ###
modprobe ip_tables
modprobe iptable_filter
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe iptable_nat
modprobe ip_nat_ftp
modprobe ipt_LOG
modprobe ipt_state
modprobe ipt_MASQUERADE
modprobe ipt_string

### Binario do comando ###
IPT=$(which iptables)

### Variaveis ###
ALL="0:65535"
PA="1024:65535"
IFINTERNET="eno1"
LO="127.0.0.1"
FW="192.168.20.254"
#WAN="192.168.1.254"
WAN=$(ifconfig eno1 | grep "inet" | awk -F" " '{print $2}' | head -1)
LAN="192.168.20.0/24"
CLIENTES="10.1.1.0/24"

case $1 in

stop)
echo ""
echo "Parando Firewall..."
echo ""

### Inicio das Regras ###
$IPT -P OUTPUT ACCEPT
$IPT -P INPUT ACCEPT
$IPT -P FORWARD ACCEPT
#$IPT -F OUTPUT ACCEPT
#$IPT -F INPUT ACCEPT
#$IPT -F FORWARD ACCEPT

### Limpando Regras ###
$IPT -F
$IPT -F -t nat
$IPT -F -t mangle
$IPT -X

;;

start)
echo ""
echo "Iniciando Firewall..."
echo ""

### Regras Padrao ###
$IPT -P INPUT DROP
$IPT -P OUTPUT DROP
$IPT -P FORWARD DROP

### Ignorar pings ###
echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_all
$IPT -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
$IPT -A INPUT -p icmp -j DROP

### Protecao conta IP Spoofing
echo "1" > /proc/sys/net/ipv4/conf/default/rp_filter
#for i in /proc/sys/net/ipv4/conf/*/rp_filter
#do
# echo "1" > $i | > /dev/null
#done

### Protecao conta Synflood ###
echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

### Bloqueia Traceroute
$IPT -A INPUT -p udp --dport 33435:33525 -j DROP

### Habilitar passagem de pacotes ###
echo "1" > /proc/sys/net/ipv4/ip_forward

### Permite pingar WAN ###
$IPT -A INPUT -p icmp -d $WAN -j ACCEPT
$IPT -A OUTPUT -p icmp -s $WAN -j ACCEPT

### Permite passagem de pacotes lo ###
$IPT -A INPUT -i lo -j ACCEPT
$IPT -A OUTPUT -o lo -j ACCEPT

### Permite a LAN pingar FW ###
$IPT -A INPUT -p icmp -s $LAN -d $FW -j ACCEPT
$IPT -A OUTPUT -p icmp -s $FW -d $LAN -j ACCEPT

### Permite FW pingar por nomes ###
$IPT -A INPUT -p udp --sport 53 -s 0/0 -d $WAN --dport $PA -j ACCEPT
$IPT -A OUTPUT -p udp --sport $PA -s $WAN -d 0/0 --dport 53 -j ACCEPT

### Permite passagem HTTP ###
$IPT -A INPUT -p tcp --sport 80 -s 0/0 -d 0/0 --dport $PA -j ACCEPT
$IPT -A OUTPUT -p tcp --sport $PA -s 0/0 -d 0/0 --dport 80 -j ACCEPT

### Liberando toda a internet para IPS registrados no DHCP com MAC ###
IPSL="/root/IPS-Liberados.txt"
for LIB in `cat $IPSL` ; do
echo -n "Acesso total a internet ao cliente: "
CLIENTEL=`echo $LIB | cut -d"|" -f1`
IPL=`echo $LIB | cut -d"|" -f2`
MACL=`echo $LIB | cut -d"|" -f3`
$IPT -t filter -A FORWARD -d 0/0 -s $IPL -m mac --mac-source $MACL -j ACCEPT
$IPT -t filter -A FORWARD -d $IPL -s 0/0 -j ACCEPT
$IPT -t filter -A INPUT -s 0/0 -d $IPL -m mac --mac-source $MACL -j ACCEPT
$IPT -t filter -A OUTPUT -s $IPL -d 0/0 -j ACCEPT
$IPT -t nat -A POSTROUTING -o eno1 -s $IPL -j MASQUERADE
echo $CLIENTEL
done

### Permite compartilhamento internet ###
$IPT -t nat -A POSTROUTING -o eno1 -s $CLIENTES -j MASQUERADE

### Permite a passagem de ping LAN a INTERNET ###
$IPT -A FORWARD -p icmp -d $LAN -j ACCEPT
$IPT -A FORWARD -p icmp -s $LAN -j ACCEPT

### Permite a resoluçao de nomes do mundo para a rede ###
$IPT -A INPUT -p udp --sport $PA -s 0/0 -d 0/0 --dport 53 -j ACCEPT
$IPT -A OUTPUT -p udp --sport 53 -s 0/0 -d 0/0 --dport $PA -j ACCEPT
$IPT -A FORWARD -p udp --sport 53 -s 0/0 -d $LAN --dport $PA -j ACCEPT
$IPT -A FORWARD -p udp --sport $PA -s $LAN -d 0/0 --dport 53 -j ACCEPT
$IPT -A FORWARD -p udp --sport 53 -s 0/0 -d $CLIENTES --dport $PA -j ACCEPT
$IPT -A FORWARD -p udp --sport $PA -s $CLIENTES -d 0/0 --dport 53 -j ACCEPT

### Permite a passagem de protocolos comuns para LAN ###
for serv_ext in 110 143 993 587 995 21 20 5938 5939
do
$IPT -A FORWARD -p tcp --sport $serv_ext -s 0/0 -d $IPL --dport $PA -j ACCEPT
$IPT -A FORWARD -p tcp --sport $PA -s $IPL -d 0/0 --dport $serv_ext -j ACCEPT
done

### Permite a passagem de protocolos comuns para CLIENTES ###
for serv_ext in 80 443 110 143 993 587 995
do
$IPT -A FORWARD -p tcp --sport $serv_ext -s 0/0 -d $CLIENTES --dport $PA -j ACCEPT
$IPT -A FORWARD -p tcp --sport $PA -s $CLIENTES -d 0/0 --dport $serv_ext -j ACCEPT
done

### Bloqueio acesso entre redes ###
$IPT -A INPUT -s $LAN -d $CLIENTES -j DROP
$IPT -A OUTPUT -s $CLIENTES -d $LAN -j DROP
$IPT -A INPUT -s $CLIENTES -d $LAN -j DROP
$IPT -A OUTPUT -s $LAN -d $CLIENTES -j DROP
$IPT -A FORWARD -s $LAN -d $CLIENTES -j DROP
$IPT -A FORWARD -s $CLIENTES -d $LAN -j DROP

### Permite FW e WAN receber SSH ###
$IPT -A INPUT -p tcp --sport $PA -s $LAN -d $FW --dport 51000 -j ACCEPT
$IPT -A OUTPUT -p tcp --sport 51000 -s $FW -d $LAN --dport $PA -j ACCEPT
$IPT -A INPUT -p tcp --sport $PA -s 0/0 -d $WAN --dport 51000 -j ACCEPT
$IPT -A OUTPUT -p tcp --sport 51000 -s $WAN -d 0/0 --dport $PA -j ACCEPT

### Habilita a passagem de pacotes nas portas 137:139 SAMBA ###
#$IPT -A INPUT -s 192.168.60.0/24 -p tcp --dport 137:139 -j ACCEPT
#IPT -A OUTPUT -s 192.168.60.0/24 -p tcp --dport 137:139 -j ACCEPT
#IPT -A INPUT -s 192.168.60.0/24 -p udp --dport 137:139 -j ACCEPT
#IPT -A OUTPUT -s 192.168.60.0/24 -p udp --dport 137:139 -j ACCEPT
#IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#IPT -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#IPT -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

### Bloqueia acesso por string do pacote ###
#$IPT -A INPUT -s $IPL -m string --string "facebook" --algo bm -j DROP

### Bloqueio de pacotes NEW e INVALID vindo da internet
#$IPT -A INPUT -m state --state NEW -i $IFINTERNET -j DROP
$IPT -A INPUT -m state --state INVALID -i $IFINTERNET -j DROP

### Permite pacotes Estabelecidos e relacionados
$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

#### ---- INICIO - ESTE BLOCO DE CÓDIGO ESTÁ MINHA DÚVIDA/PROBLEMA ---- ####

### Liberando apenas alguns site ###
IPSB="/root/IPS-Bloqueados.txt"
SITESLIB="/root/SITES-Liberados.txt"
while read LINHA ; do
SITES=`echo $LINHA`
for BLO in `cat $IPSB` ; do
echo -n "Liberando" $LINHA "ao cliente: "
CLIENTEB=`echo $BLO | cut -d"|" -f1`
IPB=`echo $BLO | cut -d"|" -f2`
MACB=`echo $BLO | cut -d"|" -f3`
$IPT -t nat -A PREROUTING -i eno1 -s $IPB -p tcp --dport 80 -j REDIRECT --to-port 3128
$IPT -t nat -A PREROUTING -i eno1 -s $IPB -p tcp --dport 443 -j REDIRECT --to-port 3128
$IPT -t nat -A PREROUTING -i eno1 -p tcp --dport 80 -s $IPB -d $LINHA -j RETURN
$IPT -t nat -A PREROUTING -i eno1 -p tcp --dport 443 -s $IPB -d $LINHA -j RETURN
$IPT -t nat -A PREROUTING -i eno1 -s $IPB -d $LINHA -j ACCEPT
for PORTAL in 80 443 5938
do
$IPT -A INPUT -p tcp --sport $PA -s $IPB -d $LINHA --dport $PORTAL -j ACCEPT
$IPT -A OUTPUT -p tcp --sport $PORTAL -s $LINHA -d $IPB --dport $PA -j ACCEPT
$IPT -A INPUT -p udp --sport $PA -s $IPB -d $LINHA --dport $PORTAL -j ACCEPT
$IPT -A OUTPUT -p udp --sport $PORTAL -s $LINHA -d $IPB --dport $PA -j ACCEPT
$IPT -A INPUT -p tcp -m string --algo bm --string $LINHA -j ACCEPT
$IPT -A OUTPUT -p tcp -m string --algo bm --string $LINHA -j ACCEPT
$IPT -A FORWARD -p tcp -m string --algo bm --string $LINHA -j ACCEPT
$IPT -A FORWARD -p tcp --sport $PORTAL -s $LINHA -d $IPB --dport $PA -j ACCEPT
$IPT -A FORWARD -p tcp --sport $PA -s $IPB -d $LINHA --dport $PORTAL -j ACCEPT
$IPT -A FORWARD -p udp --sport $PORTAL -s $LINHA -d $IPB --dport $PA -j ACCEPT
$IPT -A FORWARD -p udp --sport $PA -s $IPB -d $LINHA --dport $PORTAL -j ACCEPT
done
$IPT -t filter -A FORWARD -d $WAN -s $IPB -m mac --mac-source $MACB -j ACCEPT
$IPT -t filter -A FORWARD -d $IPB -s $WAN -j ACCEPT
$IPT -t filter -A INPUT -s $IPB -d $WAN -m mac --mac-source $MACB -j ACCEPT
$IPT -A INPUT -i eno1 -s $IPB -m state --state NEW -j ACCEPT
$IPT -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -t nat -A POSTROUTING -o eno1 -s $IPB -j MASQUERADE
echo $CLIENTEB
done
done < $SITESLIB

#### ---- FIM DO BLOCO COM DÚVIDA ---- ####
;;

restart)
$0 stop
sleep 0.5
$0 start

;;

*)
echo 'POR FAVOR USE "stop|start|restart"'
;;
esac

Tenho um servidor DHCP configurado amarrando MACs e IPs por placa e qualquer dispositivo novo não recebe IP se não estiver registrado.

Eu não tenho o Squid Proxy instalado (quero evitar o uso do proxy) mas estou direcionando o tráfego web para a porta 3128 de uma faixa específica de IPs internos liberando o sistema web da empresa que está localizado na nuvem. Estou fazendo um RETURN quando o destino é um site que está liberado/salvo em um arquivo TXT, que no caso o próprio sistema em nuvem da empresa, no entanto, precisa vir do IP com o MAC específico caso contrário é DROP.

MEU PROBLEMA:
Não estou conseguindo acessar o teamviewer e whatsapp usando esse bloco de código, então, eu preciso liberar apenas os seguintes sites para essa faixa de IPs.
teamviewer.com = Para conseguir acesso remoto na estação
web.whatsapp.com = Conversar com clientes
Mesmo liberando as portas e adicionando os sites no arquivo TXT de sites liberados (linha por linha) não consigo liberar e ter acesso nas estações específicas estes sites e serviços.
OBS: O sistema Web em nuvem da empresa não é HTTPS e esta sendo acessado SEM problemas nestes IPs "Bloqueados".


  


2. Re: Controlar acesso a determinados sites a faixas de IPs com iptables

Leandro Silva
LSSilva

(usa Outra)

Enviado em 20/11/2017 - 00:20h


#!/bin/bash
#
#
### BEGIN INIT INFO
# Provides: firewall
# Required-Start: networking
# Required-Stop:
# Should-Start: S
# Should-Stop:
# Default-Start: 2 3 4 5
# Default-Stop:
# Short-Description: Firewall
# Description: Firewall
### END INIT INFO

### Carregando os modulos ###
modprobe ip_tables
modprobe iptable_filter
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe iptable_nat
modprobe ip_nat_ftp
modprobe ipt_LOG
modprobe ipt_state
modprobe ipt_MASQUERADE
modprobe ipt_string

### Binario do comando ###
IPT=$(which iptables)

### Variaveis ###
ALL="0:65535"
PA="1024:65535"
IFINTERNET="eno1"
LO="127.0.0.1"
FW="192.168.20.254"
WAN=$(ifconfig eno1 | grep "inet" | awk -F" " '{print $2}' | head -1)
LAN="192.168.20.0/24"
CLIENTES="10.1.1.0/24"

case $1 in

stop)
echo ""
echo "Parando Firewall..."
echo ""

### Inicio das Regras ###
$IPT -P OUTPUT ACCEPT
$IPT -P INPUT ACCEPT
$IPT -P FORWARD ACCEPT

### Limpando Regras ###
$IPT -F
$IPT -F -t nat
$IPT -F -t mangle
$IPT -X

;;

start)

echo "Iniciando Firewall..."

### Regras Padrao ###
$IPT -P INPUT DROP
$IPT -P OUTPUT DROP
$IPT -P FORWARD DROP #Usaria accept na saída (não está usando proxy), são conexões originadas do seu servidor, creio que DROP aqui não seja necessário, a não ser que haja um motivo.

### Ignorar pings ###
echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_all
$IPT -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
$IPT -A INPUT -p icmp -j DROP
#Não entendi, você bloqueia ping no kernel e libera no iptables?


### Protecao conta IP Spoofing
echo "1" > /proc/sys/net/ipv4/conf/default/rp_filter
#for i in /proc/sys/net/ipv4/conf/*/rp_filter
#do
# echo "1" > $i | > /dev/null
#done
#Não precisa disto aqui, pode ser feito no /etc/sysctl.conf, irá deixar seu script de firewall mais limpo.


### Protecao conta Synflood ###
echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
#Não precisa disto aqui, pode ser feito no /etc/sysctl.conf, irá deixar seu script de firewall mais limpo.


### Bloqueia Traceroute
$IPT -A INPUT -p udp --dport 33435:33525 -j DROP
# Você já está usando política DROP, isso acima não faz nada.


### Habilitar passagem de pacotes ###
echo "1" > /proc/sys/net/ipv4/ip_forward
#Não precisa disto aqui, pode ser feito no /etc/sysctl.conf, irá deixar seu script de firewall mais limpo.


### Permite pingar WAN ###
$IPT -A INPUT -p icmp -d $WAN -j ACCEPT
$IPT -A OUTPUT -p icmp -s $WAN -j ACCEPT
#Não está liberando só ping (protocolo icmp tem outros vários serviços), para liberação de ping usaria:
#$IPT -A INPUT -p icmp --icmp-type echo-request -J ACCEPT
#$IPT -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT


### Permite passagem de pacotes lo ###
$IPT -A INPUT -i lo -j ACCEPT
$IPT -A OUTPUT -o lo -j ACCEPT

### Permite a LAN pingar FW ###
$IPT -A INPUT -p icmp -s $LAN -d $FW -j ACCEPT
$IPT -A OUTPUT -p icmp -s $FW -d $LAN -j ACCEPT
#Não está liberando só ping (protocolo icmp tem outros vários serviços), para liberação de ping usaria:
#$IPT -A INPUT -s $LAN -p icmp --icmp-type echo-request -J ACCEPT
#$IPT -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT #Já liberou na anterior


### Permite FW pingar por nomes ###
$IPT -A INPUT -p udp --sport 53 -s 0/0 -d $WAN --dport $PA -j ACCEPT
$IPT -A OUTPUT -p udp --sport $PA -s $WAN -d 0/0 --dport 53 -j ACCEPT
#Não realiza o que está descrito.
#Primeira regra permite consulta de DNS no serviços, porém de forma errônea.
#Segunda regra permite que seu servidor consulte DNS externo, também de forma errônea.
#Faria assim:
#$IPT -A INPUT -p udp --dport 53 -i $IFINTERNET -m state --state NEW -j ACCEPT #Liberar consulta de DNS no meu servidor (vindo da internet)
#$IPT -A OUTPUT -p udp --dport 53 -m state --state NEW -j ACCEPT #Liberar meu servidor consultar DNS Externo
#DNS funciona com porta TCP e UDP, teria que fazer pras duas.



### Permite passagem HTTP ###
$IPT -A INPUT -p tcp --sport 80 -s 0/0 -d 0/0 --dport $PA -j ACCEPT
$IPT -A OUTPUT -p tcp --sport $PA -s 0/0 -d 0/0 --dport 80 -j ACCEPT
#Não realiza o que está descrito
#Primeira regra permite que seu servidor seja acesso via internet na porta 80 (HTTP), porém houve inversão de lógica (ao meu ver)
#Correto seria assim (pois a conexão é iniciada no host geralmente em porta alta (sua variável $PA e destinada à porta de serviço no servidor (no caso a 80):
#$IPT -A INPUT -p tcp --dport 80 -i $IFINTERNET -m state --state NEW --syn -j ACCEPT
#$IPT -A OUTPUT -p tcp --dport 80 -m state --state NEW --syn -j ACCEPT



### Liberando toda a internet para IPS registrados no DHCP com MAC ###
IPSL="/root/IPS-Liberados.txt"
for LIB in `cat $IPSL` ; do
echo -n "Acesso total a internet ao cliente: "
CLIENTEL=`echo $LIB | cut -d"|" -f1`
IPL=`echo $LIB | cut -d"|" -f2`
MACL=`echo $LIB | cut -d"|" -f3`
$IPT -t filter -A FORWARD -d 0/0 -s $IPL -m mac --mac-source $MACL -j ACCEPT #Não precisaria, a não ser para didática, declarar tabela Filter, pois ela é padrão quando omitido.
$IPT -t filter -A FORWARD -d $IPL -s 0/0 -j ACCEPT
$IPT -t filter -A INPUT -s 0/0 -d $IPL -m mac --mac-source $MACL -j ACCEPT #Já não tem nada com a internet, está liberando acesso ao seu servidor para os hosts liberados.
$IPT -t filter -A OUTPUT -s $IPL -d 0/0 -j ACCEPT #Não tem nada relevante aqui, apenas seu servidor irá usar o output. O source do output é o servidor.
$IPT -t nat -A POSTROUTING -o eno1 -s $IPL -j MASQUERADE #Já não tem uma variável chamada $IFINTERNET criada, por que declarou nome da interface (tá, isso é chatisse minha... :))
echo $CLIENTEL
done

### Permite compartilhamento internet ###
$IPT -t nat -A POSTROUTING -o eno1 -s $CLIENTES -j MASQUERADE
#Nada a declarar aqui (está liberando internet pros clientes)


### Permite a passagem de ping LAN a INTERNET ###
$IPT -A FORWARD -p icmp -d $LAN -j ACCEPT
$IPT -A FORWARD -p icmp -s $LAN -j ACCEPT
#Não está liberando só ping, como dito acima:
#$IPT -A FORWARD -p icmp --icmp-type echo-request -s $LAN -o $IFINTERNET -j ACCEPT #Isso resolve.



### Permite a resoluçao de nomes do mundo para a rede ###
$IPT -A INPUT -p udp --sport $PA -s 0/0 -d 0/0 --dport 53 -j ACCEPT #Está liberando consulta de DNS novamente no seu server (já fez isso), agora porém fez de forma melhor.
$IPT -A OUTPUT -p udp --sport 53 -s 0/0 -d 0/0 --dport $PA -j ACCEPT #Não irá ter efeito desejado.
$IPT -A FORWARD -p udp --sport 53 -s 0/0 -d $LAN --dport $PA -j ACCEPT #Não irá ter efeito desejado.
$IPT -A FORWARD -p udp --sport $PA -s $LAN -d 0/0 --dport 53 -j ACCEPT #Essa irá ter efeito desejado (que é permitir que sua rede acesse DNS externo)
$IPT -A FORWARD -p udp --sport 53 -s 0/0 -d $CLIENTES --dport $PA -j ACCEPT #Essa também funciona, apesar de não ser necessária (Utilize uma regra por protocolo pra permitir conexões ESTABLISHED,RELATED).
$IPT -A FORWARD -p udp --sport $PA -s $CLIENTES -d 0/0 --dport 53 -j ACCEPT #Essa irá ter efeito desejado (que é permitir que sua rede acesse DNS externo) (2).
#Lembrando que DNS utiliza portas TCP e UDP (53).


### Permite a passagem de protocolos comuns para LAN ###
for serv_ext in 110 143 993 587 995 21 20 5938 5939
do
$IPT -A FORWARD -p tcp --sport $serv_ext -s 0/0 -d $IPL --dport $PA -j ACCEPT #Não irá ter efeito desejado.
$IPT -A FORWARD -p tcp --sport $PA -s $IPL -d 0/0 --dport $serv_ext -j ACCEPT #Essa funcionará.
done

#Bom, vou parar por aqui, tentei te auxiliar com o firewall, para ficar mais legível, eficaz.
#Vamos à sua dúvida...


### Permite a passagem de protocolos comuns para CLIENTES ###
for serv_ext in 80 443 110 143 993 587 995
do
$IPT -A FORWARD -p tcp --sport $serv_ext -s 0/0 -d $CLIENTES --dport $PA -j ACCEPT
$IPT -A FORWARD -p tcp --sport $PA -s $CLIENTES -d 0/0 --dport $serv_ext -j ACCEPT
done

### Bloqueio acesso entre redes ###
$IPT -A INPUT -s $LAN -d $CLIENTES -j DROP
$IPT -A OUTPUT -s $CLIENTES -d $LAN -j DROP
$IPT -A INPUT -s $CLIENTES -d $LAN -j DROP
$IPT -A OUTPUT -s $LAN -d $CLIENTES -j DROP
$IPT -A FORWARD -s $LAN -d $CLIENTES -j DROP
$IPT -A FORWARD -s $CLIENTES -d $LAN -j DROP

### Permite FW e WAN receber SSH ###
$IPT -A INPUT -p tcp --sport $PA -s $LAN -d $FW --dport 51000 -j ACCEPT
$IPT -A OUTPUT -p tcp --sport 51000 -s $FW -d $LAN --dport $PA -j ACCEPT
$IPT -A INPUT -p tcp --sport $PA -s 0/0 -d $WAN --dport 51000 -j ACCEPT
$IPT -A OUTPUT -p tcp --sport 51000 -s $WAN -d 0/0 --dport $PA -j ACCEPT

### Habilita a passagem de pacotes nas portas 137:139 SAMBA ###
#$IPT -A INPUT -s 192.168.60.0/24 -p tcp --dport 137:139 -j ACCEPT
#IPT -A OUTPUT -s 192.168.60.0/24 -p tcp --dport 137:139 -j ACCEPT
#IPT -A INPUT -s 192.168.60.0/24 -p udp --dport 137:139 -j ACCEPT
#IPT -A OUTPUT -s 192.168.60.0/24 -p udp --dport 137:139 -j ACCEPT
#IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#IPT -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#IPT -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

### Bloqueia acesso por string do pacote ###
#$IPT -A INPUT -s $IPL -m string --string "facebook" --algo bm -j DROP

### Bloqueio de pacotes NEW e INVALID vindo da internet
#$IPT -A INPUT -m state --state NEW -i $IFINTERNET -j DROP
$IPT -A INPUT -m state --state INVALID -i $IFINTERNET -j DROP

### Permite pacotes Estabelecidos e relacionados
$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

#### ---- INICIO - ESTE BLOCO DE CÓDIGO ESTÁ MINHA DÚVIDA/PROBLEMA ---- ####

### Liberando apenas alguns site ###
IPSB="/root/IPS-Bloqueados.txt"
SITESLIB="/root/SITES-Liberados.txt"
while read LINHA ; do
SITES=`echo $LINHA`
for BLO in `cat $IPSB` ; do
echo -n "Liberando" $LINHA "ao cliente: "
CLIENTEB=`echo $BLO | cut -d"|" -f1`
IPB=`echo $BLO | cut -d"|" -f2`
MACB=`echo $BLO | cut -d"|" -f3`
$IPT -t nat -A PREROUTING -i eno1 -s $IPB -p tcp --dport 80 -j REDIRECT --to-port 3128 # Por que fez isso (direcionar tráfego HTTP sem proxy?)
$IPT -t nat -A PREROUTING -i eno1 -s $IPB -p tcp --dport 443 -j REDIRECT --to-port 3128 # Aqui também tá quebrando seu esquema.
$IPT -t nat -A PREROUTING -i eno1 -p tcp --dport 80 -s $IPB -d $LINHA -j RETURN # Eu removeria...
$IPT -t nat -A PREROUTING -i eno1 -p tcp --dport 443 -s $IPB -d $LINHA -j RETURN # Eu removeria...
$IPT -t nat -A PREROUTING -i eno1 -s $IPB -d $LINHA -j ACCEPT # Eu removeria...
for PORTAL in 80 443 5938
do
$IPT -A INPUT -p tcp --sport $PA -s $IPB -d $LINHA --dport $PORTAL -j ACCEPT
$IPT -A OUTPUT -p tcp --sport $PORTAL -s $LINHA -d $IPB --dport $PA -j ACCEPT
$IPT -A INPUT -p udp --sport $PA -s $IPB -d $LINHA --dport $PORTAL -j ACCEPT
$IPT -A OUTPUT -p udp --sport $PORTAL -s $LINHA -d $IPB --dport $PA -j ACCEPT
$IPT -A INPUT -p tcp -m string --algo bm --string $LINHA -j ACCEPT
$IPT -A OUTPUT -p tcp -m string --algo bm --string $LINHA -j ACCEPT
$IPT -A FORWARD -p tcp -m string --algo bm --string $LINHA -j ACCEPT
$IPT -A FORWARD -p tcp --sport $PORTAL -s $LINHA -d $IPB --dport $PA -j ACCEPT
$IPT -A FORWARD -p tcp --sport $PA -s $IPB -d $LINHA --dport $PORTAL -j ACCEPT
$IPT -A FORWARD -p udp --sport $PORTAL -s $LINHA -d $IPB --dport $PA -j ACCEPT
$IPT -A FORWARD -p udp --sport $PA -s $IPB -d $LINHA --dport $PORTAL -j ACCEPT
done
$IPT -t filter -A FORWARD -d $WAN -s $IPB -m mac --mac-source $MACB -j ACCEPT
$IPT -t filter -A FORWARD -d $IPB -s $WAN -j ACCEPT
$IPT -t filter -A INPUT -s $IPB -d $WAN -m mac --mac-source $MACB -j ACCEPT
$IPT -A INPUT -i eno1 -s $IPB -m state --state NEW -j ACCEPT
$IPT -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -t nat -A POSTROUTING -o eno1 -s $IPB -j MASQUERADE
echo $CLIENTEB
done
done < $SITESLIB

#### ---- FIM DO BLOCO COM DÚVIDA ---- ####
;;

restart)
$0 stop
sleep 0.5
$0 start

;;

*)
echo 'POR FAVOR USE "stop|start|restart"'
;;
esac



Bom, eu removeria todo este bloco que está te causando problemas, neste caso, faria novamente o firewall.
Me diga o que está querendo que seu firewall faça que eu posso te auxiliar com isso (levantar os serviços que a rede interna irá usar e o que irão acessar, além das demais aplicações, verificar que irá acessar o server, quais serviços o server irá prover,etc).
Eu te aconselho a adotar o squid. Pode te auxiliar bastante nesta questão.


3. Firewall

Jesus Leal
jjleal

(usa Debian)

Enviado em 23/11/2017 - 16:32h

Olá amigo tudo bem? Desculpe a demora, pois a semana foi bastante puxada.

Mas vamos lá, fico muito grato por ajudar a deixar mais clean o Firewall, eu vou reescrever ele com suas dicas.

Mas em relação ao bloco que comentou para que eu remova, vou explicar como está servindo este servidor.

Tenho uma placa vindo da internet: ok

Libero acesso para a rede clientes: Nessa rede clientes eu tenho acesso livre a internet através de um hotspot 300 da intelbras que faz o Qos limitando a banda de forma simples e eficiente com checkin do facebook.

Libero o acesso agora para a outra rede em outra placa de rede apenas para os ips registrados no dhcp e tem o mac especifico.
(Nesta rede eu não adicionei um MASQUERADE para a $LAN toda devido a regra de negócio da empresa que é a seguinte)
Apenas 5 PCs possuem acesso livre na internet, por isso eu faco MASQUERADE apenas aos IPS-Liberados.txt, funciona tranquilamente.

Para os demais IPS-Bloqueados.txt eu tenho que liberar apenas o uso dos sites:
teamviewer.com
sistemadaempresa.com.br
web.whatsapp.com.br

Quero evitar usar squid devido a má gestão de sites https pois em instalações anteriores do firewall com squid em outros locais não consegui filtrar bem sites com https.

Outro motivo é evitar usar mais um serviço no servidor e a gerencia do squid por ser apenas 3 sites a liberar.

Então para esse bloco de IPS-Bloqueados.txt eu tenho que liberar somente esses sites e as portas relacionadas a estes serviços.

Por questão de regra de negócio. Qualquer computador que entre na rede que não tenha sido registrado no dhcp não pega ip e mesmo que coloque o ip na placa de rede precisa casar ip e mac para navegar.

Então resumindo, preciso liberar apenas estes 3 sites para os IPS-Bloqueados.txt e as portas desses serviços (80, 443, teamviewer e whatsapp) e bloquear todo restante de acesso a internet.


4. Re: Controlar acesso a determinados sites a faixas de IPs com iptables

Leandro Silva
LSSilva

(usa Outra)

Enviado em 23/11/2017 - 23:53h

Eu faria o mesmo firewall assim (você teria que alterar as variáveis das interfaces e os ranges de ips, assim como as variáveis no meio do script, nada complicado):

#!/bin/bash
#
#
### BEGIN INIT INFO
# Provides: firewall
# Required-Start: networking
# Required-Stop:
# Should-Start: S
# Should-Stop:
# Default-Start: 2 3 4 5
# Default-Stop:
# Short-Description: Firewall
# Description: Firewall
### END INIT INFO

#Variáveis

#Interfaces
LAN="eth0"
WAN="eth1"
CLIENTES="eth2"

#Networks
LANNET="192.168.2.0/24"
CLIENTESNET="10.1.0.0/24"


iniciar(){

#Zera Regras
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X

#Define política padrão
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

#Filter-Input
#Drop Invalid
iptables -A INPUT -m state --state INVALID -j LOG --log-prefix "Firewall: Invalid Input "
iptables -A INPUT -m state --state INVALID -j DROP
#Accept Valid
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#Conexões que quer que seu servidor aceite, vamos supor que quer apenas ssh da internet e ping da lan.
#SSH-Exemplo (Vindo de 0.0.0.0/0)
iptables -A INPUT -i $WAN -p tcp --dport 22 -m state --state NEW --syn -j ACCEPT
#Liberar Ping na LAN
iptables -A INPUT -i $LAN -p icmp --icmp-type echo-request -s $LANNET -j ACCEPT
#Liberar Interface Loopback
iptables -A INPUT -i lo -j ACCEPT
#Log Padrão
iptables -A INPUT ! -i lo -j LOG --log-prefix "Firewall: Drop Input "

#Filter-Forward
#Drop Invalid
iptables -A FORWARD -m state --state INVALID -j LOG --log-prefix "Firewall: Invalid Forward "
iptables -A FORWARD -m state --state INVALID -j Drop
#Accept Valid
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
#Anti-Spoof
iptables -A FORWARD -i $LAN ! -s $LANNET -j LOG --log-prefix "Firewall: Spoofed "
iptables -A FORWARD -i $LAN ! -s $LANNET -j DROP
iptables -A FORWARD -i $CLIENTES ! -s $CLIENTESNET -j LOG --log-prefix "Firewall: Spoofed "
iptables -A FORWARD -i $CLIENTES ! -s $CLIENTESNET -j DROP
#Libera serviços tcp para rede interna
for PORT in 110 143 993 587 995 21 20 53 5938 5939; do
iptables -A FORWARD -i $LAN -s $LANNET -o $WAN -p tcp --dport $PORT -m state --state NEW --syn -j ACCEPT
done
#Libera serviços udp para rede interna - adicionar o que mais houver de tráfego udp.
for PORT in 53; do
iptables -A FORWARD -i $LAN -s $LANNET -o $WAN -p tcp --dport $PORT -m state --state NEW -j ACCEPT
done
#Libera serviços tcp para rede clientes
for PORT in 80 443 110 143 993 587 995 53; do
iptables -A FORWARD -i $CLIENTES -s $CLIENTESNET -o $WAN -p tcp --dport $PORT -m state --state NEW --syn -j ACCEPT
done
#Libera serviços udp para rede clientes - adicionar o que mais houver de tráfego udp.
for PORT in 53; do
iptables -A FORWARD -i $CLIENTES -s $CLIENTESNET -o $WAN -p udp --dport $PORT -m state --state NEW -j ACCEPT
done
# -- Creio que aqui esteja sua dúvida --
#Libera Acesso aos Ips Liberados - Modifique com os ips liberados
IPS-LIBERADOS="192.168.2.5 192.168.2.6 192.168.2.7 192.168.2.8 192.168.2.9"
for IPSL in $IPS-LIBERADOS; do
iptables -A FORWARD -i $LAN -s $IPSL -p tcp -m multiport --dports 80,443 -o $WAN -m state --state NEW --syn -j ACCEPT
done
#Libera apenas sites em um documento de texto para demais IPS - Modifique com o seu caminho de sites liberados.
for SITE in `cat /etc/configs/sitesliberados`; do
iptables -A FORWARD -i $LAN -s $LANNET -p tcp -m multiport --dports 80,443 -o $WAN -d $SITE -m state --state NEW --syn -j ACCEPT
done
# -- Fim bloco de possível dúvida. --

#Filter-Output
#Drop Invalid
iptables -A OUTPUT -m state --state INVALID -j LOG --log-prefix "Firewall: Invalid Output "
iptables -A OUTPUT -m state --state INVALID -j Drop
#Output pode deixar liberado, são conexões originadas do seu server e apenas dele.

#Nat-Postrouting
# Já bloqueou navegação acima, pode fazer postrouting.
iptables -t nat -A POSTROUTING -s $LANNET -o $WAN -j MASQUERADE
iptables -t nat -A POSTROUTING -s $CLIENTESNET -o $WAN -j MASQUERADE

}
parar(){

#Zera Regras
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X

#Define política padrão
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

echo "Firewall paralisado."

}

case $1 in
start) iniciar;;
stop) parar;;
restart) parar; iniciar;;
*) echo "Use start/stop/restart."
esac


A questão dos IP's e Mac's você pode fazer no DHCP server e a questão do IP_FORWARD, RP_FILTER, TCP_SYNCOOKIES, etc; no /etc/sysctl.conf, descomente/adicione os que quiser e dê o comando: sysctl -p.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts