几天来,我一直在尝试强制某些应用程序使用 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,不管它是网络服务还是图形客户端应用程序,如果您可以设置接口,它将使用您解决的问题,如果不能,数据包将通过预定的接口。