Eu configurei uma configuração de túnel dividido em minha máquina Linux que transmite todo o tráfego executado da conta vpnsandbox
por meio de uma VPN. Estou usando o procedimento encontrado aqui . Gostaria de permitir que determinadas portas ignorem a VPN.
Eu acredito que a regra do iptables que precisa ser alterada é:
iptables -t mangle -A OUTPUT ! --dest $LOCALIP -m owner --uid-owner $VPNUSER -j MARK --set-mark 0x1
Eu tentei três variantes na regra.
O primeiro adicionou uma exclusão para a porta 4000, mas derrubou completamente o túnel dividido. A segunda tentativa foi criar uma regra de correspondência apenas para a porta 4000 e colocá-la antes da regra de mangle acima, mas posso ter errado.
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
Idealmente, a solução será uma que eu possa repetir para outras portas, conforme necessário.
(Eu já confirmei que a conexão de entrada funciona. É apenas a saída que é o problema.)
Regras completas do 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