我有 Ubuntu Server,我想过滤流量,只让特定用户或群组的流量通过 VPN 发送,其余流量通过标准互联网连接发送。我认为这应该很容易做到,但我在设置时遇到了很多麻烦。
我已经能够使用以下方法成功建立 VPN 连接:
openvpn --config '/etc/openvpn/Sweden.ovpn' --auth-user-pass '/etc/openvpn/pia.txt' --persist-key --persist-tun --tls-client --remote-cert-tls server --user vpn &
OpenVPN的配置文件包含以下内容:
client
dev tun
proto udp
remote sweden.privateinternetaccess.com 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
tls-client
remote-cert-tls server
auth-user-pass
comp-lzo
verb 1
reneg-sec 0
这将创建一个名为“tun0”的新接口。使用该接口效果很好:
curl -v --interface tun0 icanhazip.com
但是,当我尝试使用 eth0 接口时,连接将超时:
curl -v --interface eth0 icanhazip.com
如果我禁用 OpenVPN 连接,那么通过 eth0 进行的 curl 调用将正常工作。
一旦我能够使 eth0 和 tun0 都正常工作,我计划使用类似于此命令的命令通过 OpenVPN 隧道路由特定组:
iptables -A OUTPUT -m owner --gid-owner vpn \! -o tun0 -j REJECT
是否有人知道如何让 eth0 和 tun0 同时工作,以便我可以通过它路由特定用户/组的流量,而其他所有流量保持不变?
类似帖子: 如何通过 OpenVPN 路由特定流量?- 我的求解器中只有一张网卡,而该解决方案似乎使用了两张网卡。
答案1
你的卷曲-测试,我知道如何解决,并且你的方案存在一个问题,我可以提出解决方案。
卷曲这种方式不可能奏效:启动 VPN 后,该接口 (eth0) 上没有定义网关:eth0 NIC 有一个 IP 地址,可以访问您的 LAN,但没有网关可以访问互联网,尤其是 icanhazip.com。对于卷曲要以这种方式工作,你必须指示你的内核,到 216.69.252.101(icanhazip.com)的特定路由是通过eth0界面:
ip ro add 216.69.252.101 via your_home_routers_IP_address
现在卷曲通话将如您所愿进行。
如果您希望在 VPN 内部和外部进行稳定、完整的通信,正确的做法是通过基于策略的路由。您可以找到 David Schwartz 对该主题的精彩而简明的介绍在姐妹网站上,这里。您需要这个装置的原因是您正在设想一个具有两个不同网关的系统,除非有两个不同的路由表,否则这是不允许的。
现在,为了实现你的目标,IE,要根据用户身份沿不同路由路由数据包,您必须设置适当的规则来选择相关的路由表。因此,假设您现在有两个表,分别称为 vpn 和 novpn。您必须首先使用曼格尔表iptables根据用户身份对数据包进行标记,然后根据该标记的存在(或不存在)为基于策略的路由提供规则。
它可以像这样工作:
iptables -t mangle -I OUTPUT -m owner --uid-owner some-user -j MARK --set-mark 100
ip rule add fwmark 100 table vpn
对于要使用 VPN 的用户,以及
iptables -t mangle -I OUTPUT -m owner --uid-owner some-other-user -j MARK --set-mark 300
ip rule add fwmark 300 table novpn
对于那些想要在 VPN 之外路由的路由。此外,最好为还要别的吗即默认。希望这能有所帮助。