通过 SSH 隧道连接 OpenVPN

通过 SSH 隧道连接 OpenVPN

我目前正在中国旅游,因此我有一些 VPN 设置选项。但是,我的 VPN 服务器经常在我使用一段时间后突然从网络上消失。

我认为可以使用 SSH 隧道连接到另一台服务器,并通过该隧道连接 VPN,以防止检测到 VPN 流量。这样,流量可能只会被读取为与提供商的 SSH 连接。

因此,我像这样连接到服务器:

ssh peter@some-server -L 4444:vpn-server:1194 -N

然后将其添加到我的 openvpn 客户端配置中:

remote localhost 1194

遗憾的是,这不管用。连接通过了身份验证,但之后,我无法连接到 VPN 内部 ( ping 10.8.0.1) 或外部 ( ping 8.8.8.8)。这应该管用吗,还是我误解了什么?

我是否应该添加一些 iptables nat 规则?到目前为止,我添加的唯一 nat 规则是:

-A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE

答案1

通过 SSH 隧道设置 VPN 连接的简单方法行不通。第一个问题:您只将连接隧道连接到 VPN 服务器本身,这不允许所有其他流量通过 VPN 服务器路由超过连接ssh(从而混淆连接)。解决此问题的方法是使用动态 SOCKS[5] 代理并告诉 OpenVPN 通过该代理进行连接。将以下内容添加到您的 OpenVPN 配置文件中:

socks-proxy localhost 6886
socks-proxy-retry

然后,ssh使用动态 SOCKS 代理启动您的会话:

ssh -D 6886 -N REMOTE

然后你就可以启动 OpenVPN 连接了。不过,这仍然有一个问题,至少假设你想重定向所有流量通过 VPN(OpenVPN 指令redirect-gateway def1)。为此,您需要维护到 SOCKS 代理端点的路由,该路由不会被 OpenVPN 客户端添加的路由屏蔽。为此,请在 OpenVPN 配置中添加另一个指令,如下所示:

route REMOTE-IP 255.255.255.255 net_gateway default

可能能够在该指令中使用主机名 REMOTE,但您可能需要手动将其解析为 IP 地址。

这应该可以,至少对于 ipv4 流量来说是这样。快速谷歌搜索后,结果显示这篇博文它本质上做了同样的事情,对正在发生的事情有很好的描述,但在解决方案中似乎更复杂(使用连接脚本)

或者,您也可以考虑使用obfs4proxy(例如或者针对 ubuntu 进行打包

答案2

我可以通过 TCP 和外部 VPS 成功建立与 Raspberry Pi(使用 PiVPN)的连接。然后我做了以下事情:

允许在您的服务器 (VPS/VPN) 上公开转发。如果尚不存在,请更改GatewayPorts为或添加。yes

/etc/ssh/sshd_config:
GatewayPorts yes

更改proto udptcp(因为 ssh 使用 tcp 协议)

/etc/openvpn/server.conf:
proto tcp

再次更改proto udptcp-client

openvpn-client.ovpn:
proto tcp-client

现在启动 ssh 转发(0.0.0.0 表示允许所有 IPv4 连接;-N 表示不在服务器上启动 bash)

ssh -R 0.0.0.0:1194:localhost:1194 user@server -N

您还应检查您的 VPS/VPN 服务器是否允许连接并具有正确的防火墙设置。如果您使用 ufw 进行 iptables,只需执行以下操作:

ufw allow 1194/tcp
ufw enable

这可能不是最快的,但对我来说还是有用的。

答案3

SSH 隧道和 VPN 在中国可以正常工作,尽管速度慢得可以接受。降低加密设置不会提高速度。我认为从中国到世界任何地方的连接速度通常都会受到限制。

我的做法是启用端口转发的 SSH 隧道。然后通过该 SSH 隧道使用带有 SOCKS 代理的 OpenVPN。非默认端口号也可以使用。

无需防火墙或路由配置。对我来说非常完美。:)

答案4

你不需要运行其他 VPN通过ssh。您可以使用 ssh作为VPN。参见 ssh 的“-w X:Y”选项。

这是一个以 Linux 为中心的答案。假设有一台服务器,我们称之为“集线器”,ssh 隧道客户端连接到该服务器。它们将使用 172.17.2.0/24 作为 VPN“运营商”网络。某些主机是常见且众所周知的,我们为它们提供固定配置。其他主机也可以连接,但必须使用其他配置。

#!/bin/sh -e
#
# make-ssh-tunnel HITHER YON INTERFACE GW
#
# HITHER ...... this host's VPN address.
# YON ......... $GW's VPN address.
# INTERFACE ... number of the tun device, same at both ends.
# GW .......... server host.
#
# /etc/ssh/sshd_config on $GW must include:
#   PermitRootLogin yes
#   PermitTunnel yes
# and clients must be able to ssh to $GW as root.
#
# this creates a star topology with $GW at center,
# which is generally the .1 address in the VPN /24 net.
# others connect and route through $GW to reach
# the other members of the /24 net.
# ________________________________________________
#
# the setup.
#
if [ "$#" = 0 ] ; then
    # automatic, for specific, known, regularly-connected hosts.
    case "`hostname -s`" in
    ThisHost) HITHER=172.17.2.2 IFACE=12 ;;
    ThatHost) HITHER=172.17.2.3 IFACE=13 ;;
    Another)  HITHER=172.17.2.4 IFACE=14 ;;
    *)        echo who are you? ; exit 1 ;;
    esac
    YON=172.17.2.1
    GW=hub
    SUBNET=172.17.2.0
else
    # manual, for random, probably temporary connections.
    HITHER="${1:-172.17.2.5}"
    YON="${2:-172.17.2.1}"
    IFACE="${3:-15}"
    GW="${4:-hub}"
    SUBNET="${YON%.[0-9]*}".0
    #
    [ "$HITHER" = "$YON" ] && echo "${0##*/}": identical addresses not allowed && exit 1
fi
#
# the business.
#
set -x
# 1st: do it there.
ssh -f -T -w $IFACE:$IFACE root@$GW \
"ifconfig tun$IFACE $YON pointopoint $HITHER netmask 255.255.255.255
 ifconfig tun$IFACE
 route -n | grep tun$IFACE"
# 2nd: do it here.
 ifconfig tun$IFACE $HITHER pointopoint $YON netmask 255.255.255.255
 ifconfig tun$IFACE
 route add -net $SUBNET/24 gw $YON
 route -n | grep tun$IFACE
#
# the afterthought.
#
# to make the tunnel a default route replacement:
#
# route add -host $GW gw 192.168.0.1 # that is, your real.defa.ult.route
# ip route add   0.0.0.0/1 via $YON
# ip route add 128.0.0.0/1 via $YON
#
# 1st preserves real route to $GW, avoiding route loop.
# 2nd and 3rd override default route without replacing it.
#
# in addition, $GW must NAT on behalf of the VPN hosts.
# iptables -t nat -A POSTROUTING -s 172.17.2.0/24 -o eth0 -j SNAT --to-source 11.22.33.44
# where --to-source is $GW's real external address.
#
# Embellish to taste.

相关内容