Originalmente postado no Unix e no Linux, mas ninguém conseguiu responder, então estou migrando a pergunta aqui:
Minha pergunta é sobre Roteamento de Política Baseada em Origem no CentOS 5 com 2 WANs mais uma porta LAN (NAT) com Balanceamento de Carga, mas antes de qualquer coisa algumas observações antes de começar a descrever o problema ...
Eu sei que este tópico foi trazido muitas vezes aqui na troca de pilha e parece que as 5 principais respostas estão (ordenadas do mais ao mínimo):
- Desativar rp_filter
- Roteamento de políticas com base no Mark / Connmark
- Roteamento de políticas com base em IP (adicionar mais IPs)
- Instalar pfSense, Shorewall, Ubuntu ?, Etc ...
- Compre um roteador caro da Cisco / 3com / Juniper / Etc ...
Na maioria das vezes, algumas dessas respostas estão corretas, mas para mim as soluções 1 & 2 não tem treino (não descarto pelo menos o ponto 2 porque posso ter alguns problemas com minha configuração), o ponto 3 é basicamente isolar um problema em vez de resolvê-lo (também adiciona complexidade às tabelas de roteamento) e soluções 4 & ; 5 estão fora do escopo, pois não tenho recursos para comprar hardware especializado nem posso colocar offline o servidor, pois ele está em produção, portanto, resumir a substituição do servidor CentOS por algo "melhor" está fora da tabela.
Ok, agora, de volta ao problema, vamos primeiro descrever a configuração atual ...
Interfaces :
eth1: IP: 10.0.0.1, GW: 10.0.0.1, NM: 255.255.255.0 (LAN)
eth0: IP: 10.0.1.1, GW: 10.0.1.254, NM: 255.255.255.0 (ISP1 - ADSL Router)
eth2: IP: 10.0.2.1, GW: 10.0.2.254, NM: 255.255.255.0 (ISP2 - ADSL Router)
/etc/sysctl.conf :
# Controls IP packet forwarding
net.ipv4.ip_forward = 1
# Controls source route verification
net.ipv4.conf.default.rp_filter = 0
# Do not accept source routing
net.ipv4.conf.default.accept_source_route = 0
# Controls the use of TCP syncookies
net.ipv4.tcp_syncookies = 1
# Ignoring broadcasts request
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_ignore_bogus_error_messages = 1
/ etc / iproute2 / rt_tables:
#
# reserved values
#
255 local
254 main
253 default
0 unspec
#
# local
#
#1 inr.ruhep
2 ISP1
3 ISP2
/ etc / sysconfig / scripts de rede / route-eth0 :
10.0.1.0/24 dev eth0 src 10.0.1.1 table ISP1
default via 10.0.1.254 dev eth0 table ISP1
/ etc / sysconfig / scripts de rede / route-eth2 :
10.0.2.0/24 dev eth2 src 10.0.2.1 table ISP2
default via 10.0.2.254 dev eth2 table ISP2
/ etc / sysconfig / scripts de rede / rule-eth0 :
fwmark 2 table ISP1
from 10.0.1.1 table ISP1
/ etc / sysconfig / scripts de rede / rule-eth2 :
fwmark 3 table ISP2
from 10.0.2.1 table ISP2
/ etc / sysconfig / iptables :
*filter
:INPUT DROP [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
# Basic Rules
-A INPUT -i lo -j ACCEPT
-A INPUT -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i eth2 -m state --state RELATED,ESTABLISHED -j ACCEPT
# SSH
-A INPUT -i eth0 -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -i eth2 -m tcp -p tcp --dport 22 -j ACCEPT
# OpenVPN
-A INPUT -i eth0 -m udp -p udp --dport 1194 -j ACCEPT
-A INPUT -i eth2 -m udp -p udp --dport 1194 -j ACCEPT
# Allow everything from LAN
-A INPUT -i eth1 -j ACCEPT
# Allow everything from the VPN
-A INPUT -i tun0 -j ACCEPT
# Default Drop on everything else
-A INPUT -j DROP
# Allow forwarding from LAN and VPN
-A FORWARD -i eth1 -j ACCEPT
-A FORWARD -i tun0 -j ACCEPT
# Allow all outbound traffic
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -o eth1 -j ACCEPT
COMMIT
*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
# DNAT to Developer Box (SSH Server)
-A PREROUTING -i eth0 -p tcp -m tcp --dport 2222 -j DNAT --to-destination 10.0.0.200:2222
-A PREROUTING -i eth2 -p tcp -m tcp --dport 2222 -j DNAT --to-destination 10.0.0.200:2222
# SNAT
-A POSTROUTING -o eth0 -j SNAT --to-source 10.0.1.1
-A POSTROUTING -o eth2 -j SNAT --to-source 10.0.2.1
COMMIT
*mangle
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
# Mark Based Routing? (based on NerdBoys site)
-A PREROUTING -j CONNMARK --restore-mark
-A PREROUTING --match mark --mark 2 -j ACCEPT
-A PREROUTING -i eth0 -j MARK --set-mark 2
-A PREROUTING --match mark --mark 3 -j ACCEPT
-A PREROUTING -i eth2 -j MARK --set-mark 3
-A PREROUTING -j CONNMARK --save-mark
COMMIT
O Balanceamento de Carga está sendo possível com o script bash de gwping, que basicamente monitora as duas wans (eth0 e eth2) e configura as rotas e pesos padrão no servidor como este (enquanto no balanceamento de carga ou os 2 wans ativos e em execução) :
ip route replace default scope global nexthop via 10.0.1.1 dev eth0 weight 1 nexthop via 10.0.2.1 dev eth1 weight 1
O problema que tenho é que mesmo com essa configuração que muitas pessoas parecem concordar ser a correta, eu ainda tenho problemas em acessar serviços dentro da rede do lado de fora (especificamente a caixa do desenvolvedor ssh e a do OpenVPN) mesmo que os pacotes estão sendo "marcados" e roteados de acordo, a resposta da caixa dev vai sempre para o caminho errado.
Eu não sei se estou perdendo algo na área do mangle ou nat ou estou entendendo mal o roteamento baseado na fonte, de qualquer forma, se alguém souber como fazer esse trabalho de acordo, será gentilmente apreciado.
Minhas fontes para essa configuração são:
lartc.org/lartc.html#LARTC.RPDB.MULTIPLE-LINKS
fatalsite.net/?p=90
nerdboys.com/2006/05/05/conning-the-mark-multiwan-connections-using-iptables-mark-connmark-and-iproute2/
policyrouting.org/PolicyRoutingBook/ONLINE/CH08.web.html
unix.stackexchange.com/questions/58635/iptables-set-mark-route-diferent-ports-through-different-interfaces
unix.stackexchange.com/questions/22770/two-interfaces-two-addresses-two-gateways
bulma.net/body.phtml?nIdNoticia=2145
Com os melhores cumprimentos
PS1: Encontrei um site dizendo que as marcas na tabela de roteamento devem ser + 1 diferentes das marcas do iptables (kim.attr.ee/2010/08/source-based-policy-routing-on-centos .html) isso é verdade? ou este site está super-incorreto.
Atualização 15/08/2013 22:15
Depois de pesquisar e depurar mais, encontrei um site que diz que esqueci de adicionar a parte SNAT na tabela de pós-roteamento, então adiciono essas regras à configuração do iptables:
-A POSTROUTING --match mark --mark 2 -j SNAT --to-source 10.0.1.1
-A POSTROUTING --match mark --mark 3 -j SNAT --to-source 10.0.2.1
Mas ainda não consigo me conectar ao devbox do lado de fora da rede.
Do lado bom, um iptables -t nat -nvL POSTROUTING dá uma dica sobre o funcionamento do roteamento de política baseado em connmark, então talvez seja algo relacionado à borda do roteador ISP1 e ISP2:
Chain POSTROUTING (policy ACCEPT 520 packets, 56738 bytes)
pkts bytes target prot opt in out source destination
0 0 SNAT all -- * * 0.0.0.0/0 0.0.0.0/0 MARK match 0x2 to:10.0.1.1
6 312 SNAT all -- * * 0.0.0.0/0 0.0.0.0/0 MARK match 0x3 to:10.0.2.1
903 70490 SNAT all -- * eth0 0.0.0.0/0 0.0.0.0/0 to:10.0.1.1
931 78070 SNAT all -- * eth2 0.0.0.0/0 0.0.0.0/0 to:10.0.2.1
Além disso, adiciono mais informações da minha configuração, por favor, alguém me dê um salva-vidas desde que comecei a ficar sem idéias ... <
ip route show :
10.8.0.2 dev tun0 proto kernel scope link src 10.8.0.1
10.0.2.0/24 dev eth2 proto kernel scope link src 10.0.2.1
10.0.0.0/24 dev eth1 proto kernel scope link src 10.0.0.1
10.8.0.0/24 via 10.8.0.2 dev tun0
10.0.1.0/24 dev eth0 proto kernel scope link src 10.0.1.1
169.254.0.0/16 dev eth2 scope link
default
nexthop via 10.0.1.254 dev eth0 weight 1
nexthop via 10.0.2.254 dev eth2 weight 1
show de regra de ip:
0: from all lookup 255
1024: from all fwmark 0x2 lookup ISP1
1025: from all fwmark 0x3 lookup ISP2
2024: from 10.0.1.1 lookup ISP1
2025: from 10.0.2.1 lookup ISP2
32766: from all lookup main
32767: from all lookup default
Novas fontes:
sarcasmasaservice.com/2013/04/linux-routing-capabilities-my-abuse-thereof/
Com os melhores cumprimentos