我有一个Linux机器,通过一个openVPN连接路由其整个互联网stream量。 它被明确configuration为以这种方式工作。
但是,机器有几个应用程序不应该使用VPN连接(tun +)并通过打开的连接(eth0)。
由于它不是基于目标IP的路由,我的第一个尝试是创build一个本地socks5代理,应用程序应该使用这个代理来避开openVPN通道。 但是,我试图用ssh -D或其他的sw来做这件事)已经失败了(可能是我的错),现在我想知道是否有一个不同的更好的解决scheme。
我最近发布了另一个解决这个特定情况的答案 ,但问题并不重复,因为这个问题更具体到OpenVPN。 正如有些人喜欢用回答的方式来回答问题而不是直接回答问题,我在这里复制/粘贴。
我有这样的努力,所以这里是一个完整的解决scheme。 它可以在Ubuntu 15上运行。您可以特别使用OpenVPN来在VPN通道接口之外路由某些应用程序。
首先,安装cgroup支持和工具:
sudo apt-get install cgroup-lite cgmanager cgroup-tools
重启。
你需要iptables 1.6 .0+。 获取iptables 1.6.0的发布源 ,解压缩,然后从iptables源代码运行( --disable-nftables标志将避免错误)源代码:
sudo apt-get install dh-autoreconf bison flex ./configure --prefix=/usr \ --sbindir=/sbin \ --disable-nftables \ --enable-libipq \ --with-xtlibdir=/lib/xtables make sudo make install iptables --version
现在,真正的configuration。 定义一个名为novpn的控制组。 此cgroup中的进程将具有0x00110011 (11:11)的类0x00110011 。
sudo su mkdir /sys/fs/cgroup/net_cls/novpn cd /sys/fs/cgroup/net_cls/novpn echo 0x00110011 > net_cls.classid
现在,我们假设您要为特定应用使用的接口是eth0 ,网关IP为10.0.0.1 。 取而代之的是你真正想要的(从ip route获取信息)。 以root用户身份运行:
# Add mark 11 on packets of classid 0x00110011 iptables -t mangle -A OUTPUT -m cgroup --cgroup 0x00110011 -j MARK --set-mark 11 # Force the packets to exit through eth0 with NAT iptables -t nat -A POSTROUTING -m cgroup --cgroup 0x00110011 -o eth0 -j MASQUERADE # Define a new "novpn" routing table # DO THIS JUST ONCE ! echo 11 novpn >> /etc/iproute2/rt_tables # Packets with mark 11 will use novpn ip rule add fwmark 11 table novpn # Novpn has a default gateway to the interface you want to use ip route add default via 10.0.0.1 table novpn # Unset reverse path filtering for all interfaces, or at least for "eth0" and "all" for i in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 0 > $i; done
最后,在特定的界面上运行你的应用程序:
exit sudo cgcreate -t $USER:$USER -a $USER:$USER -g net_cls:novpn cgexec -g net_cls:novpn traceroute www.google.com cgexec -g net_cls:novpn firefox
或者如果你想把一个已经运行的进程移动到cgroup,那么… 你不能! 这似乎是由于NAT(伪装)function: iptables -nvL -t nat在cgroup切换时不匹配,但iptables -nvL -t mangle确实匹配。
# Get PID of the process (we'll then suppose it's 1234) pidof firefox # Add to cgroup - THIS DOESN'T WORK! Silently fails to produce the final result. sudo echo 1234 > /sys/fs/cgroup/net_cls/novpn/tasks # Remove - but this works... sudo echo 1234 > /sys/fs/cgroup/net_cls
积分:没有答案按预期工作,但他们混合使用:chripell回答evolware文章每个进程路由采取2:使用cgroups,iptables和策略路由 , 如何使一个特定的进程不通过OpenVPN连接? , 在iptables的基础上为OpenVPN切换开关