Пару лет назад у меня были такие же вопросы, и как раз на этом сайте нашёл перевод документации по iptables где этот вопрос так же рассмотрен
в кратце суть такая
машина 1 вызывает машину 2, та, в цепочке PREROUTING меняет адрес назначения пакета, подставляя ему адрес машины 3
после этого проиходит маршрутизация и пакет покидает машину 2 и попадает на машину 3,
та, видя что пакет пришёл от машины 1, а также видя что машина 1 находится с ней в одной сети, посылает ответ прямо ей.
Машина 1 получает пакет от машины 3, видит что у неё нет с ней соединений и отбрасывает его, потому что она вызывает машину 2, про то что ты по дороге поменял адрес назначения ей ничего не известно.
Чтобы это не происходило и весь обмен пакетами шёл через машину 2, надо менять не только адрес назначения, но источника. Тогда машина 3 пошлёт ответ на машину 2, а машина перешлёт его изменив адреса обратно, на машину 1
А прямой вызов с машины 2 работает, потому что машина 3 посылает ответ непосредственно на машину 2.
наверно ответил путанно, но для более внятного объяснения советую прочесть переводную документацию, она очень понятная и наглядная
Сергей