O problema é que o Linux trata qualquer coisa dentro de 127.0.0.0/8
como sendo local, e até responde (tente pingar 127.99.88.77).
O que isto significa é que o pacote é originalmente transmitido na saída como o pacote está "deixando" lo
. Quando "entra" vai para a cadeia INPUT (eu segui para ter certeza). É aqui que sua situação é quebrada.
Cadeias de roteamento PRE / POST de lado, nos pacotes Linux destinados ao sistema, irá atravessar apenas a cadeia INPUT. Os pacotes originados no sistema percorrerão somente a cadeia OUTPUT. Os pacotes que não são originados nem destinados ao sistema local irão percorrer apenas a cadeia FORWARD.
Então, o que você tem é que o Linux está selecionando a cadeia INPUT quando você quer que ela esteja selecionando a cadeia FORWARD.
Eu tentei algumas opções diferentes e também não consegui fazê-lo funcionar, mas sei definitivamente por que não está funcionando. Vou tentar ver isso mais tarde, quando tiver mais tempo.
P.S. No começo eu pensei que você simplesmente tinha um problema de roteador (e no fundo eu ainda sinto que o roteamento está envolvido). Traduzir os IPs em lo
fora de 127.0.0.1
causará uma violação de roteamento que pode descartar pacotes de forma silenciosa. Para desabilitar isso, você precisa definir rp_filter=0
. Você ainda precisará fazer isso antes de poder fazê-lo funcionar, mas essa não é a raiz do problema. A questão principal é que o Linux está usando INPUT quando você quer OUTPUT.