Conto curto,
3 interfaces, eth0 (LAN), eth1 (ADSL), eth2 (4G).
eth0 -> eth1: Funciona
(portas 80, 443, 4070) eth0 -> eth2: não acontece
Esta é uma representação gráfica da ideia:
Portas 80 e 443 via eth2
e o restante via eth1
Netscheme:
eth0: -ip 10.0.0.1 -net 10.0.0.0/8 -gw 10.0.0.1 (the servers own intf)
eth1: -ip 192.168.1.74 -net 192.168.1.0/24 -gw 192.168.1.254
eth2: -ip 192.168.1.91 -net 192.168.0.0/24 -gw 192.168.0.1
Esse novo script redireciona 22 e 4070 para a tabela apropriada, eu acho.
No entanto, depois de chegar a essa tabela, ela não é redirecionada para eth2.
Este script funciona, exceto para 22 e 4070!
(A porta 80 não possui comentários e funciona, mas via eth1, o que está errado.)
modprobe iptable_nat
modprobe ip_conntrack
echo "1" > /proc/sys/net/ipv4/ip_forward
iptables -P INPUT ACCEPT
iptables -F INPUT
iptables -P OUTPUT ACCEPT
iptables -F OUTPUT
iptables -P FORWARD DROP
iptables -F FORWARD
iptables -F PREROUTING
iptables -t nat -F
iptables -t mangle -F
iptables -F
# This next line restores any issues trying to connect to something
# if you get weird ACK packets when trying to connect (at least i did)!
iptables -t mangle -A PREROUTING -p tcp -j CONNMARK --restore-mark
ip route flush table main
iptables -A PREROUTING -i eth0 -t mangle -p tcp --dport 22 -j MARK --set-mark 1
### iptables -A PREROUTING -i eth0 -t mangle -p tcp --dport 80 -j MARK --set-mark 1
iptables -A PREROUTING -i eth0 -t mangle -p tcp --dport 4070 -j MARK --set-mark 1
## Setup routes
# LAN
route add -net 10.0.0.0 netmask 255.0.0.0 dev eth0
# ADSL
route add -net 192.168.1.0 netmask 255.255.255.0 dev eth1
# 4G (Only accessible if marking packages with \x01
route add -net 192.168.0.0 netmask 255.255.255.0 dev eth2
# Default via ADSL
## -- Does the same as ip route below? route add default gw 192.168.1.254
echo "201 eth2.out" >> /etc/iproute2/rt_tables
ip rule add fwmark 1 table eth2.out
ip route add default via 192.168.0.1 dev eth2 table eth2.out
ip route add default via 192.168.1.254 dev eth1
## Setup forwards
# From 4G to LAN
iptables -A FORWARD -i eth2 -o eth0 -m state --state ESTABLISHED,RELATED,NEW -j ACCEPT
# From ADSL to LAN
iptables -A FORWARD -i eth1 -o eth0 -m state --state ESTABLISHED,RELATED,NEW -j ACCEPT
# From LAN to ADSL (Default route out)
# - Note: If marked packages is sent to ADSL they will be mangled and rerouted to 4G
iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
iptables -t nat -A POSTROUTING -o eth2 -j MASQUERADE
Script antigo:
Ignore everything below unless you're interested in retracing my steps!!
Eu criei um script router.sh para configurar meu ambiente, caso eu faça algo ruim. Eu tenho três portas que eu quero enviar para uma conexão 4G e o restante através de uma conexão ADSL fixa. Para fazer isso, eu instruí o iptables a manipular pacotes na rota padrão e enviá-los através da minha interface 4G se o --dport == 443 | 80 4070
No entanto, isso não funciona; Eu ainda estou sendo roteado pelo meu telefone fixo, não importa o quê.
É assim que meu script se parece:
#!/bin/bash
## routing tables
# wireless = 4G via eth2
# adsl = adsl via eth1
modprobe iptable_nat
modprobe ip_conntrack
echo "1" > /proc/sys/net/ipv4/ip_forward
iptables -P INPUT ACCEPT
iptables -F INPUT
iptables -P OUTPUT ACCEPT
iptables -F OUTPUT
iptables -P FORWARD DROP
iptables -F FORWARD
iptables -t nat -F
ip route flush table main
ip route flush table wireless
ip route flush table adsl
## Setup routing tables
# ADSL
ip route add table adsl to 192.168.1.0/24 dev eth1
# 4G
ip route add table wireless to 192.168.0.0 dev eth2
ip rule add fwmark 0x1 table wireless
## Setup routes
# LAN
route add -net 10.0.0.0 netmask 255.0.0.0 dev eth0
# ADSL
route add -net 192.168.1.0 netmask 255.255.255.0 dev eth1
# 4G (Only accessible if marking packages with \x01
route add -net 192.168.0.0 netmask 255.255.255.0 dev eth2
# Default via ADSL
route add default gw 192.168.1.254
## Forward ports into the LAN
iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j DNAT --to 10.0.0.3:80
## Lets mark all packets we want for 4G forward
# HTTPS
iptables -A OUTPUT -t mangle -o eth1 -p tcp --dport 443 -j MARK --set-mark 1
# HTTP
iptables -A OUTPUT -t mangle -o eth1 -p tcp --dport 80 -j MARK --set-mark 1
# Spotify
iptables -A OUTPUT -t mangle -o eth1 -p tcp --dport 4070 -j MARK --set-mark 1
## Setup forwards
# From 4G to LAN
iptables -A FORWARD -i eth2 -o eth0 -m state --state ESTABLISHED,RELATED,NEW -j ACCEPT
# From ADSL to LAN
iptables -A FORWARD -i eth1 -o eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
# From LAN to ADSL (Default route out)
# - Note: If marked packages is sent to ADSL they will be mangled and rerouted to 4G
iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT
iptables -A FORWARD -j LOG
#iptables --table nat --append POSTROUTING --out-interface eth2 --jump SNAT --to-source "192.168.1.74"
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
Eu também tentei adicionar esses 3 ao bottomg do script:
iptables -t nat -A POSTROUTING -o eth2 -p tcp --dport 80 -j SNAT --to "192.168.0.91"
iptables -t nat -A POSTROUTING -o eth2 -p tcp --dport 443 -j SNAT --to "192.168.0.91"
iptables -t nat -A POSTROUTING -o eth2 -p tcp --dport 4070 -j SNAT --to "192.168.0.91"
Também tentei sem sucesso:
iptables -A PREROUTING -t mangle -i eth0 -p tcp --dport 80 -j MARK --set-mark 1
Por último, mas não menos importante, tentei:
## Lets mark all packets we want for 4G forward
# HTTPS
iptables -A POSTROUTING -t mangle -o eth1 -p tcp --dport 443 -j MARK --set-mark 1
# HTTP
iptables -A POSTROUTING -t mangle -o eth1 -p tcp --dport 80 -j MARK --set-mark 1
# Spotify
iptables -A POSTROUTING -t mangle -o eth1 -p tcp --dport 4070 -j MARK --set-mark 1
O roteamento funciona, eu posso navegar na web, ouvir música e tudo o mais, mas estou fazendo isso através da interface errada. Pesquisei no Google por um longo tempo e encontrei fragmentos para entender o que estou fazendo e por que estou fazendo. Eu poderia fazer modelagem de tráfego via tc, mas se for possível através da marcação de pacotes no iptables, isso me ajudaria bastante.
Meu palpite é que estou fazendo o pedido errado nas diferentes regras, principalmente a parte MASQUERADE ? ou se isso deveria estar lá?
Alguém pode explicar como a porta DNAT diz, tcp: 80 de uma interface externa (um ou ambos os protocolos) para um espaço de endereço 10.0.0.0 interno?
Saídas:
root@Netbridge:~# route -n Kernel IP routing table Destination
Gateway Genmask Flags Metric Ref Use Iface<br>
0.0.0.0 192.168.1.254 0.0.0.0 UG 0 0 0 eth1<br>
10.0.0.0 0.0.0.0 255.0.0.0 U 0 0 0 eth0<br>
192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth2<br>
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
root@Netbridge:~# ifconfig
eth0 Link encap:Ethernet HWaddr 00:0c:29:7e:9e:4e
inet addr:10.0.0.1 Bcast:10.255.255.255 Mask:255.0.0.0
eth1 Link encap:Ethernet HWaddr 00:0c:29:7e:9e:58
inet addr:192.168.1.74 Bcast:192.168.1.255 Mask:255.255.255.0
eth2 Link encap:Ethernet HWaddr 00:0c:29:7e:9e:62
inet addr:192.168.0.91 Bcast:192.168.0.255 Mask:255.255.255.0
Siga estas instruções:
output-traffic-on-different-interfaces-based-on-destination-por
iptables-forward-specific-port-to-specific-nic
Entre alguns outros threads relacionados.
localhost
e ao endereço daeth2
interface?ethX
endereço IP de um servidor impedirá que os hosts naethX
LAN acessem o servidor local usandoethY
o endereço IP, e não impedirá que os hostsethY
acessem o servidor usandoethX
o endereço IP. Lembre-se de que o Linux usa um modelo de host fraco.Respostas:
O BatchyX já dá uma explicação muito boa sobre iptables e roteamento, então exercitarei minha preguiça e irei diretamente para o script.
Deve NAT todo o tráfego para a porta 80.443,22.4070 através de 192.168.0.91. Todo o resto será NAT através de 192.168.1.254.
Eu refiz meus testes e acabo seguindo este guia . O que está faltando nesse guia são as três últimas linhas do meu script. Que descobri de outra porta, mas perdi o controle desse link.
É um script de trabalho testado.
Precisa de rota padrão
Uma coisa que eu não coloquei no script é configurar a rota padrão. Deveria ser
Ao fazê-
route -n
lo, deve ser a única rota padrão (Dest: 0.0.0.0)fw-router.sh
PS1: Em resumo,
MASQUERADE
não funciona (na maioria dos casos, e definitivamente no seu caso) para NAT com vários IPs externos que precisam de algum tipo de balanceamento de carga ou precisam de DNAT para lidar com o tráfego recebido. Você precisaSNAT
de controle de direção.PS2: o iptables puro não é suficiente.
fonte
Nota: Apenas considerei o primeiro script, ignorando o antigo.
route
eip route
. Isso é puro mal. Basta usar emip
qualquer lugar e esquecerifconfig
eroute
/etc/iproute2/rt_tables
não é redefinido nas reinicializações. Anexar a mesma entrada repetidamente não é uma boa ideia, você só precisa fazer uma vez. Lembre-se de quert_tables
apenas define aliases de nome para valores numéricos, isso não altera nenhuma configuração.Agora
iptables
: em suaFORWARD
cadeia, você descarta pacotes provenientes da LAN para 4G. Isto é mau. oFORWARD
gancho é usado após a conclusão do roteamento. Nesse ponto, todo o roteamento de diretiva está concluído e já se sabe se o pacote deve ser enviado para 4G ou ADSL. Não há redirecionamento realizado emFORWARD
ou apósFORWARD
(bem, tecnicamente, o redirecionamento pode ser realizadoPOSTROUTING
em casos graves, mas voltando ao ponto).Agora para o seu roteamento: lembre-se de que o Ubuntu habilita a filtragem de caminho reverso por padrão. A filtragem de caminho reverso funciona da seguinte maneira: Quando o kernel recebe um pacote (seja ele encaminhado ou não) de uma interface A, ele inverte o endereço de origem e o endereço de destino e verifica se o pacote resultante deve ser roteado pela interface A. Caso contrário, o pacote será descartado como uma tentativa de falsificação de endereço.
Para pacotes recebidos de
eth0
, isso não é um problema. Para pacotes recebidos deeth1
, isso também não é um problema, porque ao reverter o endereço IP de origem e o endereço IP de destino, o kernel será a rota padrão na tabelamain
. Para pacotes recebidos deeth2
, que você não marca, isso é um problema, porque o kernel atingirá a rota padrão na tabelamain
e considere que esses pacotes deveriam ter sido recebidos deeth1
. A solução mais fácil é desativar a filtragem de caminho reverso no eth1:fonte