O problema é que você tem uma rota na tabela local
que diz:
$ ip route show table local
[...]
local 192.168.1.101 dev eth0 scope host
[...]
Ao enviar um pacote com [src = 192.168.1.101 dst = 192.168.1.101], e esperar que o roteador envie o pacote de volta refletido (alguns se recusarão a esse tipo de coisa), você quer que o pacote de saída pule esse rota, mas não o pacote voltando.
Para isso, você pode alterar o ip
rules
:
Remova a regra pega-tudo para a tabela local
.
# ip rule del from all table local
E substitua por um que não faça isso para os pacotes 192.168.1.101- > 192.168.1.101:
# ip rule add not from 192.168.1.101 to 192.168.1.101 table local pref 0
Em seguida, marque os pacotes recebidos com o netfilter:
# iptables -t mangle -I PREROUTING -s 192.168.1.101 -d 192.168.1.101 -j MARK --set-mark 1
E diga a regra de IP para usar a tabela local
apenas para aqueles:
# ip rule add fwmark 1 table local pref 1
(claro, você também precisa do seu ip route add to 192.168.1.101 via 192.168.1.2
na sua tabela main
)