更好的解决方案

更好的解决方案

我在内联网上有一台 Linux 机器,我只能通过 SSH 访问它。这台机器需要使用 OpenConnect 连接到 VPN;但是当我这样做时,我会断开与 SSH 会话的连接,因为内联网的 IP 不再有效。

我可以使用分配给它的 IP 从 VPN 内部重新连接它,但每次连接 VPN 时该 IP 都会改变。我无法控制任何网络,只能控制这台机器。

有没有办法在连接到 VPN 时保持 SSH 连接处于活动状态?


openconnect需要一个--script参数,该参数使用脚本来配置路由。如果没有该参数,连接会成功,但不会解析任何名称,并且内联网的 IP 仍然有效。

我目前正在使用Ubuntu 的默认设置/etc/vpnc/vpnc 脚本。我擅长编写 shell 脚本,但对网络知之甚少。如果我必须修改它,我需要一些关于修改什么或如何修改它的参考。

答案1

有没有办法在连接到 VPN 时保持 SSH 连接处于活动状态?

不可以。当您连接到 VPN 时,该系统的路由会发生巨大变化,从而破坏所有已建立的 TCP 套接字。

您应该考虑使用终端多路复用器,例如屏幕或者tmux在您的 ssh 会话中 - 这样您就可以拥有一个可以重新连接的持久 shell。

答案2

一般答案

您应该使用--script--script-tun选项openconnect并提供风俗 vpnc 脚本。一个好的起点是vpnc-script已经随您分发的openconnect,例如在 OSX(HomeBrewed openconnect) 上它位于/usr/local/etc/vpnc-script

注意,根据openconnect官方文档:

OpenConnect只是处理与 VPN 服务器的通信;它才不是了解如何在运行网络的各种操作系统上配置网络路由和名称服务。

为了设置路由和名称服务,它使用通常称为 vpnc-script 的外部脚本。


更好的解决方案

已经有一个很好的项目叫做代理服务器它充当 的代理服务器openconnect,因此得名 ocproxy(C连接代理人)。

ocproxy 是基于 lwIP 的 OpenConnect 用户级 SOCKS 和端口转发代理。使用 ocproxy 时,OpenConnect 仅处理用户专门向代理请求的网络活动,因此 VPN 接口不再“劫持”主机上的所有网络流量。

OpenConnect 命令示例:

echo $1 | sudo openconnect -u $2 -d --timestamp -v --passwd-on-stdin --script-tun --script "ocproxy -D $3 -v" $4

代替:

  • $1使用:OpenConnect 密码
  • $2使用:OpenConnect 用户名
  • $3带有:所需的 Socks5 代理端口
  • $4与:OpenConnect 服务器地址

答案3

您可能需要查看 中的内容iptables,它处理内核中的数据包过滤。我openconnect从另一个方向使用,默认设置是删除对标准接口的访问,转而使用新创建的 VPN 接口。要做的第一件事是找出 VPN 连接正在创建哪些路由。然后,您可以编写一个脚本来处理网关和路由,最后刷新iptables并清除 VPN“链”( 中使用的术语iptables)。我有一个看起来像这样的脚本:

IPADDR=NN.NN.NN.N
DESIREDNET1=MM.MM.MM.MM
GATEWAY_LINE=$(netstat -rn | grep ${IPADDR})
GATEWAY=$(echo "$GATEWAY_LINE" | awk '{print $2}')
GATEWAY_DEV=gw
if [ "$GATEWAY" = "*" ]; then
    GATEWAY=$(echo "$GATEWAY_LINE" | awk '{print $8}')
    GATEWAY_DEV=''
fi
# add custom routes
route add -net $DESIREDNET1 netmask 255.255.0.0 dev cscotun0
...
# reset the default route
route del default
route add default $GATEWAY_DEV $GATEWAY

# flush iptables to clear the ciscovpn chain
iptables --flush
iptables --delete-chain
# Add out own nameservers back
if [ -f /etc/resolv.conf.vpnbackup ]
then
   cat /etc/resolf.conf /etc/resolv.conf.vpnbackup > /etc/resolv.conf
   echo "nameserver $GATEWAY" >> /etc/resolv.conf
fi

您需要在关闭 VPN 时将其复制到/etc/resolv.conf才能/etc/resolf.conf重新添加“正常”设置。

祝你好运。

答案4

解决此问题的一个方法是将涉及终端连接的两台机器连接到同一个 VPN 服务器。

这个对我有用。

相关内容