Роутинг срабатывает именно там, где ты ожидаешь.
Но поскольку ты подменяешь исходящий адрес пакета на чужом интерфейсе, он либо дропается при проверке на выходе, либо убивается первым за тобой шлюзом, либо убивается опять же тобой при приёме ответа, пришедшего на чужой интерфейс.
Подробности - google://rp_filter
В твоём случае пакет, уходящий через eth2 будет иметь адрес источника не 101.16.1.58 (как должно было быть) а 10.15.103.41 (как у тебя в правилах написано - все пакеты из сети 192.168.... маскировать по 10.15.103.41). Как самое меньшее, ответные пакеты будут возвращаться на eth1 (10.15.103.41), а ждут их таки на eth2, так что с eth1 они будут убиты как заблудившиеся.