route add default gw 192.168.10.1 on each of the clients
e
EDITAR:
iptables -t mangle -A PREROUTING -s 192.168.10.100/32 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -s 192.168.10.101/32 -j MARK --set-mark 2
Veja também:
Eu tenho um Raspberry Pi (rodando Raspbian) com três interfaces de rede (uma ethernet e duas USB wifi nics). O que eu quero alcançar é este: eu tenho duas conexões WAN à internet (DSL + Cable), e eu quero configurar o RasPi de tal forma que ele ofereça dois gateways padrão. Eu quero fazer clientes específicos em minha rede local usar um ou outro gateway. Aqui está uma visão geral do que eu quero alcançar:
Normalmente,vocênãopodeterdoisgatewayspadrãoporrazõesóbvias,masdescobriquecomoiproute2vocêpodefazerexatamenteissoeusarváriastabelasderoteamento(e,portanto,gatewayspadrão)quesãoaplicadasporregras.(Vejadetalhesdaminhaconfiguraçãoabaixo)
Ainterfaceethernet(192.168.10.1)estáconectadaaumswitchqueconectaminharedelocal(192.168.10.0/24).
Interfacewlan0(192.168.178.199)estáconectadaaoprimeiroroteadorWLAN(DSL)(192.168.178.1).Ainterfacewlan1(192.168.0.199)estáconectadaaosegundoroteador(Cabo)(192.168.0.1).
Aquiestáomeu/etc/network/interfaces
autoloifaceloinetloopbackifaceeth0inetstaticaddress192.168.10.1netmask255.255.255.0ifacewlan0inetstaticaddress192.168.178.199netmask255.255.255.0wpa-ssid"ALICE"
wpa-psk "yyyyyyyy"
iface wlan1 inet static
address 192.168.0.199
netmask 255.255.255.0
wpa-ssid "BOB"
wpa-psk "xxxxxxxx"
Por alguma razão, configurar auto
para as duas interfaces wlan não funcionou tão bem, na maioria das vezes pelo menos um deles não seria "elevado", então eu coloquei o ifup para eles em rc.local para agora. Quando inicializo, as duas interfaces wlan estão ativadas, conectadas às suas wlans e ambas podem executar ping nos roteadores (por exemplo, ping 192.168.178.1 -I wlan0
).
O próximo passo foi configurar o iproute2. Aqui está o meu /etc/iproute2/rt_tables
#
# reserved values
#
255 local
254 main
253 default
0 unspec
#
# local
#
#1 inr.ruhep
1 alice
2 bob
Depois de definir essas duas tabelas, criei estas configurações de ip
que são aplicadas em cada inicialização depois que todas as NICs estiverem ativas:
ip route add 192.168.178.0/24 dev wlan0 src 192.168.178.199 table alice
ip route add default via 192.168.178.1 table alice
ip route add 192.168.0.0/24 dev wlan1 src 192.168.0.199 table bob
ip route add default via 192.168.0.1 table bob
ip rule add from 192.168.178.199 table alice
ip rule add from 192.168.0.199 table bob
ip route add default scope global nexthop via 192.168.178.1 dev wlan0 weight 1 nexthop via 192.168.0.1 dev wlan1 weight 1
Para fins de teste, configurei o servidor de nomes do Google (8.8.8.8) como padrão por enquanto em /etc/resolv.conf
.
Neste momento, eu posso pingar com sucesso hosts na Internet a partir do RasPi, os pedidos recebidos estão sendo enviados uniformemente espalhados através de um ou outro gateway (eu verifiquei isso com ping -R 8.8.8.8
).
Agora minha (s) pergunta (s):
O que tenho que fazer para tornar os clientes (com um ip estático, sem necessidade de DHCP) na minha rede local 192.168.10.0/24 use o RasPi como padrão gw (192.168.10.1 - a interface eth0) para acessar a internet? Eu acho que isso é feito com masquerading e iptables, mas eu não tenho idéia de como fazer isso com esta configuração.
Como eu teria que alterar as regras de ip
para não apenas permitir que os clientes se conectassem à internet da mesma forma que o próprio RasPi, mas ao invés disso, usar um ou outro gateway? Por exemplo, se eu gostaria de fazer o host 192.168.10.100 usar o gateway "ALICE" e 192.168.10.101 usar "BOB"?
Eu me sinto muito perto da linha de chegada, qualquer ajuda sobre esta questão provavelmente não tão comum é muito apreciada. Obrigado antecipadamente!
Atenciosamente, Rob
Atualização:
Eu fiz um pequeno progresso: depois de adicionar essas regras ...
ip rule add fwmark 1 table alice prio 1024
ip rule add fwmark 2 table bob prio 1025
... Eu sou capaz (de 192.168.10.100) de ping não apenas a interface de ethernet RasPi em 192.168.10.1, mas também a interface wlan em 192.168.178.199. Eu não posso pingar o roteador por trás dessa interface (192.168.178.1) ou quaisquer hosts na internet ainda. Mas acho que estamos nos aproximando ... Então os pacotes chegam na interface wlan certa, mas agora os wlan nics precisam encaminhá-los. Como isso é feito?
se você tiver apenas um único ip público em cada WAN, poderá ter que fazer PAT (tradução de endereço de porta) em vez de NAT (tradução de endereço de rede)
algo como:
iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
iptables -t nat -A POSTROUTING -o wlan1 -j MASQUERADE
EDIT: estou supondo que você está substituindo seus IPANs wan com IPs privados ...
Digamos que você queira rotear o host 192.168.10.252 via wlan0:
iptables -t mangle -N MARK1
iptables -t mangle -A MARK1 -j MARK --set-xmark 0x1/0xffffffff
iptables -t mangle -A MARK1 -j CONNMARK --set-xmark 0x1/0xffffffff
iptables -t mangle -A MARK1 -j ACCEPT
# local traffic
iptables -t mangle -A PREROUTING -s 192.168.10.0/24 -d 192.168.10.0/24 -j ACCEPT
# rest
iptables -t mangle -A PREROUTING -i eth0 ! -d 192.168.10.0/24 -j CONNMARK --restore-mark
iptables -t mangle -A PREROUTING -s 192.168.10.252 -i eth0 -j MARK1
iptables -t nat -N SNAT1
iptables -t nat -A SNAT1 -j SNAT1 --to-source 192.168.178.199/32
iptables -t nat -A SNAT1 -j ACCEPT
iptables -t nat -A POSTROUTING -o wlan0 -m mark --mark 0x1 -j SNAT1
Diga ao iproute2 para ler essas marcas:
ip rule add pref 30000 fwmark 1 lookup alice
ip rule add pref 29000 from 192.168.178.199 lookup alice
ip route add 0.0.0.0 dev wlan0 scope link src 192.168.178.199 table alice
ip route add default via 192.168.178.1 dev wlan0 scope global table alice
ip route add 192.168.10.0/24 dev eth0 scope link src 192.168.10.1 table alice
Se o host 192.168.10.252 quiser acessar algo que não seja destinado ao próprio roteador, essa conexão será marcada como "1", iproute
lerá essa marca e tentará localizar a regra apropriada. Obviamente, faltam coisas aqui, mas essa é a idéia principal.
Se você seguir essa solução, precisará remover os pesos da rota. Quando você estiver mexendo com tabelas e regras de roteamento, lembre-se de liberar o cache.
entre no arquivo etc/sysctl.conf
e altere
**net.ipv4.ip_forward=0** to
**net.ipv4.ip_forward=1**
**sysctl -p /etc/sysctl.conf**
#iptables -P FORWARD ACCEPT
#service iptables save
Para a segunda pergunta, você precisa ter duas interfaces para a LAN em seu roteador. Digamos, por exemplo, que você tenha Eth3 e Eth4 como suas interfaces de LAN. Endereço Eth3 para o endereço BOB e Eth4 para Alice. Não é possível usar seu gateway WAN como seu gateway de rede local.