Название вопроса не совсем имеет смысл, как написано. Во-первых, трафик не направляется на TCP-порты или с них (лучше думать о них как о метках), а TCP-порты никак не связаны с интерфейсами. И ничто из этого не имеет ничего общего с возможностью использовать веб-сервер, когда VPN включена и выключена.
Маршруты для пакета выбираются в первую очередь на основе его IP-адреса назначения путем поиска его в таблице маршрутизации. Обычная проблема - какой FreeBSD pf (и из того, что я слышал, Windows) имеет дополнительные встроенные механизмы, чтобы избежать, но Linux придерживается основ - состоит в том, что исходящие «ответные» пакеты маршрутизируются полностью независимо от входящих » оригинальные пакеты. Поэтому, если у вас есть два маршрута по умолчанию (как через шлюз локальной сети, так и через VPN), Linux всегда будет предпочитать один и тот же.
В этой ситуации обычно требуется маршрутизация, зависящая от источника, или политика маршрутизации. ОС должна знать, что исходящие «ответные» пакеты a) с данного IP-адреса источника или b), принадлежащие определенным установленным соединениям, должны использовать другой выбор маршрута.
По великой традиции «но Linux - это выбор», вы должны настроить это вручную, объединяя различные механизмы. Я предполагаю, что вам также нужен IPv4, и, следовательно, вы не можете полностью полагаться на механизм "поддерева" (который намного проще в использовании, но, к сожалению, только для IPv6, как реализовано).
Сначала убедитесь, что у вас есть две таблицы маршрутизации, каждая из которых имеет свой маршрут по умолчанию:
ip -4 route add default via 192.168.1.1 dev eth0 table 2
ip -4 route add default dev tun0 table 3
(Ярлык: если предположить, что у «основной» таблицы уже есть маршрут по умолчанию через VPN, вам здесь не нужна таблица 3, вы можете просто использовать «главную» для этого вместо создания таблицы 3.)
Затем добавьте правила маршрутизации политики, чтобы просмотреть эту таблицу в зависимости от исходного IP-адреса:
ip -4 rule add pref 200 from 192.168.1.0/24 lookup 2
ip -4 rule add pref 300 from <vpnnet> lookup 3
(Опять же, если «главная» таблица уже предпочитает маршрут по умолчанию через VPN, вы можете пропустить последнее правило. Это включено здесь для полноты.)
Затем проверьте результат с помощью:
ip -4 route get 8.8.8.8 from 192.168.1.x
ip -4 route get 8.8.8.8 from <vpnip>