(Antes de entrar em detalhes, estou apresentando este problema com Apache e SSH como exemplo, mas isso não é específico para o tráfego TCP, é o mesmo problema com protocolos baseados em TCP e UDP.)
Eu tenho um servidor multilinked multihomed com Ubuntu 9.04, com eth0 conectado a uma rede outside e eth1 conectado a uma rede inside . A rede externa é apresentada ao "resto do mundo" e a rede interna contém todas as estações de trabalho e servidores de trabalho. Há um firewall bloqueando o tráfego do "resto do mundo" para a rede interna, mas não bloqueando solicitações de saída.
$ /sbin/ifconfig
eth0 Link encap:Ethernet HWaddr 00:30:18:a5:62:63
inet addr:xxx.yyy.159.36 Bcast:xxx.yyy.159.47 Mask:255.255.255.240
[snip]
eth1 Link encap:Ethernet HWaddr 00:02:b3:bd:03:29
inet addr:xxx.zzz.109.65 Bcast:xxx.zzz.109.255 Mask:255.255.255.0
[snip]
$ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
xxx.yyy.159.32 0.0.0.0 255.255.255.240 U 0 0 0 eth0
xxx.zzz.109.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
0.0.0.0 xxx.yyy.159.33 0.0.0.0 UG 100 0 0 eth0
Apache está escutando na porta 80, sshd ouvindo 22:
$ netstat --tcp -a
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 *:www *:* LISTEN
tcp 0 0 *:ssh *:* LISTEN
[snip]
Da minha máquina de desenvolvimento no interior, xxx.zzz.109.40, eu posso conectar ao endereço interno e tudo está bem. Do lado de fora, posso me conectar ao endereço externo e tudo funciona como deveria.
Mas, para alguns tipos de teste, gostaria de me conectar ao endereço externo da minha máquina de desenvolvimento, mas o servidor está recusando a solicitação de conexão. Eu estou supondo que ele está procurando em suas tabelas de roteamento e desde que os dados de entrada são provenientes de um endereço que deveria estar na eth1, mas está chegando na eth0 que está descartando, provavelmente como uma precaução de segurança.
Existe alguma maneira de eu relaxar essa restrição?
O curioso é que isso costumava funcionar em 8.04, mas não funciona em 8.10 ou 9.04, então em algum momento durante o último ano o kernel está fazendo alguma verificação extra. Para que a conexão funcione, o caminho de retorno precisa ser o mesmo que o caminho de origem, então isso significa que as mensagens da minha máquina de desenvolvimento que chegam na eth0 teriam que voltar na eth0 para serem roteadas de volta para minha máquina.
Aqui está um diagrama, não há nenhum NAT em lugar algum.
Diagrama http://i25.tinypic.com/ff37yx.png