Existem algumas coisas envolvidas aqui.
A saída da caixa local usa a tabela OUTPUT
, não PREROUTING
. PREROUTING
é para o tráfego que passa pela caixa.
A regra iptables somente coincide quando um pacote é enviado. Quando o cliente abre uma conexão, ele precisa se ligar a um endereço antes que um único pacote seja gerado. Quando ele liga, ele escolhe o endereço de origem de acordo com as regras de roteamento, sem consultar o iptables.
Quando você testa usando 127.0.0.1
como destino e envia o pacote, ele tenta enviar usando 127.0.0.1
como o endereço de origem, que por padrão o kernel não permite ser roteado.
Se você corrigir esse problema, você terá outro problema quando o pacote deixar a interface e tiver um endereço de origem que o sistema remoto não saiba como retornar.
Assim, a solução é 3 coisas:
1) Adicione a regra à tabela OUTPUT:
iptables -t mangle -A OUTPUT -p udp -m udp --dport 10000 -j MARK --set-xmark 0x4/0xffffffff
2) Ativar roteamento de localnet com:
sysctl -w net.ipv4.conf.$iface.route_localnet=1
onde $iface
é sua interface de túnel.
3) Adicione uma regra MASQUERADE
para que o endereço de origem do tráfego que sai da interface seja reescrito:
iptables -t nat -A POSTROUTING -o $iface -m addrtype --src-type LOCAL -j MASQUERADE
No entanto, observe que, ao testar o envio de tráfego para 127.0.0.1
, é provável que você encontre problemas. Nada está reescrevendo o endereço de destino, portanto, ele está sendo encaminhado para fora $iface
com um destino de 127.0.0.1
. O sistema remoto provavelmente rejeitará esse tráfego.