Опция IPDIVERT в ядре лишняя, она не нужна для работы ядерного NAT. Мешать она не мешает, но на всякий случай имейте в виду -- её можно спокойно убрать.
Первый fwd (правило 600) -- тоже не нужен, у вас и так трафик будет улетать в шлюз по умолчанию, и без этого правила.
А не работает у вас потому, что до второго NAT-а дело не доходит никогда. Схема такая:
- Пришёл пакет из интернета (допустим, с внешнего IP ZZZ) на X2:3389.
- Первый NAT его поймал и поменяв DST IP на 192.168.0100, отправил пакет в локалку.
- Хост 192.168.0.100 на него ответил, и отправил ответ через свой шлюз по умолчанию (это ваша фряха).
- Фряха получила пакет от клиента, предназначенный для некоего внешнего адреса ZZZ. Осознала, что он предназначен для внешнего адреса, и НАПРАВИЛА ЕГО В СВОЙ DEFAULT GW. А default GW у неё -- это шлюз на стороне провайдера 1. В сторону этого провайдера смотрит интерфейс tun0
- Дальше пакет идёт по правилам файрвола и натыкается на правило: $cmd add 1100 nat 1 ip from any to any via tun0. Пакет под него подпадает, так как он системой отправлен через tun0. Соответственно, согласно этому правилу пакет попадает в NAT, и его SRC IP меняется с 192.168.0.100 на X2.
- Дальнейшая обработка продолжается (так как one_pass=0), но мы уже получили что? Что у нас есть исходящий пакет (после обработки первым натом) с IP-адреса X2, предназначенный для внешнего адреса ZZZ и улетающий через интерфейс tun0. Соответственно, второй NAT его не обрабатывает, так как под его условия (via tun1) этот пакет уже не попадает. Поэтому пакет дальше просто уходит в сторону шлюза X1, и всё
В вашем случае самым простым способом будет выдать хосту 192.168.0.100 ещё один IP-шник (скажем, 192.168.0.101), и через провайдера 2 заворачивать пакеты именно на него. Тогда можно будет сделать так:
$cmd nat 1 config log if tun0 reset same_ports deny_in redirect_port tcp 192.168.0.100:3389 3389
$cmd add 1100 nat 1 ip from 192.168.0.100 to any via tun0
# Второй NAT
$cmd nat 2 config log if tun1 reset same_ports deny_in redirect_port tcp 192.168.0.101:3389 3389
$cmd add 1200 nat 2 ip from 192.168.0.101 to any via tun1
$cmd add 1300 fwd YYY.YYY.YYY.YY1 ip from YYY.YYY.YYY.YY2 to any out via tun0
Правила схематичные, и не учитывают, что нужен обычный нат для всех остальных клиентов. Просто демонстрация, для понимания логики.