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

Я считаю, что правило iptables, которое необходимо изменить:

iptables -t mangle -A OUTPUT ! --dest $LOCALIP -m owner --uid-owner $VPNUSER -j MARK --set-mark 0x1

Я попробовал три варианта правила.

  1. Элемент списка

Первый добавил исключение для порта 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

0