强制某些应用程序使用 VPN

强制某些应用程序使用 VPN

几天来,我一直在尝试强制某些应用程序使用 VPN。到目前为止,我发现强制所有应用程序使用 VPN 或不强制任何应用程序使用 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

错误发生的点在脚本中被标记了。我不确定那是什么意思。我可以通过删除错误发生前不久的循环来防止这种情况发生,但如果我这样做,脚本就不会突然起作用。

需要帮助吗?我对网络/防火墙了解一点,但这是方式超出了我的能力,坦白说,我甚至不知道三分之一的剧本

答案1

通常,您可以在其 .conf 文件中将网络应用程序绑定到 IP:Port。您可以为 PC 中的每个接口添加不同的 IP,然后将每个应用程序与不同的 IP 绑定,例如,您可以将邮件服务器绑定到 NIC 卡中的 IP 192.168.7.100,将其他一些应用程序绑定到 tun0 接口中的 192.168.7.101。

答案2

任何使用网络的应用程序仍然绑定到接口/ip,不管它是网络服务还是图形客户端应用程序,如果您可以设置接口,它将使用您解决的问题,如果不能,数据包将通过预定的接口。

相关内容