Я нашел ответ. Решение называется Outbound NAT, который переводит IP-адрес источника или пакет, а не (как обычно) IP-адрес назначения.
К сожалению, документация является немного двусмысленной и легко неверно истолкованной для Исходящего NAT, так что это был полный ответ, который я нашел:
Я предполагал, что NAT будет применен к пакету, который был исходящим (то есть входил в маршрутизатор через некоторый интерфейс), но на самом деле он был применен к пакету, так как он исходящий от маршрутизатора, на исходящем интерфейсе.
Я установил виртуальный IP-адрес типа «IP-псевдоним» (но, возможно, некоторые другие типы работали бы так же хорошо) с IP-адресом, с которого я хотел, чтобы пакет выглядел так, как будто он получен (что-то в диапазоне 192.168.1.0/24 в этот пример - например 192.168.1.5). Псевдоним IP должен быть на интерфейсе - я использовал интерфейс, на котором он оставил бы маршрутизатор (OPT1 в этом примере), а не тот, на который он поступает в маршрутизатор.
Я включил гибридный NAT (ручной / AON NAT также сработал бы), а затем добавил правило исходящего NAT на том же интерфейсе (OPT1) с source = any (или с любым диапазоном IP-адресов, с которого фактически пришел пакет) и dest = IP-адрес назначения или его подсеть или что-то еще (я использовал 192.168.1.0/24). Затем я установил «адрес перевода», выбрав виртуальный IP-адрес, который я ввел на шаге 1, из раскрывающегося списка.
Это делает то, что я хочу. Пакет, отправленный на IP-адрес назначения, поступает из локальной сети и принимается NAT, когда он отправляется на OPT1 (интерфейс в правиле NAT). Поскольку src пакета соответствует «any», а его dest соответствует значению, введенному в правиле NAT (192.168.1.0/24), его источник переводится в 192.168.1.5, как требуется, перед отправкой через OPT1.
Захват пакета подтверждает это - когда я пингую, как описано в 1-м посте, захват пакета на интерфейсе OPT1 показывает эхо-запрос и ответ от 192.168.3.2 -> 192.168.1.100, но захват пакета на интерфейсе OPT2 показывает эхо-запрос и ответ от 192.168 .1.5 -> 192.168.1.100 по желанию.
Это полезно не только для моего устройства, но и для любой другой ситуации, когда должны появиться пакеты, поступающие из той же подсети, что и другое устройство.