Veja o que eu faço.
Servidor (a Internet pública é 222.x.x.x):
echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf
sysctl -p
iptunnel add gre1 mode gre local 222.x.x.x remote 115.x.x.x ttl 255
ip add add 192.168.168.1/30 dev gre1
ip link set gre1 up
iptables -t nat -A POSTROUTING -s 192.168.168.0/30 -j SNAT --to-source 222.x.x.x
iptables -t nat -A PREROUTING -d 222.x.x.x -j DNAT --to-destination 192.168.168.2
Cliente (a Internet pública é 115.x.x.x):
iptunnel add gre1 mode gre local 115.x.x.x remote 222.x.x.x ttl 255
ip add add 192.168.168.2/30 dev gre1
ip link set gre1 up
echo '100 tunnel' >> /etc/iproute2/rt_tables
ip rule add from 192.168.168.0/30 table tunnel
ip route add default via 192.168.168.1 table tunnel
Até aqui tudo parece dar certo. Mas então 1ª pergunta, como usar o túnel GRE como rota padrão? O computador cliente ainda está usando a interface 115.x.x.x como padrão.
2 ª questão, como forçar apenas o tráfego ICMP para passar por túnel, e tudo mais vai interface padrão? Eu tento fazer isso no computador do cliente:
ip rule add fwmark 200 table tunnel
iptables -t mangle -A OUTPUT -p udp -j MARK --set-mark 200
Mas depois de fazer isso, meu programa de ping expirará (se eu não estiver fazendo o comando acima e usando ping -I gre1 ip
, ele funcionará). Mais tarde eu quero fazer outra coisa também, como apenas a porta UDP 53 através do túnel, etc.
Terceira pergunta, no computador cliente, forço um programa mysql a escutar na interface gre1 192.168.168.2. No computador cliente, há também mais uma interface pública (IP 114.x.x.x) ... Como encaminhar o tráfego corretamente usando iptables e route, então o mysql também responde a um pedido vindo desta interface pública 114.x.x.x?