linux – 连接到第三方VPN服务器但不使用它作为默认路由?

前端之家收集整理的这篇文章主要介绍了linux – 连接到第三方VPN服务器但不使用它作为默认路由?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想连接到 Linux中的第三方VPN服务器(例如Debian Jessie),但默认情况下仍然使用我的eth0 lan接口作为默认路由,并且很好奇如何实现这一点.我将使用策略路由或网络命名空间或规则集来选择何时使用第三方VPN.

但是我不清楚openvpn在幕后做了什么来建立它以引导所有流量通过它.要解决这个问题,从我的客户端连接时,它是否像覆盖“重定向网关”一样简单?

解决方法

这是一个使用控制组(cgroups)的完整解决方案,它允许每个进程的资源控制.网络控制组允许隔离VPN路由,轻松允许任何进程及其子进程在其中有选择地运行,允许非root用户被授予访问cgroup内正在运行的进程的权限,并且使用dnsmasq的第二个实例可以隔离DNS查询也是如此.这假设你有安装了cgroup支持的iptables的openvpn,dnsmasq,cgroup和1.6版本.这一切都是在Debian Jessie上完成的

第一步是创建cgroup并相应地设置iptables.这应该在每次重新启动时完成,因此我将以下内容放在/etc/rc.local中

# enable ip forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward

# create cgroup for 3rd party VPN (can change 'vpn' to your name of choice)
mkdir -p /sys/fs/cgroup/net_cls/vpn

# give it an arbitrary id 
echo 11 > /sys/fs/cgroup/net_cls/vpn/net_cls.classid

# grant a non-root user access (change user:group accordingly)
cgcreate -t user:group -a user:group -g net_cls:vpn

# mangle packets in cgroup with a mark
iptables -t mangle -A OUTPUT -m croup --cgroup 11 -j MARK --set-mark 11

# NAT packets in cgroup through VPN tun interface
iptables -t nat -A POSTROUTING -m cgroup --cgroup 11 -o tun0 -j MASQUERADE

# redirect DNS queries to port of second instance,more on this later
iptables -t nat -A OUTPUT -m cgroup --cgroup 11 -p tcp --dport 53 -j REDIRECT --to-ports 5354
iptables -t nat -A OUTPUT -m cgroup --cgroup 11 -p udp --dport 53 -j REDIRECT --to-ports 5354

# create separate routing table
ip rule add fwmark 11 table vpn

# add fallback route that blocks traffic,should the VPN go down
ip route add blackhole default metric 2 table vpn

# disable reverse path filtering for all interfaces
for i in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 0 > $i; done

下一步是编辑第三方VPN的客户端配置文件,例如/etc/openvpn/client.conf.保持配置的其余部分不变.

# redirect-gateway def1  <--- comment or remove the redirect-gateway line if it exists

# disable automatically configuring routes and run our own routeup.sh script instead
route-noexec
route-up /etc/openvpn/routeup.sh

# run our own update-dnsmasq-conf script on interface up/down; comment out existing up/down lines
up /etc/openvpn/update-dnsmasq-conf
down /etc/openvpn/update-dnsmasq-conf

我们现在需要创建/etc/openvpn/routeup.sh脚本

#!/bin/bash
# add default route through vpn gateway to our separate routing table
/sbin/ip route add default via $route_vpn_gateway dev $dev metric 1 table vpn
exit 0

我们现在需要创建一个update-resolv-conf的修改版本,它通常安装在/ etc / openvpn中,以创建dnsmasq的第二个实例.我称之为/ etc / openvpn / update-dnsmasq-conf

#!/bin/bash

[ "$script_type" ] || exit 0

split_into_parts()
{
    part1="$1"
    part2="$2"
    part3="$3"
}

case "$script_type" in
  up)
    NMSRVRS=""
    for optionvarname in ${!foreign_option_*} ; do
        option="${!optionvarname}"
        split_into_parts $option
        if [ "$part1" = "dhcp-option" ] ; then
            if [ "$part2" = "DNS" ] ; then
                NMSRVRS="${NMSRVRS:+$NMSRVRS }--server $part3"
            fi
        fi
    done
    dnsmasq $NMSRVRS --no-hosts --no-resolv --listen-address=127.0.0.1 \
        --port=5354 --bind-interfaces --no-dhcp-interface=* \
        --pid-file=/var/run/dnsmasq/dnsmasq2.pid
    ;;
  down)
    kill -9 $(cat /var/run/dnsmasq/dnsmasq2.pid)
    ;;
esac

这应该是它.现在,您可以启动vpn连接并通过该接口选择性地运行进程(–sticky选项可确保子进程在同一cgroup中运行).

cgexec -g net_cls:vpn --sticky chromium &

注意:对于dnsmasq,请确保/etc/resolv.conf指向localhost(nameserver 127.0.0.1).您的主dnsmasq实例将处理您的普通非VPN路由上的查询并使用(/var/run/dnsmasq/resolv.conf),它通常由您的默认网关或某些公共DNS(例如Google的8.8.8.8)组成.第二个实例仅由隔离的cgroup使用

猜你在找的Linux相关文章