Сымитируем, что S1 - некий клиент из интернета и он хочет подключиться к VM1 (тот клиент, до которого нет ни маршрута, ни настроен маскарад). Пусть это будет попытка подлючиться по ssh. SSH по дефолту висит на 22 порту, но если у нас таких серваков будет больше 1, то как быть? Вообще по-хорошему чтобы избавиться от самых простых сканеров сети, ssh нужно всегда убирать с 22 порта. Воспользуемся портом 30022, например, чтобы обратиться по ssh к VM1.
Как это работает?
S1 отправляет пакет (s.ip=s1.ip, d.ip=r1.ip; s.port=N, d.port=30022) который прилетает на R1
R1 Просматривает iptables и применяет правило DNAT, и формирует пакет (по нашему правилу): (s.ip=s1.ip, d.ip=vm1.ip; s.port=N, d.port=22)
Просматривает таблицу маршрутизации и отправляет пакет vm1 через интерфейс eth0.200.
vm1 в свою очередь принимает пакет, получает data, и формирует ответ: (s.ip=vm1.ip, d.ip=s1.ip; s.port=22, d.port=N)
R1 принимает пакет и восстанавливает исходный s.ip к которому изначально обратился s1:
(s.ip=r1.ip, d.ip=s1.ip; s.port=22, d.port=N)
Достичь этого можно следующим образом: