Buckminster
(usa Debian)
Enviado em 06/06/2017 - 10:46h
Vamos criar rotas, faça o seguinte, mas antes leia tudo:
# apt-get update
# aptitude safe-upgrade (se pedir, digite yes e aguarde terminar)
# apt-get install iproute2
Edite o arquivo /etc/iproute2/rt_tables. Crie as tabelas na seguinte posição ou no final mesmo:
# local
20 link_A
21 link_B
#
Pode ser qualquer nome e qualquer número no começo, escolhi aleatoriamente.
Crie no script do Iptables regras de encaminhamento via comando "ip" para as tabelas.
ip rule add fwmark 2 table 20 prio 20
ip rule add fwmark 3 table 21 prio 20
Ou seja, todo pacote que estiver marcado com 2, deve ser direcionado para a tabela 20, no caso "link_A" e 3 para tabela 21 no link_B.
Adicione regras de roteamento para essas tabelas:
ip route add default via IP_A dev sem_fio_A table 20 # IP_A é o IP do gateway do link A
ip route add default via IP_B dev sem_fio_B table 21 # IP_B é o IP do gateway do link B
Isso diz para que todo pacote direcionado à tabela 20, saia pelo gateway IP_A na interface sem_fio_A, mesma coisa a outra regra, mas com a devida configuração.
Marcando os pacotes:
iptables -t mangle -A PREROUTING -i eth1 -p tcp -j MARK --set-mark 2
iptables -t mangle -A PREROUTING -i eth0 -p tcp -j MARK --set-mark 3
iptables -t mangle -A OUTPUT -o eth1 -p tcp -j MARK --set-mark 2
iptables -t mangle -A OUTPUT -o eth0 -p tcp j MARK --set-mark 3
#
Isso diz que tudo que entrar pela interface eth1 na chain PREROUTING terá a marca 2 e eth0 a marca 3 e sair pela chain OUTPUT a mesma marcação.
Finaliza:
ip route flush cache <<< limpando as tabelas
Ficará assim o script:
#! /bin/sh
### BEGIN INIT INFO
# Provides: nome_do_arquivo_sem_sh_no_final
# Short-Description: executa o arquivo do Iptables
### END INIT INFO
#
#Desabilitando o tráfego entre as placas
#################################
echo 0 > /proc/sys/net/ipv4/ip_forward
#
##Apagando e restaurando as chains e tabelas
######################################
iptables -F # Remove as regras de todas as chains
iptables -Z # Zera as regras de todas as chains
iptables -X # Apaga todas as chains
# iptables -t nat -Z
# iptables -t nat -F
# iptables -t nat -X
# iptables -t mangle -Z
# iptables -t mangle -F
# iptables -t mangle -X
#
##Proteção contra ping, SYN Cookies, IP Spoofing e proteções do kernel
##########################################################
echo 1 > /proc/sys/net/ipv4/tcp_syncookies # Syn Flood (DoS)
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts # Port scanners
echo 0 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses # Sem resposta remota
for i in /proc/sys/net/ipv4/conf/*; do
echo 0 > $i/accept_redirects # Sem redirecionar rotas
echo 0 > $i/accept_source_route # Sem traceroute
echo 1 > $i/log_martians # Loga pacotes suspeitos no kernel
echo 1 > $i/rp_filter # Ip Spoofing
echo 1 > $i/secure_redirects; done # Redirecionamento seguro de pacotes
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all # Sem ping e tracert
#
# Carregando os módulos - Não é necessário todos os módulos,
# somente aqueles que você irá utilizar.
# O iptables, por padrão, carrega os módulos principais automaticamente.
# Para identificar qual módulo adicional carregar, você deve elaborar todo o script
# e depois de acordo com o nome do alvo utilizado, você carrega o mesmo módulo.
# Por exemplo, se você utilizar a seguinte regra:
# iptables -A FORWARD -p udp -m multiport --dport 80,1024:65535 -j DROP
# o módulo "ipt_multiport" deve ser carregado.
# Abaixo estão quase todos os módulos.
################################
modprobe ip_tables
modprobe iptable_nat
modprobe iptable_filter
modprobe iptable_mangle
#
# modprobe ip_conntrack
# modprobe ip_conntrack_ftp
# modprobe ip_conntrack_irc
# modprobe ip_nat_ftp
# modprobe ip_queue
# modprobe ip_gre
#
# modprobe ipt_LOG
modprobe ipt_MARK <<< descomente
# modprobe ipt_REDIRECT
# modprobe ipt_REJECT
modprobe ipt_MASQUERADE <<< descomente
# modprobe ipt_TCPMSS
# modprobe ipt_TOS
#modprobe ipt_NETMAP
#
# modprobe ipt_limit
# modprobe ipt_mac
# modprobe ipt_multiport
# modprobe ipt_owner
# modprobe ipt_state
# modprobe ipt_tos
modprobe ipt_mark <<< descomente
# modprobe ipt_tcpmss
# modprobe ipt_string
# modprobe ipt_statistic
#
# modprobe nf_nat_pptp
# modprobe nf_nat_proto_gre
# modprobe nf_nat_irc
#
# Definindo políticas padrões
######################
#iptables -P INPUT DROP # iptables a política padrão da chain INPUT é proibir tudo
#iptables -P FORWARD DROP
#iptables -P OUTPUT ACCEPT
#
# Liberando a Loopback
####################
iptables -A INPUT -i lo -j ACCEPT
#
## Regras de segurança na internet e acessos
#####################################
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m state --state NEW ! -i sem_fio_A -j DROP
iptables -A FORWARD -m state --state NEW ! -i sem_fio_A -j DROP
iptables -A INPUT -m state --state NEW ! -i sem_fio_B -j DROP
iptables -A FORWARD -m state --state NEW ! -i sem_fio_B -j DROP
iptables -A INPUT -m state --state INVALID -j DROP
iptables -A FORWARD -m state --state INVALID -j DROP
#
# Redirecionamento para o Squid e mascaramento/compartilhamento
###########################################
# iptables -t nat -A PREROUTING -i ethx -p tcp --dport 80 -j REDIRECT --to-port 3128
#
iptables -A FORWARD -i sem_fio_A -o eth1 -j ACCEPT # adicione essa regra
iptables -A FORWARD -i sem_fio_B -o eth0 -j ACCEPT # adicione essa regra
#
iptables -t nat -A POSTROUTING -o sem_fio_A -j MASQUERADE # sem_fio_A é a placa de rede A
iptables -t nat -A POSTROUTING -o sem_fio_B -j MASQUERADE # sem_fio_B é a placa de rede B
#
ip rule add fwmark 2 table 20 prio 20
ip rule add fwmark 3 table 21 prio 20
#
ip route add default via IP_A dev sem_fio_A table 20 # IP_A é o IP do gateway do link A
ip route add default via IP_B dev sem_fio_B table 21 # IP_B é o IP do gateway do link B
#
iptables -t mangle -A PREROUTING -i eth1 -p tcp -j MARK --set-mark 2
iptables -t mangle -A PREROUTING -i eth0 -p tcp -j MARK --set-mark 3
iptables -t mangle -A OUTPUT -o eth1 -p tcp -j MARK --set-mark 2
iptables -t mangle -A OUTPUT -o eth0 -p tcp j MARK --set-mark 3
#
ip route flush cache # limpando as tabelas
#
# A partir daqui você pode inserir as regras de liberação e bloqueio.
#
# Finalizando:
# Habilitando o tráfego entre as placas
##########################
echo 1 > /proc/sys/net/ipv4/ip_forward
#
Deixei comentadas as regras das políticas padrões ficando elas todas como ACCEPT. Depois de testar se tudo está vindo e entrando corretamente em cada placa de rede tu descomenta as políticas e testa de novo.
A diferença entre o PREROUTING e o OUTPUT é que PREROUTING abrange os pacotes que foram originados fora do Firewall e OUTPUT são os pacotes originados no Firewall.
Basicamente é isso, caso não der certo, verifique as mensagens do Iptables e olhe os logs.
Depois de testar com as regras acima, teste substituindo as regras
iptables -t mangle -A PREROUTING -i eth1 -p tcp -j MARK --set-mark 2
iptables -t mangle -A PREROUTING -i eth0 -p tcp -j MARK --set-mark 3
iptables -t mangle -A OUTPUT -o eth1 -p tcp -j MARK --set-mark 2
iptables -t mangle -A OUTPUT -o eth0 -p tcp j MARK --set-mark 3
por
ip rule add from 192.168.10.0/24 table 20
ip rule add from 192.168.11.0/24 table 21
As duas regras acima fazem o roteamento pela origem não sendo necessária a marcação de pacotes.
Teste qual configuração funciona melhor para você.
Dúvidas, continue postando aqui.