У меня есть машина Linux, которая всегда подключена к VPN (интерфейс vpn0), и маршрут по умолчанию проходит через интерфейс vpn0. Подключение к моему роутеру осуществляется через интерфейс wlan0.

Мне нравится тот факт, что он все маршрутизирует через VPN, и есть причины сохранить этот конфиг. Но так как VPN довольно медленный, я хотел бы иметь возможность запускать несколько конкретных приложений с другим маршрутом по умолчанию: одно, которое идет напрямую через wlan0 вместо vpn0. Я не хочу, например, чтобы мое apt-get update или браузер-web-radio-streaming проходили через VPN.

Я много гуглил за это и не нашел никого с такой же проблемой. Одно решение, которое я нашел, требует от меня использования eth0: я подключаю eth0 к сети, создаю новое сетевое пространство имен, а затем перемещаю eth0 в это новое пространство имен и использую его нормально. Затем я могу запустить приложения на нем с помощью команды ip netns exec nsname command . Большая проблема с этим решением состоит в том, что оно требует, чтобы я подключился как через eth0, так и через wlan0, и я ищу решение, которое использует только wlan0 - поскольку в настоящее время многие машины даже не имеют Ethernet.

Кажется, путь будет: создать новое сетевое пространство имен, создать виртуальную пару локальных сетей (veth0 и veth1), переместите veth1 в новое пространство имен, а затем сделать некоторые магию , чтобы направить материал из другой сети имен , чтобы использовать wlan0 в качестве шлюза вместо vpn0.

Поскольку veth1 находится на новом NS, а veth0 на NS по умолчанию, и оба подключены, я думаю, мы, вероятно, хотим найти способ перенаправить трафик veth0 для использования другого маршрута (или таблицы маршрутизации?) чем стандартный. Кажется, я мог бы использовать "маршрутизацию на основе политик", но пока все мои попытки потерпели неудачу. Кроме того, поскольку wlan0 не позволяет использовать такие же интересные функции, как eth0 (например, присоединение к мостам), это решение, вероятно, будет включать в себя некоторый вид nat/masquerading.

Кто-нибудь может дать мне свет здесь? Может быть патч к скрипту ниже?

Примечание. Интерфейс wlan0 имеет IP 192.168.1.3, а беспроводной маршрутизатор - 192.168.1.1. Кроме того, приложения внутри VPN должны использовать http_proxy и друзей, но мне это не нужно, когда я не в VPN.

Я пробовал много разных вещей, но это список большинства команд, которые я пробовал:

echo 1 > /proc/sys/net/ipv4/ip_forward

# Create the novpn namespace, the virtual interfaces and configure them
ip netns add novpn
ip link add name veth0 type veth peer name veth1
ip link set veth1 netns novpn
ifconfig veth0 192.168.1.100/24 up
ip netns exec novpn ifconfig veth1 192.168.1.101/24 up

# Route stuff from veth0 to wlan0 using NAT. I don't know if this is
# really what I want because it uses the default routing tables
iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
iptables -A FORWARD -i veth0 -j ACCEPT

# Do some magic to configure the routing tables on the new NS
ip netns exec novpn ip route add default via ?.?.?.? dev veth1

# Maybe try to route some stuff with a new routing table called novpn:
ip rule add iif veth0 lookup novpn
ip route add default dev wlan0 table novpn
ip route ???
ip route flush cache

Мне также сказали, что, возможно, я мог бы использовать настройку, которая включает маршрутизацию только "внутреннего" трафика через VPN, но я действительно не хочу этого.

1 ответ1

1

Это на самом деле проще, чем это.

Что вам нужно сделать, это настроить политику маршрутизации, чтобы у вас было две разные таблицы маршрутизации, и правило, которое сообщает вашему компьютеру, когда использовать любую из них.

Вы запускаете свой vpn, и давайте предположим, что у вас есть интерфейс tap0/tun0 с IP-адресом 10.0.0.71 и интерфейсом wlan0 с адресом 192.168.0.5.

Теперь нам нужно настроить политику маршрутизации:

 echo 201 novpn >> /etc/iproute2/rt_tables
 ip route add 192.168.0.0/24 dev wlan0 src 192.168.0.5 table novpn
 ip route add default via 192.168.0.1 table novpn
 ip rule add from 192.168.0.5 table novpn
 ip rule add from 10.0.0.71 table main

и вы теперь сделали. Вам нужно будет привязать определенные приложения к любому интерфейсу в зависимости от того, хотите ли вы использовать VPN или нет. Привязать приложение к интерфейсу, как правило, легко, за исключением заведомо липкого Firefox, для которого вы можете прочитать эту веб-страницу.

Помните, что вам разрешен один набор DNS-серверов, как указано в /etc/resolv.conf. Вы должны убедиться, что по крайней мере один из них доступен для любого интерфейса: если VPN указывает, что они оба находятся в удаленной локальной сети, разрешение имен для второго интерфейса не-VPN не будет работать.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .