想要在工作中使用Linux,但不使用公司VPN? 然后这篇文章可能会有所帮助,尽管这并不准确。 我想提前警告我,我对网络管理的问题了解不多,所以我做错了所有事情。 另一方面,我可能会以普通人容易理解的方式编写该手册,因此建议您尝试一下。
这篇文章有很多其他信息,但是如果没有这些知识,我将无法解决vpn设置突然带来的问题。 我认为任何尝试应用本手册的人都会遇到我没有的问题,我希望这些额外的信息将有助于我自己解决这些问题。
手册中使用的大多数命令都需要通过sudo运行,为了简洁起见,将其删除。 请记住。
大多数IP地址都被严重混淆,因此,如果您看到435.435.435.435之类的地址,则应针对您的情况指定一些常规IP。
我有Ubuntu 18.04,但我认为只要稍作更改,该指南就可以应用于其他发行版。 但是,在本文中,Linux == Ubuntu。
思科连接
那些坐在Windows或MacOS上的用户可以通过Cisco Connect连接到我们的公司VPN,Cisco Connect需要指定网关地址并在每次连接时输入密码,该密码由固定部分和Google Authenticator生成的代码组成。
对于Linux,无法获得Cisco Connect,但谷歌的建议是使用openconnect的建议,该建议专门取代了Cisco Connect。
开放连接
从理论上讲,在Ubuntu中,有一个特殊的用于openconnect的图形界面,但是它对我不起作用。 也许是最好的。
在ubunt中,openconnect是从软件包管理器安装的。
apt install openconnect
安装后,您可以立即尝试连接到VPN
openconnect --user poxvuibr vpn.evilcorp.com
vpn.evilcorp.com是虚拟VPN地址\
poxvuibr-虚拟用户名
openconnect会要求您输入一个密码,我记得该密码由固定的部分和来自Google Authenticator的代码组成,然后尝试连接到vpn。 事实证明,恭喜您,您可以安全地跳过中间部分,这很痛苦,并且可以在后台进行关于openconnect的讨论。 如果不起作用,则可以继续。 尽管例如在工作时通过访客Wi-Fi进行连接时,虽然可能会很高兴,但是您应该尝试从家里重复此过程。
证明书
很有可能什么也不会开始,而openconnect的废气看起来像这样:
POST https://vpn.evilcorp.com/ Connected to 777.777.777.777:443 SSL negotiation with vpn.evilcorp.com Server certificate verify failed: signer not found Certificate from VPN server "vpn.evilcorp.com" failed verification. Reason: signer not found To trust this server in future, perhaps add this to your command line: --servercert sha256:4444444444444444444444444444444444444444444444444444444444444444 Enter 'yes' to accept, 'no' to abort; anything else to view: fgets (stdin): Operation now in progress
一方面,这是令人不快的,因为没有与VPN的连接,但是另一方面,如何解决此问题在原则上是可以理解的。
然后,服务器向我们发送了一个证书,根据该证书可以确定与本地公司的服务器建立了连接,而不是与恶意欺诈者建立了连接,并且该证书对于系统而言是未知的。 因此,她无法检查真实服务器是否存在。 因此,以防万一,它停止工作。
为了使openconnect仍能连接到服务器,您需要使用--servercert密钥明确告诉它哪个证书应该来自VPN服务器。
您可以从打印的openconnect中找出服务器直接发送给我们的证书。 从这块:
To trust this server in future, perhaps add this to your command line: --servercert sha256:4444444444444444444444444444444444444444444444444444444444444444 Enter 'yes' to accept, 'no' to abort; anything else to view: fgets (stdin): Operation now in progress
使用此命令,您可以尝试再次连接
openconnect --servercert sha256:4444444444444444444444444444444444444444444444444444444444444444 --user poxvuibr vpn.evilcorp.com
也许它现在正在工作,然后您就可以结束了。 但是Ubunta亲自给我看了这种形式的无花果
POST https://vpn.evilcorp.com/ Connected to 777.777.777.777:443 SSL negotiation with vpn.evilcorp.com Server certificate verify failed: signer not found Connected to HTTPS on vpn.evilcorp.com XML POST enabled Please enter your username and password. POST https://vpn.evilcorp.com/ Got CONNECT response: HTTP/1.1 200 OK CSTP connected. DPD 300, Keepalive 30 Set up DTLS failed; using SSL instead Connected as 192.168.333.222, using SSL NOSSSSSHHHHHHHDDDDD 3 NOSSSSSHHHHHHHDDDDD 3 RTNETLINK answers: File exists /etc/resolvconf/update.d/libc: Warning: /etc/resolv.conf is not a symbolic link to /run/resolvconf/resolv.conf
/etc/resolv.conf
# Generated by NetworkManager search gst.evilcorpguest.com nameserver 127.0.0.53
/run/resolvconf/resolv.conf
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8) # DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN # 127.0.0.53 is the systemd-resolved stub resolver. # run "systemd-resolve --status" to see details about the actual nameservers. nameserver 192.168.430.534 nameserver 127.0.0.53 search evilcorp.com gst.publicevilcorp.com
habr.com将被解决,但无法在该处输入。 诸如jira.evilcorp.com之类的地址根本无法解析。
对我来说,这里发生的事情还不清楚。 但是实验表明,如果将行添加到/etc/resolv.conf
nameserver 192.168.430.534
那么VPN内的地址将神奇地解析,并且可以绕过它们,即查找要解析的DNS地址,查找在/etc/resolv.conf中,而不是其他位置。
确保已连接到VPN,并且可以正常工作,您可以确保/etc/resolv.conf中没有任何更改,为此,足以在浏览器中输入不是来自vpn的资源的符号名称,而是来自IP地址的IP地址
结果是两个问题
- 连接到VPN时,其dns没有被拾取
- 所有流量都通过vpn进行,这不允许您访问Internet
现在,我将告诉您我要做什么,但首先要有点自动化。
自动输入密码的固定部分
到目前为止,您很可能已经输入了至少五次密码,并且此过程已经使您非常疲倦。 首先,因为密码太长,其次,因为输入密码时,您需要保持固定的时间段
最终的解决方案未包含在本文中,但可以这样做,因此不必多次输入密码的固定部分。
假设密码的固定部分是fixedPassword,部分是Google Authenticator 567987。可以使用参数--passwd-on-stdin通过标准输入传递openconnect的整个密码。
echo "fixedPassword567987" | openconnect --servercert sha256:4444444444444444444444444444444444444444444444444444444444444444 --user poxvuibr vpn.evilcorp.com --passwd-on-stdin
现在,您可以不断返回上一个输入的命令,并在那里仅更改Google Authenticator的一部分。
企业VPN不允许Internet访问。
通常,要访问集线器时必须使用单独的计算机并不是很不方便。 缺乏使用stackoverfow复制和粘贴的能力通常会使工作瘫痪,因此需要做一些事情。
必须以某种方式进行组织,以便当您需要从内部网络访问资源时,Linux可以访问vpn,而当您需要访问集线器时,可以访问Internet。
在启动并建立与vpn的连接之后,openconnect执行一个特殊的脚本,该脚本位于/ usr / share / vpnc-scripts / vpnc-script中。 一些变量被传输到输入脚本,并且它执行vpn配置。 不幸的是,我无法弄清楚如何使用本机脚本在公司VPN和Internet的其余部分之间分配流量。
显然,vpn-slice实用程序是专门为像我这样的人而开发的,它使您可以通过两个渠道指挥交通,而无需铃鼓跳舞。 好吧,那就是你必须跳舞,但是巫师不是必需的。
使用VPN切片拆分流量
首先,必须安装vpn-slice,您必须自己弄清楚。 如果评论中有问题,我将为此撰写另一篇文章。 但这是一个常规的python程序,因此应该没有困难。 我使用virtualenv进行设置。
然后,您需要使用实用程序,使用--script键指示openconnect,而不是标准脚本,您需要使用vpn-slice
echo "fixedPassword567987" | openconnect --servercert sha256:4444444444444444444444444444444444444444444444444444444444444444 --user poxvuibr --passwd-on-stdin \ --script "./bin/vpn-slice 192.168.430.0/24 " vpn.evilcorp.com
在--script中,随行传递了需要调用的命令,而不是脚本。 ./bin/vpn-slice-vpn-slice可执行文件192.168.430.0/24的路径-vpn中要访问的地址的掩码。 在这里,我的意思是,如果地址以192.168.430开头,则必须在vpn内搜索具有该地址的资源
现在情况应该几乎是正常的。 差不多了 现在,您可以登录到集线器,并且可以通过ip登录到内部公司资源,但是不能通过符号名称登录到内部公司资源。 如果您在主机中注册符号名称和地址的对应关系,则所有内容均应正常工作。 一直工作到ip更改。 Linux现在可以访问Internet或公司网络,具体取决于ip。 但是非公司DNS仍用于确定地址。
问题仍然可以通过这种形式表现出来-一切正常,在工作中,在家中只能通过ip访问内部公司资源。 这是因为当您连接到公司Wi-Fi时,也会使用公司DNS,并且其中解析来自VPN的符号地址,尽管不使用VPN仍无法访问该地址。
自动修改主机文件
如果您礼貌地询问vpn-slice,则在启动VPN之后,它可以转到其DNS,通过其符号名称在其中找到必要资源的IP地址,并将其输入主机。 关闭VPN后,这些地址将从主机中删除。 为此,请将符号名称传递给vpn-slice作为参数。 你去。
echo "fixedPassword567987" | openconnect --servercert sha256:4444444444444444444444444444444444444444444444444444444444444444 --user poxvuibr --passwd-on-stdin --script "./bin/vpn-slice 192.168.430.0/24 jira.vpn.evilcorp.com git.vpn.evilcorp.com " vpn.evilcorp.com
现在,一切都应该在办公室和海滩上工作。
在VPN提供的DNS中搜索所有子域的地址
如果网络中的地址很少,则自动修改主机文件的方法非常有效。 但是,如果网络上有很多资源,那么您将不断需要在脚本zoidberg中添加诸如zoidberg.test.evilcorp.com之类的行,这是测试台之一的名称。
但是,现在我们对为什么可以消除这种需求有了一点了解。
如果在启动VPN后查看/ etc / hosts,您可以看到,这是一行
192.168.430.534 dns0.tun0#vpn-slice-tun0已自动创建
是的,并且在resolv.conf中添加了新行。 简而言之,vpn-slice以某种方式确定了用于vpn的dns服务器的位置。
现在,我们需要确保为了找到以evilcorp.com结尾的域名的IP地址,Linux使用了公司DNS,如果需要其他设置,则使用默认值。
我搜索了很长时间,发现该功能开箱即用。 这是指使用本地dns dnsmasq服务器解析名称的能力。
也就是说,您可以使Linux始终转到本地dns服务器以获取ip地址,而IP地址又将根据域名在相应的外部dns服务器上寻找ip。
为了管理与网络和网络连接有关的所有事情,Ubunt使用NetworkManager,而用于选择例如Wi-Fi连接的图形界面只是它的前面。
我们将需要提高其配置。
- 在/etc/NetworkManager/dnsmasq.d/evilcorp中创建文件
地址= /。evilcorp.com/192.168.430.534
注意邪恶公司之前的观点。 它向dnsmasq发出信号,表明必须在公司dns中搜索所有evilcorp.com子域。
- 告诉NetworkManager使用dnsmasq解析名称
网络管理器配置位于/etc/NetworkManager/NetworkManager.conf中,您需要在此处添加:
[主要]
dns = dnsmasq
- 重新启动NetworkManager
service network-manager restart
现在,在使用一堆openconnect和vpn-slice连接到VPN之后,即使您没有将符号地址添加到vpnslice的参数中,也可以正常检测到ip。
如何通过VPN分离服务
事实证明要连接到vpn之后,我很开心了两天,然后发现,如果不从办公室网络连接到VPN,邮件将无法工作。 是一个熟悉的症状,不是吗?
我们的邮件在mail.publicevilcorp.com中,这意味着它不属于dnsmasq的规则,并且邮件服务器的地址是通过公共DNS搜索的。
嗯,办公室仍然使用该地址所在的DNS。 也就是说,我是这么认为的。 实际上,在向dnsmasq添加一行之后
地址= / mail.publicevilcorp.com / 192.168.430.534
情况没有改变。 ip保持不变。 我必须去上班。
直到那时,当我深入研究情况并稍微解决问题时,一个聪明的人告诉我如何解决。 不仅要这样,而且要通过vpn连接到邮件服务器
我使用vpn-slice通过VPN到达以192.168.430开头的地址。 在邮件服务器上,不仅符号地址不是evilcorp的子域,而且它的IP地址也不以192.168.430开头。 当然,他不会让任何人退出通用网络。
为了使Linux通过VPN并到达邮件服务器,您需要将其添加到vpn-slice。 假设邮件地址是555.555.555.555
echo "fixedPassword567987" | openconnect --servercert sha256:4444444444444444444444444444444444444444444444444444444444444444 --user poxvuibr --passwd-on-stdin --script "./bin/vpn-slice 555.555.555.555 192.168.430.0/24" vpn.evilcorp.com
用一个参数引发VPN的脚本
当然,这不是很方便。 是的,您可以将文本保存到文件中,然后将其复制粘贴到控制台,而无需用手打字,但这仍然不够令人满意。 为了简化此过程,可以将命令包装在PATH中的脚本中。 然后,您只需要输入从Google Authenticator获得的代码
#!/bin/sh echo "fixedPassword$1" | openconnect --servercert sha256:4444444444444444444444444444444444444444444444444444444444444444 --user poxvuibr --passwd-on-stdin \ --script "./bin/vpn-slice 192.168.430.0/24 jira.vpn.evilcorp.com git.vpn.evilcorp.com " vpn.evilcorp.com
如果将脚本放入connect〜evilcorp〜,则可以在控制台中编写
connect_evil_corp 567987
但是现在无论如何,由于某种原因,您必须保持运行openconnect的控制台处于打开状态
Openconnect在后台启动
幸运的是,openconnect的作者照顾了我们,并在程序中添加了一个特殊的键--background,这使程序在启动后在后台运行。 如果以这种方式运行,则启动后可以关闭控制台
#!/bin/sh echo "fixedPassword$1" | openconnect --servercert sha256:4444444444444444444444444444444444444444444444444444444444444444 \ --user poxvuibr \ --passwd-on-stdin \ --background \ --script "./bin/vpn-slice 192.168.430.0/24 jira.vpn.evilcorp.com git.vpn.evilcorp.com " vpn.evilcorp.com
现在还不清楚日志的去向。 通常我们实际上并不需要日志,但是您永远不会知道。 openconnect可以将它们重定向到syslog,在其中它们将保持不变。 您需要在命令中添加--syslog键
#!/bin/sh echo "fixedPassword$1" | openconnect --servercert sha256:4444444444444444444444444444444444444444444444444444444444444444 \ --user poxvuibr \ --passwd-on-stdin \ --background \ --syslog \ --script "./bin/vpn-slice 192.168.430.0/24 jira.vpn.evilcorp.com git.vpn.evilcorp.com " vpn.evilcorp.com \
因此,事实证明openconnect在后台某个地方工作,不会打扰任何人,但是如何停止它尚不清楚。 就是说,您当然可以使用grep过滤掉ps排放,并寻找名称为openconnect的进程,但这有点沉闷。 感谢考虑了这一点的作者。 Openconnect具有--pid-file密钥,您可以使用它指示Openconnect将其进程ID写入文件。
#!/bin/sh echo "fixedPassword$1" | openconnect --servercert sha256:4444444444444444444444444444444444444444444444444444444444444444 \ --user poxvuibr \ --passwd-on-stdin \ --background \ --syslog \ --script "./bin/vpn-slice 192.168.430.0/24 jira.vpn.evilcorp.com git.vpn.evilcorp.com " vpn.evilcorp.com \ --pid-file ~/vpn-pid
现在,您始终可以使用以下命令确定流程
kill $(cat ~/vpn-pid)
如果没有任何过程,则kill会发誓,但不会引发错误。 如果没有文件,那么也不会发生任何问题,因此您可以在脚本的第一行中安全地终止该进程。
kill $(cat ~/vpn-pid) #!/bin/sh echo "fixedPassword$1" | openconnect --servercert sha256:4444444444444444444444444444444444444444444444444444444444444444 \ --user poxvuibr \ --passwd-on-stdin \ --background \ --syslog \ --script "./bin/vpn-slice 192.168.430.0/24 jira.vpn.evilcorp.com git.vpn.evilcorp.com " vpn.evilcorp.com \ --pid-file ~/vpn-pid
现在,您可以打开计算机,打开控制台并运行命令,并从Google Authenticator传递代码。 然后可以将控制台钉牢。
没有vpn-slice。 而不是后记
要了解没有vpn-slice的生活是非常困难的。 我必须阅读很多和谷歌。 幸运的是,当我花了很多时间解决问题时,技术手册甚至是man openconnect都读起来就像是激动人心的小说。
结果,我发现vpn-slice像本机脚本一样,将路由表修改为单独的网络。
路由表
简而言之,该表的第一列包含Linux要转到的地址应从何处开始,以及第二个网络适配器通过该地址到达该地址的表。 实际上,还有更多的列,但这并没有改变本质。
为了查看路由表,您需要运行ip route命令
default via 192.168.1.1 dev wlp3s0 proto dhcp metric 600 192.168.430.0/24 dev tun0 scope link 192.168.1.0/24 dev wlp3s0 proto kernel scope link src 192.168.1.534 metric 600 192.168.430.534 dev tun0 scope link
在这里,每一行负责将消息发送到某个地址的路径。 第一个是地址应从何处开始的描述。 为了了解如何确定192.168.0.0/16意味着地址必须以192.168开头,您需要在google上查询IP地址的掩码。 在dev之后是应该向其发送消息的适配器的名称。
对于VPN,Linux制作了一个虚拟适配器-tun0。 对于以192.168开头的所有地址的通信量,该行会回答
192.168.0.0/16 dev tun0 scope link
您还可以使用route -n命令查看路由表的当前状态(ip地址是匿名的),此命令产生的结果格式不同,通常不建议使用,但是它的累赘经常出现在在线手册中,您需要能够阅读它。
可以从“目标”和“ Genmask”列的组合中了解路由的IP地址应从何处开始。 ip地址中在Genmask中数字255所对应的那些部分都被考虑在内,而0则不是。 也就是说,目标192.168.0.0和Genmask 255.255.255.0的组合意味着,如果地址以192.168.0开头,则向该地址的请求将沿着此路由进行。 如果Destination为192.168.0.0但Genmask为255.255.0.0,则对以192.168开头的地址的请求将遵循此路由
为了弄清楚vpn-slice的实际作用,我决定先看一下表的状态
在打开VPN之前,就像这样
route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 222.222.222.1 0.0.0.0 UG 600 0 0 wlp3s0 222.222.222.0 0.0.0.0 255.255.255.0 U 600 0 0 wlp3s0 333.333.333.333 222.222.222.1 255.255.255.255 UGH 0 0 0 wlp3s0
在不使用vpn-slice的情况下调用openconnect之后,它变得如此
route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 0.0.0.0 0.0.0.0 U 0 0 0 tun0 0.0.0.0 222.222.222.1 0.0.0.0 UG 600 0 0 wlp3s0 222.222.222.0 0.0.0.0 255.255.255.0 U 600 0 0 wlp3s0 333.333.333.333 222.222.222.1 255.255.255.255 UGH 0 0 0 wlp3s0 192.168.430.0 0.0.0.0 255.255.255.0 U 0 0 0 tun0 192.168.430.534 0.0.0.0 255.255.255.255 UH 0 0 0 tun0
在像这样将vpn-slice组合在一起调用openconnect之后
Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 222.222.222.1 0.0.0.0 UG 600 0 0 wlp3s0 222.222.222.0 0.0.0.0 255.255.255.0 U 600 0 0 wlp3s0 333.333.333.333 222.222.222.1 255.255.255.255 UGH 0 0 0 wlp3s0 192.168.430.0 0.0.0.0 255.255.255.0 U 0 0 0 tun0 192.168.430.534 0.0.0.0 255.255.255.255 UH 0 0 0 tun0
可以看出,如果不使用vpn-slice,则openconnect会明确地写出,除非另外说明,否则必须通过vpn到达所有地址。
在这里:
0.0.0.0 0.0.0.0 0.0.0.0 U 0 0 0 tun0
如果Linux尝试通过的地址与表中的任何掩码都不匹配,则附近的位置立即指示应该使用的另一条路径。
0.0.0.0 222.222.222.1 0.0.0.0 UG 600 0 0 wlp3s0
在这里已经写过,在这种情况下,您需要使用标准的Wi-Fi适配器。
我认为使用VPN的路径是因为它是路由表中的第一条路径。
从理论上讲,如果从路由表中删除此默认路径,则与dnsmasq openconnect一起使用应该可以确保正常运行。
我试过了
route del default
而且有效。
将请求路由到没有vpn-slice的邮件服务器
但是我还有一个地址为555.555.555.555的邮件服务器,您还需要通过vpn。 也必须手动添加到它的路线。
ip route add 555.555.555.555 via dev tun0
现在所有的规则。 因此,您可以不使用vpn-slice,但是您已经需要知道自己在做什么。 我现在正在考虑添加默认路由的删除,并在将vpn连接到openconnect本机脚本的最后一行后,为邮件程序添加路由,以使自行车中的运动部件数量减少。
也许,为了了解如何配置VPN的某人将拥有足够的此后记。 但是,当我试图了解如何做以及如何做时,我阅读了许多对作者有用的手册,但由于某种原因对我不起作用,因此决定在此添加我发现的所有文章。 我会对这样的事情感到非常满意。