
Abstrato:
Tenho (presumo roteamento) problemas ao adicionar um ISP secundário à minha configuração de rede existente: o tráfego de entrada Router1
não é respondido, mas o tráfego local e de entrada Router0
estão funcionando bem.
Como posso manter as partes que atualmente funcionam bem funcionando, enquanto faço o tráfego de entrada Router1
funcionar?
Elaboração:
Esbocei um diagrama abaixo com o essencial da situação (na prática, há mais dispositivos em cada LAN, mas isso não importa).
Esta é a situação:
- Tenho duas redes internas:
LAN0
is192.168.x.0/24
eLAN1
is192.168.y.0/24
. Ambos funcionam bem para tráfego interno (por exemplohttpusandoondulação). LAN0
sempre esteve conectado atravésRouter0
eISP0
com oInternet
.LAN1
sempre teveRouter1
, mas agora está conectadoISP1
aoInternet
.- Máquinas apenas ligadas
LAN0
e com uma rota padrãoRouter0
funcionam bem para tráfego de entrada e saída. - Máquinas apenas ligadas
LAN1
e com uma rota padrãoRouter1
funcionam bem para tráfego de entrada e saída. - O tráfego interno está ativo
LAN0
eLAN1
sempre funcionou bem. - O tráfego de entrada
Router1
chegaWindowsB
corretamente: posso me conectar a ele por RDP deWindowsC
. - Tráfego de entrada
Router1
paraLinuxB
chegadas (de acordo comtcpdump), mas não respondeu como umacurl http://e.f.g.h
frenteLinuxC
mostra com umtcpdump ativadoLinuxB
mostra:
Mostra apenas pacotes que - de acordo com oformato de saída tcpdump- tenha umSINconjunto de bandeiras:
LinuxB:/tmp/LinuxB.eth1.80 # tcpdump -i eth1 'port 80'
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes
13:35:19.489779 IP i.j.k.l.57512 > 192.168.y.2.http: Flags [S], seq 816356596, win 65535, options [mss 1460,nop,wscale 4,nop,nop,TS val 1287047182 ecr 0,sackOK,eol], length 0
13:35:19.788841 IP i.j.k.l.57512 > 192.168.y.2.http: Flags [S], seq 816356596, win 65535, options [mss 1460,nop,wscale 4,nop,nop,TS val 1287047478 ecr 0,sackOK,eol], length 0
13:35:19.888835 IP i.j.k.l.57512 > 192.168.y.2.http: Flags [S], seq 816356596, win 65535, options [mss 1460,nop,wscale 4,nop,nop,TS val 1287047578 ecr 0,sackOK,eol], length 0
13:35:19.989412 IP i.j.k.l.57512 > 192.168.y.2.http: Flags [S], seq 816356596, win 65535, options [mss 1460,nop,wscale 4,nop,nop,TS val 1287047678 ecr 0,sackOK,eol], length 0
13:35:20.089685 IP i.j.k.l.57512 > 192.168.y.2.http: Flags [S], seq 816356596, win 65535, options [mss 1460,nop,wscale 4,nop,nop,TS val 1287047778 ecr 0,sackOK,eol], length 0
13:35:20.190836 IP i.j.k.l.57512 > 192.168.y.2.http: Flags [S], seq 816356596, win 65535, options [mss 1460,nop,wscale 4,nop,nop,TS val 1287047877 ecr 0,sackOK,eol], length 0
13:35:20.392123 IP i.j.k.l.57512 > 192.168.y.2.http: Flags [S], seq 816356596, win 65535, options [mss 1460,nop,wscale 4,nop,nop,TS val 1287048072 ecr 0,sackOK,eol], length 0
13:35:20.693692 IP i.j.k.l.57512 > 192.168.y.2.http: Flags [S], seq 816356596, win 65535, options [mss 1460,sackOK,eol], length 0
13:35:21.197162 IP i.j.k.l.57512 > 192.168.y.2.http: Flags [S], seq 816356596, win 65535, options [mss 1460,sackOK,eol], length 0
13:35:22.204134 IP i.j.k.l.57512 > 192.168.y.2.http: Flags [S], seq 816356596, win 65535, options [mss 1460,sackOK,eol], length 0
13:35:24.115961 IP i.j.k.l.57512 > 192.168.y.2.http: Flags [S], seq 816356596, win 65535, options [mss 1460,sackOK,eol], length 0
13:35:27.852374 IP i.j.k.l.57512 > 192.168.y.2.http: Flags [S], seq 816356596, win 65535, options [mss 1460,sackOK,eol], length 0
13:35:31.967049 IP i.j.k.l.57512 > 192.168.y.2.http: Flags [S], seq 816356596, win 65535, options [mss 1460,sackOK,eol], length 0
Esta é a LinuxB
tabela de rotas:
LinuxB:/tmp/LinuxB.eth1.80 # route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default 192.168.x.1 0.0.0.0 UG 0 0 0 eth0
loopback * 255.0.0.0 U 0 0 0 lo
link-local * 255.255.0.0 U 0 0 0 eth0
192.168.x.0 * 255.255.255.0 U 0 0 0 eth0
192.168.x.0 * 255.255.255.0 U 0 0 0 eth1
Como a conexão via RDP de WindowsC
para WindowsB
funciona bem, repito que este é realmente um problema de roteamento. Esta é a WindowsB
tabela de rotas:
C:\temp>route print
===========================================================================
Interface List
0x1 ........................... MS TCP Loopback interface
0x2 ...00 0c 29 35 77 e1 ...... AMD PCNET Family PCI Ethernet Adapter - Packet Scheduler Miniport
0x3 ...00 0c 29 35 77 eb ...... VMware Accelerated AMD PCNet Adapter - Packet Scheduler Miniport
===========================================================================
===========================================================================
Active Routes:
Network Destination Netmask Gateway Interface Metric
0.0.0.0 0.0.0.0 192.168.x.1 192.168.x.4 10
0.0.0.0 0.0.0.0 192.168.y.1 192.168.y.4 5
127.0.0.0 255.0.0.0 127.0.0.1 127.0.0.1 1
192.168.x.0 255.255.255.0 192.168.x.4 192.168.x.4 10
192.168.x.4 255.255.255.255 127.0.0.1 127.0.0.1 10
192.168.x.255 255.255.255.255 192.168.x.4 192.168.x.4 10
192.168.y.0 255.255.255.0 192.168.y.4 192.168.y.4 10
192.168.y.4 255.255.255.255 127.0.0.1 127.0.0.1 10
192.168.y.255 255.255.255.255 192.168.y.4 192.168.y.4 10
224.0.0.0 240.0.0.0 192.168.x.4 192.168.x.4 10
224.0.0.0 240.0.0.0 192.168.y.4 192.168.y.4 10
255.255.255.255 255.255.255.255 192.168.x.4 192.168.x.4 1
255.255.255.255 255.255.255.255 192.168.y.4 192.168.y.4 1
Default Gateway: 192.168.y.1
===========================================================================
Persistent Routes:
Network Address Netmask Gateway Address Metric
0.0.0.0 0.0.0.0 192.168.y.1 5
0.0.0.0 0.0.0.0 192.168.x.1 10
Então, como posso fazer com que o roteamento LinuxB
seja assim:
- mantenha a rota padrão ativada
LinuxB
para192.168.x.1
que o tráfego de saída continue usandoRouter0
/ISP0
- continue respondendo às solicitações recebidas
LAN0
deLAN0
- continue respondendo às solicitações recebidas
LAN1
deLAN1
- continue respondendo às solicitações recebidas através de
Router0
(a.b.c.d
/192.168.x.1
) via192.168.x.1
- comece a responder solicitações recebidas através de
Router1
(e.f.g.h
/192.168.y.1
) via192.168.y.1
- bônus: tenha
Router1
failover ou balanceamento de carga comRouter0
Pós-escrito:
OImagem PNG abaixoé gerado emUMLtexto através do online grátisPlanta UMLmotor. Se você quiser ver o texto UML original, cole oLink da imagem PNGnissoFormulário PlantUML, então aperte Submit
.
Responder1
Eu tinha um script de shell para fazer algo assim há muito tempo, mas, desculpe, consegui encontrá-lo. Portanto, só posso fornecer dicas sobre as soluções que implementei naquela época. Estou escrevendo principalmente de memória, então faltam alguns exemplos:
Eu tinha uma tabela de roteamento por uplink (ip route... table 101, ip route... table 102). Isso vai para /etc/iproute2/rt_tables.
101 isp1 102 isp2
Você também precisa configurar essas tabelas:
rota ip adicionar padrão via $Gateway1 dev $Interface1 tabela isp1 ip rota adicionar padrão via $Gateway2 dev $Interface2 tabela isp2
#Não se esqueça da tabela padrão:
rota ip adicionar padrão via $DefaultGateway dev $DefaultInterface
Habilitar rastreamento de conexão iptables (modprobe nf_conntrack)
- Defina uma regra iptables para NOVAS conexões de entrada para -j MARCAR os pacotes de alguma forma (ou seja: 0x201, 0x202)
Defina uma regra de IP que garanta que o tráfego que sai através de uma interface use a tabela de roteamento correta
adição de regra de ip da tabela $Ip1 isp1 adição de regra de ip da tabela isp2 de $Ip2
Defina uma regra ip (ip rule add ...) informando que "pacotes marcados como 0x201 devem consultar a tabela de roteamento 201", uma regra para cada uplink.
Com tudo pronto, você poderá receber e iniciar conexões com qualquer uplink wan e até mesmo equilibrar conexões de saída.
Esses seriam o básico. Iptables + "ip route" + "ip rule" e pronto.