Самый простой способ - использовать что-то, что является просто TCP-прокси. Добиться этого можно с помощью iptables, но не легко.
Легко пересылать запросы от A, предназначенные для B, к C (используя DNAT), но труднее получить ответы C, чтобы вернуться к A через B (потому что DNAT не меняет адрес отправителя). Затем A игнорирует ответы, так как они приходят от C, а не от B.
По сути, способ сделать это - установить B в качестве шлюза C по умолчанию и, используя переадресацию, однако, это создает дополнительную точку отказа в B; в случае сбоя B исходящий трафик C (включая ответы на запросы, отправленные непосредственно в C) в конечном итоге уйдет в черную дыру.
Я думаю, что при использовании IPtables это возможно без этого трюка с маршрутизацией, но вам нужно иметь одинаковые соединения SNAT'd и DNAT'd, что в лучшем случае сложно.
Обычно в таких ситуациях большинство людей ставят другой хост (брандмауэр) перед двумя компьютерами и заставляют его принимать решения DNAT - конечно, это также приводит к точке отказа, поэтому в критических настройках брандмауэр обычно имеет резервное резервное копирование (его конфигурация синхронизирована, а иногда и таблица отслеживания подключений)