3

В течение нескольких дней я пытался заставить VPN использовать только определенные приложения. До сих пор я обнаружил, что довольно просто заставить все приложения использовать его, или нет приложений для его использования.

Я не настроен на сценарий или что-нибудь. Я просто хочу, чтобы это сработало. Любое из следующего является приемлемым:

  • Заставить приложения определенного пользователя использовать интерфейс tun0
  • Заставить определенные порты использовать интерфейс tun0
  • Заставить определенные процессы использовать интерфейс tun0 (это было мое первоначальное намерение, но я понимаю, что эта функция не существовала в iptables в течение некоторого времени)

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

Я использую Fedora и использую OpenVPN.

Я работал с этим сценарием:

#!/bin/sh

DEV1=wlp0s20u2
IP1=192.168.0.200
GW1=192.168.0.1
TABLE1=internet
TABLE2=vpn
DEV2=tun0
IP2=`ifconfig | egrep -o '192.168.179.[0-9]{1,3}' | head -n1`
GW2=`ifconfig | egrep -o '192.168.179.[0-9]{1,3}' | tail -n1`

ip route flush table $TABLE1
ip route flush table $TABLE2
ip route show table main | grep -Ev ^default | while read ROUTE ; do
    ip route add table $TABLE1 $ROUTE
    ip route add table $TABLE2 $ROUTE
done
ip route add table $TABLE1 $GW1 dev $DEV1 src $IP1
# Error "RTNETLINK answers: File exists" at below line
ip route add table $TABLE2 $GW2 dev $DEV2 src $IP2
ip route add table $TABLE1 default via $GW1
ip route add table $TABLE2 default via $GW2

echo "1" > /proc/sys/net/ipv4/ip_forward
echo "1" > /proc/sys/net/ipv4/ip_dynaddr
echo "2" > /proc/sys/net/ipv4/conf/tun0/rp_filter

ip rule add from $IP1 lookup $TABLE1
ip rule add from $IP2 lookup $TABLE2
ip rule add fwmark 1 lookup $TABLE1
ip rule add fwmark 2 lookup $TABLE2

iptables -t nat -A POSTROUTING -o $DEV1 -j SNAT --to-source $IP1
iptables -t nat -A POSTROUTING -o $DEV2 -j SNAT --to-source $IP2

iptables -t nat -A PREROUTING           -m state --state ESTABLISHED,RELATED          -j CONNMARK --restore-mark
iptables        -A OUTPUT               -m state --state ESTABLISHED,RELATED          -j CONNMARK --restore-mark
iptables -t nat -A PREROUTING -i $DEV1  -m state --state NEW                          -j CONNMARK --set-mark 1
iptables -t nat -A PREROUTING -i $DEV2  -m state --state NEW                          -j CONNMARK --set-mark 2
iptables -t nat -A PREROUTING           -m connmark --mark 1                          -j MARK --set-mark 1
iptables -t nat -A PREROUTING           -m connmark --mark 2                          -j MARK --set-mark 2
iptables -t nat -A PREROUTING           -m state --state NEW -m connmark ! --mark 0   -j CONNMARK --save-mark

# ADD PORTS HERE!
iptables -t mangle -A PREROUTING -i $DEV2 -m state --state NEW -p tcp --dport  80 -j CONNMARK --set-mark 2
#iptables -t mangle -A PREROUTING -i $DEV2 -m state --state NEW -p tcp --dport 443 -j CONNMARK --set-mark 2

route del default
route add default gw $GW1 $DEV1

немного изменен по сравнению с найденным здесь.

Это не работает По умолчанию трафик направляется в мой беспроводной интернет, но не перенаправляет трафик с порта 80 на VPN. Единственная подсказка, которую я получаю, таинственная

RTNETLINK answers: File exists

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

Помогите? Я знаю немного о сетевых / брандмауэрах , но это далеко за пределы моих возможностей, и я , честно говоря, даже не знаю , что около трети этого сценария даже делает.

2 ответа2

1

Обычно вы можете привязать сетевое приложение к IP: порту в его файле .conf. Вы можете добавить разные IP-адреса к каждому интерфейсу на вашем ПК, а затем привязать каждое приложение к своему IP-адресу, например, у вас может быть почтовый сервер, связанный с IP 192.168.7.100 на плате NIC, и некоторые другие приложения, связанные с 192.168.7.101 в интерфейс tun0.

0

Тем не менее, любое приложение, которое использует сеть, привязано к интерфейсу /ip, не имеет значения, является ли это сетевым сервисом или графическим клиентским приложением, если вы можете установить интерфейс, который он будет использовать, то вы решили свою проблему, если нет, пакеты будут пройти через предопределенный интерфейс.

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