Controlando 2 links de internet (roteados) em um gateway Linux com SQUID
Há algum tempo atrás precisei ativar 2 links dedicados e de fornecedores diferentes. Quando meu segundo link foi ativado, começou minha dor de cabeça. Não é simplesmente colocar o ip da nova operadora e ponto. Deve-se fazer muitas configurações para que isso funcione. E através de pesquisas consegui colocar essa solução para funcionar perfeitamente, veja aqui como ficou e espero que lhe ajude!
Parte 6: O script final
Edite o arquivo /etc/fw e coloque nele o conteúdo abaixo:
Script pronto, agora temos que torná-lo executável:
# chmod +x /etc/fw
Vamos colocar ele no patch pra poder executar apenas digitando "fw" no prompt.
# ln -s /etc/fw /sbin/fw
Pronto. Agora basta testar e correr para o abraço.
Obs: No SQUID basta adicionar o que está no item 6 e pronto.
Espero que tenha ajudado alguém!
#!/bin/bash
clear
echo "------------ FIREWALL ------------"
## iptables
ipt=iptables
## link1
link1_iface=eth0 # interface do seu link1
link1_rede=100.100.100.0/30 # aqui você coloca sua rede, com máscara
link1_gw=100.100.100.1 # o gateway do seu link1
link1_ip_local=100.100.100.2 # o ip do seu server do link1
## link2
link2_iface=eth1 # interface do seu link2
link2_rede=200.200.200.0/30 # aqui você coloca sua rede, com máscara
link2_gw=200.200.200.1 # o gateway do seu link2
link2_ip_local=200.200.200.2 # o ip do seu server do link2
## rede local
lan_iface=eth2
lan_rede=192.168.0.0/24 # aqui você coloca sua rede com máscara
lan_gw=192.168.0.254 # aqui coloca o gw da rede local
# carregar módulos
echo "Carregando módulos..."
modprobe ip_tables
modprobe iptable_nat
modprobe iptable_mangle
modprobe ip_nat_ftp
modprobe ip_nat_h323
modprobe ipt_limit
modprobe ipt_tos
# limpar regras
echo "Limpando regras antigas..."
$ipt -F
$ipt -t nat -F
$ipt -t mangle -F
$ipt -X
$ipt -t nat -X
$ipt -t mangle -X
# ação padrão - dropar tudo
$ipt -P INPUT DROP
$ipt -P FORWARD DROP
$ipt -P OUTPUT ACCEPT
# aceitar pacotes de retorno
$ipt -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$ipt -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
# proteções
# anti-ip spoofing - desativar por causa do iproute2
if [ -e /proc/sys/net/ipv4/conf/all/rp_filter ]; then
for f in /proc/sys/net/ipv4/conf/*/rp_filter; do
echo 0 > $f
done
fi
$ipt -A INPUT -i $link1_iface -s 192.168.0.0/255.255.0.0 -j DROP
$ipt -A INPUT -i $link2_iface -s 192.168.0.0/255.255.0.0 -j DROP
$ipt -A INPUT -i $link1_iface -s 172.0.0.0/255.0.0.0 -j DROP
$ipt -A INPUT -i $link2_iface -s 172.0.0.0/255.0.0.0 -j DROP
$ipt -A INPUT -i $link1_iface -s 10.0.0.0/255.0.0.0 -j DROP
$ipt -A INPUT -i $link2_iface -s 10.0.0.0/255.0.0.0 -j DROP
# ativando repasse de pacotes
echo 1 > /proc/sys/net/ipv4/ip_dynaddr
echo 1 > /proc/sys/net/ipv4/ip_forward
# QoS
$ipt -I FORWARD -p tcp --tcp-flags SYN,RST SYN --dport 1863 -j TCPMSS --clamp-mss-to-pmtu
$ipt -I FORWARD -p tcp --tcp-flags SYN,RST SYN --dport 5190 -j TCPMSS --clamp-mss-to-pmtu
$ipt -I FORWARD -p tcp --tcp-flags SYN,RST SYN --dport 7001 -j TCPMSS --clamp-mss-to-pmtu
# liberar acesso interno
echo "Liberando acesso local..."
$ipt -A INPUT -i loopback -j ACCEPT
$ipt -A INPUT -s 127.0.0.1 -j ACCEPT
$ipt -A INPUT -s $link1_ip_local -j ACCEPT
$ipt -A INPUT -s $link2_ip_local -j ACCEPT
# serviços externos
echo "Liberando acesso aos serviços..."
# dns
$ipt -A INPUT -p tcp --dport 53 -j ACCEPT
$ipt -A INPUT -p udp --dport 53 -j ACCEPT
$ipt -A INPUT -p tcp --sport 53 -j ACCEPT
$ipt -A INPUT -p udp --sport 53 -j ACCEPT
# retorno proxy
$ipt -A INPUT -p tcp --dport 3128 --sport 80 -j ACCEPT
$ipt -A INPUT -p tcp --dport 3128 --sport 8080 -j ACCEPT
# serviços internos
# coloque aqui para permitir acesso aos seus serviços internos
$ipt -A INPUT -i $lan_iface -p tcp --dport 22 -j ACCEPT
$ipt -A INPUT -i $lan_iface -p tcp --dport 53 -j ACCEPT
$ipt -A INPUT -i $lan_iface -p udp --dport 53 -j ACCEPT
$ipt -A INPUT -i $lan_iface -p tcp --dport 80 -j ACCEPT
$ipt -A INPUT -i $lan_iface -p tcp --dport 3128 -j ACCEPT
### rotas
# resetar tabelas de rotas
echo "255 local" > /etc/iproute2/rt_tables
echo "254 main" >> /etc/iproute2/rt_tables
echo "253 default" >> /etc/iproute2/rt_tables
echo "0 unspec" >> /etc/iproute2/rt_tables
echo "30 link1" >> /etc/iproute2/rt_tables
echo "30 link2" >> /etc/iproute2/rt_tables
# remover rotas padrão - se houver
ip route del default &> /dev/null
ip route del default &> /dev/null
ip route del default &> /dev/null
# remover tabelas
ip rule del lookup link1 &> /dev/null
ip rule del lookup link1 &> /dev/null
ip rule del lookup link1 &> /dev/null
ip rule del lookup link2 &> /dev/null
ip rule del lookup link2 &> /dev/null
ip rule del lookup link2 &> /dev/null
# adicionar rotas nas tabelas
# tabela link1
# remover regras
# detalhe antes de cat é uma crase "`" e não uma aspas simples
for $ip in `cat /etc/ips.link1`
do
ip rule del from $ip &> /dev/null
done
ip rule del from $link1_ip_local &> /dev/null
# adicionar regras
# detalhe antes de cat é uma crase "`" e não uma aspas simples
for $ip in `cat /etc/ips.link1`
do
ip rule add from $ip table link1 prio 30 &> /dev/null
done
ip rule add from $link1_ip_local table link1 prio 30
# adicionar rotas
ip route add $link1_ip_local via $link1_gw dev $link1_iface table link1
ip route add default via $link1_gw table link1
# tabela link2
# remover regras
# detalhe antes de cat é uma crase "`" e não uma aspas simples
for $ip in `cat /etc/ips.link2`
do
ip rule del from $ip &> /dev/null
done
ip rule del from $link2_ip_local &> /dev/null
# adicionar regras
# detalhe antes de cat é uma crase "`" e não uma aspas simples
for $ip in `cat /etc/ips.link2`
do
ip rule add from $ip table link2 prio 30 &> /dev/null
done
ip rule add from $link2_ip_local table link2 prio 30
# adicionar rotas
ip route add $link2_ip_local via $link2_gw dev $link2_iface table link2
ip route add default via $link2_gw table link2
# aplicar mudanças no iproute
ip route flush cache
# liberando acesso clientes
echo -n "Liberando acesso para clientes..."
# clientes link1
for ip in `cat /etc/ips.link1`
do
# liberação de FORWARD
$ipt -A FORWARD -s $ip -j ACCEPT
# marcar pacotes para gráfico de consumo de banda
$ipt -t mangle -A PREROUTING -s $ip -j ACCEPT # down
$ipt -t mangle -A POSTROUTING -d $ip -j ACCEPT # up
# mascaramento - radio uol
$ipt -t nat -A PREROUTING -p tcp -s $ip -d 200.221.5.71 -j ACCEPT
$ipt -t nat -A PREROUTING -p tcp -s $ip -d 200.221.8.74 -j ACCEPT
$ipt -t nat -A PREROUTING -p tcp -s $ip -d 200.221.8.75 -j ACCEPT
$ipt -t nat -A PREROUTING -p tcp -s $ip -d 200.221.8.118 -j ACCEPT
# nat caixa econômica federal (conectividade)
$ipt -t nat -A PREROUTING -p tcp -s $ip -d 200.201.0.0/16 --dport 80 -j ACCEPT
# redirecionamento para o proxy
$ipt -t nat -A PREROUTING -p tcp -s $ip --dport 80 -j REDIRECT --to-port 3128
$ipt -t nat -A PREROUTING -p tcp -s $ip --dport 8080 -j REDIRECT --to-port 3128
$ipt -t nat -A POSTROUTING -s $ip -d 0/0 -j SNAT --to $link1_ip_local
echo -n "."
done
# clientes link2
for ip in `cat /etc/ips.link2`
do
# liberação de FORWARD
$ipt -A FORWARD -s $ip -j ACCEPT
# marcar pacotes para gráfico de consumo de banda
$ipt -t mangle -A PREROUTING -s $ip -j ACCEPT # down
$ipt -t mangle -A POSTROUTING -d $ip -j ACCEPT # up
# mascaramento - radio uol
$ipt -t nat -A PREROUTING -p tcp -s $ip -d 200.221.5.71 -j ACCEPT
$ipt -t nat -A PREROUTING -p tcp -s $ip -d 200.221.8.74 -j ACCEPT
$ipt -t nat -A PREROUTING -p tcp -s $ip -d 200.221.8.75 -j ACCEPT
$ipt -t nat -A PREROUTING -p tcp -s $ip -d 200.221.8.118 -j ACCEPT
# nat caixa econômica federal (conectividade)
$ipt -t nat -A PREROUTING -p tcp -s $ip -d 200.201.0.0/16 --dport 80 -j ACCEPT
# redirecionamento para o proxy
$ipt -t nat -A PREROUTING -p tcp -s $ip --dport 80 -j REDIRECT --to-port 3128
$ipt -t nat -A PREROUTING -p tcp -s $ip --dport 8080 -j REDIRECT --to-port 3128
$ipt -t nat -A POSTROUTING -s $ip -d 0/0 -j SNAT --to $link2_ip_local
echo -n "."
done
echo ""
echo "----------------------------------"
clear
echo "------------ FIREWALL ------------"
## iptables
ipt=iptables
## link1
link1_iface=eth0 # interface do seu link1
link1_rede=100.100.100.0/30 # aqui você coloca sua rede, com máscara
link1_gw=100.100.100.1 # o gateway do seu link1
link1_ip_local=100.100.100.2 # o ip do seu server do link1
## link2
link2_iface=eth1 # interface do seu link2
link2_rede=200.200.200.0/30 # aqui você coloca sua rede, com máscara
link2_gw=200.200.200.1 # o gateway do seu link2
link2_ip_local=200.200.200.2 # o ip do seu server do link2
## rede local
lan_iface=eth2
lan_rede=192.168.0.0/24 # aqui você coloca sua rede com máscara
lan_gw=192.168.0.254 # aqui coloca o gw da rede local
# carregar módulos
echo "Carregando módulos..."
modprobe ip_tables
modprobe iptable_nat
modprobe iptable_mangle
modprobe ip_nat_ftp
modprobe ip_nat_h323
modprobe ipt_limit
modprobe ipt_tos
# limpar regras
echo "Limpando regras antigas..."
$ipt -F
$ipt -t nat -F
$ipt -t mangle -F
$ipt -X
$ipt -t nat -X
$ipt -t mangle -X
# ação padrão - dropar tudo
$ipt -P INPUT DROP
$ipt -P FORWARD DROP
$ipt -P OUTPUT ACCEPT
# aceitar pacotes de retorno
$ipt -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$ipt -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
# proteções
# anti-ip spoofing - desativar por causa do iproute2
if [ -e /proc/sys/net/ipv4/conf/all/rp_filter ]; then
for f in /proc/sys/net/ipv4/conf/*/rp_filter; do
echo 0 > $f
done
fi
$ipt -A INPUT -i $link1_iface -s 192.168.0.0/255.255.0.0 -j DROP
$ipt -A INPUT -i $link2_iface -s 192.168.0.0/255.255.0.0 -j DROP
$ipt -A INPUT -i $link1_iface -s 172.0.0.0/255.0.0.0 -j DROP
$ipt -A INPUT -i $link2_iface -s 172.0.0.0/255.0.0.0 -j DROP
$ipt -A INPUT -i $link1_iface -s 10.0.0.0/255.0.0.0 -j DROP
$ipt -A INPUT -i $link2_iface -s 10.0.0.0/255.0.0.0 -j DROP
# ativando repasse de pacotes
echo 1 > /proc/sys/net/ipv4/ip_dynaddr
echo 1 > /proc/sys/net/ipv4/ip_forward
# QoS
$ipt -I FORWARD -p tcp --tcp-flags SYN,RST SYN --dport 1863 -j TCPMSS --clamp-mss-to-pmtu
$ipt -I FORWARD -p tcp --tcp-flags SYN,RST SYN --dport 5190 -j TCPMSS --clamp-mss-to-pmtu
$ipt -I FORWARD -p tcp --tcp-flags SYN,RST SYN --dport 7001 -j TCPMSS --clamp-mss-to-pmtu
# liberar acesso interno
echo "Liberando acesso local..."
$ipt -A INPUT -i loopback -j ACCEPT
$ipt -A INPUT -s 127.0.0.1 -j ACCEPT
$ipt -A INPUT -s $link1_ip_local -j ACCEPT
$ipt -A INPUT -s $link2_ip_local -j ACCEPT
# serviços externos
echo "Liberando acesso aos serviços..."
# dns
$ipt -A INPUT -p tcp --dport 53 -j ACCEPT
$ipt -A INPUT -p udp --dport 53 -j ACCEPT
$ipt -A INPUT -p tcp --sport 53 -j ACCEPT
$ipt -A INPUT -p udp --sport 53 -j ACCEPT
# retorno proxy
$ipt -A INPUT -p tcp --dport 3128 --sport 80 -j ACCEPT
$ipt -A INPUT -p tcp --dport 3128 --sport 8080 -j ACCEPT
# serviços internos
# coloque aqui para permitir acesso aos seus serviços internos
$ipt -A INPUT -i $lan_iface -p tcp --dport 22 -j ACCEPT
$ipt -A INPUT -i $lan_iface -p tcp --dport 53 -j ACCEPT
$ipt -A INPUT -i $lan_iface -p udp --dport 53 -j ACCEPT
$ipt -A INPUT -i $lan_iface -p tcp --dport 80 -j ACCEPT
$ipt -A INPUT -i $lan_iface -p tcp --dport 3128 -j ACCEPT
### rotas
# resetar tabelas de rotas
echo "255 local" > /etc/iproute2/rt_tables
echo "254 main" >> /etc/iproute2/rt_tables
echo "253 default" >> /etc/iproute2/rt_tables
echo "0 unspec" >> /etc/iproute2/rt_tables
echo "30 link1" >> /etc/iproute2/rt_tables
echo "30 link2" >> /etc/iproute2/rt_tables
# remover rotas padrão - se houver
ip route del default &> /dev/null
ip route del default &> /dev/null
ip route del default &> /dev/null
# remover tabelas
ip rule del lookup link1 &> /dev/null
ip rule del lookup link1 &> /dev/null
ip rule del lookup link1 &> /dev/null
ip rule del lookup link2 &> /dev/null
ip rule del lookup link2 &> /dev/null
ip rule del lookup link2 &> /dev/null
# adicionar rotas nas tabelas
# tabela link1
# remover regras
# detalhe antes de cat é uma crase "`" e não uma aspas simples
for $ip in `cat /etc/ips.link1`
do
ip rule del from $ip &> /dev/null
done
ip rule del from $link1_ip_local &> /dev/null
# adicionar regras
# detalhe antes de cat é uma crase "`" e não uma aspas simples
for $ip in `cat /etc/ips.link1`
do
ip rule add from $ip table link1 prio 30 &> /dev/null
done
ip rule add from $link1_ip_local table link1 prio 30
# adicionar rotas
ip route add $link1_ip_local via $link1_gw dev $link1_iface table link1
ip route add default via $link1_gw table link1
# tabela link2
# remover regras
# detalhe antes de cat é uma crase "`" e não uma aspas simples
for $ip in `cat /etc/ips.link2`
do
ip rule del from $ip &> /dev/null
done
ip rule del from $link2_ip_local &> /dev/null
# adicionar regras
# detalhe antes de cat é uma crase "`" e não uma aspas simples
for $ip in `cat /etc/ips.link2`
do
ip rule add from $ip table link2 prio 30 &> /dev/null
done
ip rule add from $link2_ip_local table link2 prio 30
# adicionar rotas
ip route add $link2_ip_local via $link2_gw dev $link2_iface table link2
ip route add default via $link2_gw table link2
# aplicar mudanças no iproute
ip route flush cache
# liberando acesso clientes
echo -n "Liberando acesso para clientes..."
# clientes link1
for ip in `cat /etc/ips.link1`
do
# liberação de FORWARD
$ipt -A FORWARD -s $ip -j ACCEPT
# marcar pacotes para gráfico de consumo de banda
$ipt -t mangle -A PREROUTING -s $ip -j ACCEPT # down
$ipt -t mangle -A POSTROUTING -d $ip -j ACCEPT # up
# mascaramento - radio uol
$ipt -t nat -A PREROUTING -p tcp -s $ip -d 200.221.5.71 -j ACCEPT
$ipt -t nat -A PREROUTING -p tcp -s $ip -d 200.221.8.74 -j ACCEPT
$ipt -t nat -A PREROUTING -p tcp -s $ip -d 200.221.8.75 -j ACCEPT
$ipt -t nat -A PREROUTING -p tcp -s $ip -d 200.221.8.118 -j ACCEPT
# nat caixa econômica federal (conectividade)
$ipt -t nat -A PREROUTING -p tcp -s $ip -d 200.201.0.0/16 --dport 80 -j ACCEPT
# redirecionamento para o proxy
$ipt -t nat -A PREROUTING -p tcp -s $ip --dport 80 -j REDIRECT --to-port 3128
$ipt -t nat -A PREROUTING -p tcp -s $ip --dport 8080 -j REDIRECT --to-port 3128
$ipt -t nat -A POSTROUTING -s $ip -d 0/0 -j SNAT --to $link1_ip_local
echo -n "."
done
# clientes link2
for ip in `cat /etc/ips.link2`
do
# liberação de FORWARD
$ipt -A FORWARD -s $ip -j ACCEPT
# marcar pacotes para gráfico de consumo de banda
$ipt -t mangle -A PREROUTING -s $ip -j ACCEPT # down
$ipt -t mangle -A POSTROUTING -d $ip -j ACCEPT # up
# mascaramento - radio uol
$ipt -t nat -A PREROUTING -p tcp -s $ip -d 200.221.5.71 -j ACCEPT
$ipt -t nat -A PREROUTING -p tcp -s $ip -d 200.221.8.74 -j ACCEPT
$ipt -t nat -A PREROUTING -p tcp -s $ip -d 200.221.8.75 -j ACCEPT
$ipt -t nat -A PREROUTING -p tcp -s $ip -d 200.221.8.118 -j ACCEPT
# nat caixa econômica federal (conectividade)
$ipt -t nat -A PREROUTING -p tcp -s $ip -d 200.201.0.0/16 --dport 80 -j ACCEPT
# redirecionamento para o proxy
$ipt -t nat -A PREROUTING -p tcp -s $ip --dport 80 -j REDIRECT --to-port 3128
$ipt -t nat -A PREROUTING -p tcp -s $ip --dport 8080 -j REDIRECT --to-port 3128
$ipt -t nat -A POSTROUTING -s $ip -d 0/0 -j SNAT --to $link2_ip_local
echo -n "."
done
echo ""
echo "----------------------------------"
Script pronto, agora temos que torná-lo executável:
# chmod +x /etc/fw
Vamos colocar ele no patch pra poder executar apenas digitando "fw" no prompt.
# ln -s /etc/fw /sbin/fw
Pronto. Agora basta testar e correr para o abraço.
Obs: No SQUID basta adicionar o que está no item 6 e pronto.
Espero que tenha ajudado alguém!
:)