В течение нескольких дней я пытался заставить 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
Точка, в которой это происходит, отмечена в сценарии. Я не уверен, что это значит. Я могу предотвратить это, удалив цикл незадолго до появления ошибки, но сценарий неожиданно не сработает, если я это сделаю.
Помогите? Я знаю немного о сетевых / брандмауэрах , но это далеко за пределы моих возможностей, и я , честно говоря, даже не знаю , что около трети этого сценария даже делает.