Я установил конфигурацию раздельного туннеля на моей машине с Linux, которая пропускает весь трафик, выполняемый из учетной записи vpnsandbox
через VPN. Я использую процедуру, найденную здесь. Я хотел бы позволить определенным портам обходить VPN.
Я считаю, что правило iptables, которое необходимо изменить:
iptables -t mangle -A OUTPUT ! --dest $LOCALIP -m owner --uid-owner $VPNUSER -j MARK --set-mark 0x1
Я попробовал три варианта правила.
- Элемент списка
Первый добавил исключение для порта 4000, но он полностью разрушил разделенный туннель. Вторая попытка состояла в том, чтобы создать правило сопоставления только для порта 4000 и поместить его перед указанным выше правилом искажения, но я, возможно, ошибся.
1) iptables -t mangle -A OUTPUT ! --dest $LOCALIP ! --dport 4000 -m owner --uid-owner $VPNUSER -j MARK --set-mark 0x1
2) iptables -t mangle -A OUTPUT -m owner --uid-owner $VPNUSER --dport 4000 -j ACCEPT
3) iptables -t mangle -A OUTPUT ! --dest $LOCALIP -m owner --uid-owner $VPNUSER --sport 58846 -j MARK --set-mark 0x0
В идеале решение будет одно, что я могу повторить для других портов по мере необходимости.
(Я уже подтвердил, что входящее соединение работает. Это просто исходящие, это проблема.)
Полные правила iptables:
#! /bin/bash
# Niftiest Software – www.niftiestsoftware.com
# Modified version by HTPC Guides – www.htpcguides.com
export INTERFACE="tun0"
export VPNUSER="vpnsandbox"
export LOCALIP="999.999.999.999"
export NETIF="eth0"
# flushes all the iptables rules, if you have other rules to use then add them into the script
iptables -F -t nat
iptables -F -t mangle
iptables -F -t filter
#> Add my rules
iptables -A INPUT -i $NETIF -p tcp -m tcp --dport 22 -j ACCEPT
iptables -A INPUT -i $NETIF -p tcp -m tcp --dport 4000 -j ACCEPT
iptables -A INPUT -i $NETIF -p icmp -j ACCEPT
iptables -A INPUT -i $NETIF -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
# mark packets from $VPNUSER
iptables -t mangle -A OUTPUT -j CONNMARK --restore-mark
iptables -t mangle -A OUTPUT ! --dest $LOCALIP -m owner --uid-owner $VPNUSER -j MARK --set-mark 0x1
iptables -t mangle -A OUTPUT --dest $LOCALIP -p udp --dport 53 -m owner --uid-owner $VPNUSER -j MARK --set-mark 0x1
iptables -t mangle -A OUTPUT --dest $LOCALIP -p tcp --dport 53 -m owner --uid-owner $VPNUSER -j MARK --set-mark 0x1
iptables -t mangle -A OUTPUT ! --src $LOCALIP -j MARK --set-mark 0x1
iptables -t mangle -A OUTPUT -j CONNMARK --save-mark
# allow responses
iptables -A INPUT -i $INTERFACE -m conntrack --ctstate ESTABLISHED -j ACCEPT
# block everything incoming on $INTERFACE to prevent accidental exposing of ports
iptables -A INPUT -i $INTERFACE -j REJECT
# let $VPNUSER access lo and $INTERFACE
iptables -A OUTPUT -o lo -m owner --uid-owner $VPNUSER -j ACCEPT
iptables -A OUTPUT -o $INTERFACE -m owner --uid-owner $VPNUSER -j ACCEPT
# all packets on $INTERFACE needs to be masqueraded
iptables -t nat -A POSTROUTING -o $INTERFACE -j MASQUERADE
# reject connections from predator IP going over $NETIF
iptables -A OUTPUT ! --src $LOCALIP -o $NETIF -j REJECT
# Start routing script
/etc/openvpn/routing.sh
exit 0