Я искал предыдущих людей, которые задавали похожие вопросы, но еще не получил прямого ответа, который будет работать для моей данной ситуации, так что давайте ...
Я работаю в Linux (Fedora 22) и у меня есть VPN-сервис, за который я плачу, однако мне нужны только определенные программы, чтобы использовать VPN для их интернет-трафика, и я могу использовать мое стандартное ISP-соединение для всего остального (например, просмотр веб-страниц, так далее)
Мы сделаем это простым и ограничим его наиболее используемой программой World of Warcraft, которая запускается через WINE.
Теперь у меня есть настройка VPN через сетевой интерфейс, так что весь мой трафик через enp10s0 (странное название моих компьютеров для eth0) может быть туннелирован через службу VPN, однако мне нужны только определенные программы (или порты, которые эти программы используют, чтобы быть конкретным) пройти через VPN.
Как настроить туннель, и он должен только маршрутизировать порты, необходимые через VPN, сохраняя все остальное без маршрутизации?
Ответы:
То, что вы просите, не существует. Вот почему вы не удовлетворены найденными вами ответами (некоторые из них, возможно, мои): все они предложили обходные пути , а не подлинное решение, ни простое, ни сложное.
Позволь мне объяснить. Маршрутизация во всех ОС определяется адресом назначения: у вас вполне может быть несколько маршрутов, но выбор между ними зависит не от приложения, вызывающего соединение, а просто от адреса назначения. Полная остановка.
Позвольте мне привести вам нетривиальный пример. Когда VPN-клиент установил соединение со своим сервером, все еще возможно направить соединение на определенный сайт, например, example.org, за пределы VPN. Но все приложения, пытающиеся достичь этого специального адреса, будут маршрутизироваться за пределы VPN: некоторые приложения не могут отправляться на example.org через VPN, в то время как другие приложения выходят за пределы VPN.
Ситуация становится богаче с ядром Linux, которое допускает маршрутизацию источника: это означает, что вы можете иметь две или более таблиц маршрутизации, и выбор между ними зависит от адреса источника, а не от адреса назначения.
Нетривиальный пример: мой компьютер имеет две внешние линии с двумя разными публичными IP-адресами. С ним можно связаться через любой интерфейс, и важно, чтобы мои ответы на данное соединение проходили через тот же интерфейс, через который было установлено соединение: в противном случае они будут отброшены как неактуальные, когда они достигнут того, кто инициировал соединение. Это источник маршрутизации.
Справедливо, как насчет связей, которые мы начинаем? Некоторые приложения позволяют указывать адрес привязки, например, клиент openssh :
Для них нет проблем с тем, чтобы один экземпляр проходил через VPN (скажем, таблица маршрутизации 1), тогда как другой экземпляр будет выходить за пределы VPN (скажем, таблица маршрутизации 2). Но другие приложения, такие как Firefox, не только общеизвестно сложно связать с конкретным IP-адресом источника (но см. Здесь очень умный обходной путь), но также являются злыми и неприятными в том смысле, что они не позволят вам иметь две копии себя работает одновременно, каждый привязан к другому адресу источника. Другими словами, в то время как благодаря упомянутой выше уловке вы можете обязать один экземпляр связываться с выбранным вами адресом источника, тогда у вас не будет другой версии, привязывающей его к другому адресу источника.
Это объясняет, почему мы используем обходные пути: все они основаны на одной и той же идее, что они работают с отдельным сетевым стеком, чем остальной компьютер. Таким образом, в порядке уменьшения сложности вы можете иметь виртуальные машины, докеры, контейнеры, пространства имен. В каждой из них у вас будет одна или несколько таблиц маршрутизации, но у вас может быть несколько экземпляров каждой (VM / dockers / container / namespaces), и вы также можете свободно добавлять их, каждая из которых запускает свое собственное приложение, такое как Firefox, счастливо разделенное от других.
Возможно, вы все еще заинтересованы в одном из обходных путей?
РЕДАКТИРОВАТЬ:
Самый простой обходной путь - это пространство имен сети. Сценарий ниже обрабатывает все необходимые аспекты NNS: поместите его в файл (вы выбираете свое имя, я обычно использую
newns
, но вы делаете все, что вы предпочитаете)/usr/local/bin
, затемchmod 755 FILE_NAME
вы можете использовать его следующим образом:Он откроет
xterm
для вас (потому что мне нравится, что xterm работает, но вы можете изменить его, если хотите использовать что-то еще), который принадлежит новому пространству имен. Внутри xterm вы можете, если хотите, запустить vpn, а затем начать игру. Вы можете легко проверить, используете ли вы VPN, с помощью следующей команды:который возвращает вам ваш публичный IP. После настройки VPN в xterm вы можете проверить, отличается ли ваш публичный IP-адрес в других ваших окнах. Вы можете открыть до 254 xterms, с 254 различными NNS и разными соединениями.
Если вы хотите, вы можете даже запустить весь рабочий стол в новом пространстве имен сети, с помощью
затем вы можете найти его с помощью Alt+ Ctrl+ Fn, где Fn - один из F1, F2, ....-
Мне нужно добавить одно предупреждение: обработка DNS внутри пространств имен немного глючит, наберитесь терпения.
источник
$ route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 0.0.0.0 0.0.0.0 U 50 0 0 ppp0 0.0.0.0 192.168.1.1 0.0.0.0 UG 100 0 0 enp10s0 1.0.0.1 0.0.0.0 255.255.255.255 UH 0 0 0 ppp0 192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 enp10s0 192.168.1.0 0.0.0.0 255.255.255.0 U 100 0 0 enp10s0 199.168.112.120 192.168.1.1 255.255.255.255 UGH 100 0 0 enp10s0