我有Ubuntu Server,我想过滤流量,并且只有特定的用户或组流量通过VPN发送,其余流量通过标准Internet连接发送。我认为这很容易做到,但是在设置时遇到了很多麻烦。
我已经能够使用以下方法成功建立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路由特定流量?-我的求解器中只有一个网卡,该解决方案似乎使用了两个网卡。
我知道如何解决您的curl -test问题,以及您的整个方案都有问题,我可以建议一个解决方案。
curl可能无法通过这种方式工作:启动VPN后,在该接口(eth0)上未定义网关:eth0 NIC具有IP地址,可以访问您的LAN,但是没有网关,Internet和icanhazip尤其可以访问.com。为了使curl以这种方式工作,您将必须指示内核到216.96.152.101(icanhazip.com)的特定路由是通过eth0接口进行的:
ip ro add 216.69.252.101 via your_home_routers_IP_address
现在,curl调用将按您希望的方式工作。
如果您想通过VPN与其外部进行稳定,完整的通信,正确的进行方法是通过基于策略的路由来安装第二个路由表。您可以在姊妹站点上找到David Schwartz对该主题的简洁明了的介绍。之所以需要这种方式,是因为您正在设想一个具有两个不同网关的系统,除非有两个不同的路由表,否则不允许使用这些网关。
现在,为了实现您的目标,即根据用户身份沿着不同的路由对数据包进行路由,您将必须设置适当的规则来选择相关的路由表。因此,让我们假设您现在有两个表,分别称为vpn和novpn。您将必须首先使用iptables的mangle表根据用户身份对数据包进行标记,然后根据所述标记的存在(或不存在)为基于策略的路由提供规则。
它可以像这样工作:
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外部进行路由的用户。另外,总是最好为其他任何内容(例如,默认值)设置路由表。希望这可以帮助。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句