一键双击VPN。 如何轻松拆分入口和出口点的IP地址



TL; DR 本文介绍配置VPN服务器的最简单方法,该VPN服务器的连接VPN客户端的IP地址与客户端访问Internet的IP地址不同。

您是否使用VPN来保护Internet上的隐私并为此租用您自己的服务器? 您是全世界唯一连接到该服务器的客户端吗? 您认为很难找到您的真实IP地址吗? 随着Spring软件包的生效,它变得更加容易。

Double VPN是一个热门话题,围绕它有很多猜测。 该术语通常称为完全不同的技术,但几乎总是表示Internet连接和出口点在IP地址级别上隔开。 我们将考虑在此模式下配置VPN服务器的最简单方法,该方法不需要在服务器端进行其他配置,并且可以让您获得最高速度和最低延迟。

威胁模型


为了保护自己免受某些威胁,您需要清楚地了解威胁模型。 我们不会讨论要求提供商存储所有客户端流量的新法律,但是我们可以肯定地说,连接数据,即所谓的 Netflow的存储非常简单,并且已经完成了很长时间。 即,记录了在一天的特定时间将条件IP地址1.1.1.1连接到地址2.2.2.2的事实。

可以访问提供商,城市或国家规模的此类信息,仅需确定谁隐藏在VPN后面就足够了。

为了提高使用VPN时的隐私级别,您需要在IP级别上分离连接点和Internet接入点。 在上图中,在Irina Yarovoy的审查下,我们的用户在篱笆后面。 伊琳娜(Irina)严格记得,所有穿过篱笆的联系。 用户作为一个体面的公民,连接到地址good.citizen.vpn ,同时从地址super.cool.guy.vpn返回。 结果,对于Irina,这两个连接看起来是未连接的。

什么是双重VPN?


在“双重” VPN的名称下,人们通常会理解不同的事物,但几乎总是意味着在地理上或网络级别上隔开的连接和访问Internet的节点。 有时,这只是VPN提供商的营销技巧,这绝对没有任何意义,此类服务可以称为“三重”和“四重” VPN。

我们将分析实际使用的最典型方案。

服务器之间的VPN


最常见的方式。 在这种模式下,客户端仅与第一台服务器建立VPN连接。 到第二个隧道的隧道是在第一台服务器上配置的,来自客户端的所有流量都流向第二个服务器,依此类推。 可能有几个中间服务器。 在这种情况下,可以使用除客户端通过其连接的协议以外的任何其他协议(例如IPsec)来安装服务器之间的隧道,或者不使用任何加密(例如GRE或IPIP)来安装服务器之间的隧道。 在这种模式下, 可以在路由跟踪中看到所有中间服务器。 无法准确检查客户端中间服务器的连接方式,因此您只能信任提供程序。

在整个流量路由中,最小MTU(最大传输单位)保持等于第一个隧道的值,并且每个中间服务器都可以访问解密的客户端流量



通过代理VPN


这也是一种相当普遍的方式。 通常用于在不同协议下掩盖VPN流量,例如在中国。 此方法比代理链更方便,因为使用VPN可以轻松将所有系统流量路由到隧道。 还有一些工具可以拦截程序的系统调用并将其重定向到代理:ProxyCap,Proxifier,但它们的稳定性较差,因为它们有时会丢失请求,并且会绕过代理或与某些程序无法正常工作。

在这种模式下,代理服务器在路由跟踪中不可见。



VPN内部的VPN


最偏执和最慢的方式:所有隧道都在客户端上升,彼此之间位于彼此之间。 此方法要求在客户端配置狡猾的路由,并以正确的顺序启动所有VPN客户端。 这对延迟和性能不利,但是中间服务器无权访问客户端的开放流量。 总结了所有封装开销,并且最终可供客户端使用的最大数据包大小(MTU)会根据隧道数量的减少而减少。 中间服务器在路由跟踪中不可见。



配置VDS


设置具有分离的入口和出口点的VPN的最简单方法是将多个IP地址连接到单个虚拟服务器。 由于实际上流量是在单个服务器上终止的,因此此方法可让您获得最大的速度和最小的延迟。 在Vdsina.ru上,您可以自己从控制面板进行此操作。 尽管IPv4到处都无休止,但我们甚至会在服务器上发出60卢布的额外IP地址!

我们将逐步分析服务器配置。

选择服务器


我们在必要的数据中心内以适当的价格订购VDS。 根据我们的任务,我们将选择一个更远的荷兰数据中心;)



连接其他IP地址


购买额外的IP地址后,您需要根据说明进行配置。



为了清楚起见,将PTR记录分配给IP。 这是将IP地址转换回域时可见的域名。 这可以是任何值,包括不存在的域。

例如,我们将使用以下值:

 xxx.xxx.38.220 — super.cool.guy.vpn #   ( ) xxx.xxx.39.154 — good.citizen.vpn #   ( ) 



两次IP验证


重要的是要记住,最初在服务器上设置的IP地址将是出口点,因此新地址将是入口点。 通过SSH连接到服务器,并检查哪个地址用作外部地址。

为此,最容易从控制台使用ifconfig.co服务。 通过curl请求时,它返回发出请求的IP地址。

 $ curl ifconfig.co xxx.xxx.38.220 

最后的数字表明我们的外部地址确实与出口点匹配。 让我们尝试检查第二个IP作为入口点的正确操作。 为此,只需使用SSH内置的SOCKS代理功能。

命令在客户端上执行:

 ssh -D 9999 root@good.citizen.vpn #    curl -x socks5h://127.0.0.1:9999 ifconfig.co super.cool.guy.vpn 

第一个命令使用地址good.citizen.vpn设置SSH会话,并同时在该会话内激活SOCKS代理,该代理可在本地端口上使用。 第二个通过此代理发出普通的HTTP请求。
请务必记住,我们的示例使用虚拟域名进行查询。 它们将仅以PTR分辨率显示,并且无法对其进行完整请求。 因此,在此阶段,您需要通过IP地址访问服务器。

IKEv2服务器配置




IPsec IKEv2是现代VPN协议,几乎所有开箱即用的操作系统都支持。 在Windows,macOS和iOS中,它用作默认协议。 但是,它不需要安装第三方软件,并且大多数情况下比OpenVPN的运行速度更快。 已经有关于在集线器上设置IKEv2服务器的文章 ,但是它们都描述了自签名证书的使用,并且不便,因为它们要求您在VPN客户端的一侧安装根证书。

我们将使用来自Let's Encrypt的可信证书来分析服务器配置的示例。 这使您不必为客户端安装无关的根证书,而仅颁发用户名和密码。

服务器准备


我们将使用基于Ubuntu 18.04的服务器,但该说明也适用于大多数现代发行版。

我们更新系统并安装必要的软件包

 apt update && apt upgrade apt install certbot strongswan libstrongswan-extra-plugins 

证书发行


要颁发受信任的证书,您需要将真实域定向到入口点的IP地址。 由于它不在本文的讨论范围之内,因此我们将不对其进行详细考虑。 例如,我们将使用虚拟域good.citizen.vpn

如果服务器上已经有Web服务器,请使用适当的方法通过certbot或“ Let's Encrypt”的其他客户端颁发证书。 本示例假定HTTP端口(80)不忙。

 certbot certonly --standalone --agree-tos -d good.citizen.vpn 

回答向导的问题? 我们将收到签名的证书和密钥

 # find /etc/letsencrypt/live/good.citizen.vpn/ /etc/letsencrypt/live/good.citizen.vpn/ /etc/letsencrypt/live/good.citizen.vpn/fullchain.pem /etc/letsencrypt/live/good.citizen.vpn/README /etc/letsencrypt/live/good.citizen.vpn/cert.pem /etc/letsencrypt/live/good.citizen.vpn/privkey.pem /etc/letsencrypt/live/good.citizen.vpn/chain.pem 

对于IKEv2服务器身份验证,使用与以下相同的X.509证书
Https 为了使Strongswan能够使用这些证书,必须将它们复制到/etc/ipsec.d文件夹中。

证书的定位方法如下:

 cp /etc/letsencrypt/live/good.citizen.vpn/cert.pem /etc/ipsec.d/certs/ cp /etc/letsencrypt/live/good.citizen.vpn/privkey.pem /etc/ipsec.d/private/ cp /etc/letsencrypt/live/good.citizen.vpn/chain.pem /etc/ipsec.d/cacerts/ 

由于letencrypt证书经常被重新颁发,因此手动操作很不方便。 因此,我们使用certbot挂钩自动执行此过程。

该脚本的任务是每次更新证书时将三个文件复制到所需的文件夹中,然后发送strongswan命令以重新读取证书。

创建文件/etc/letsencrypt/renewal-hooks/deploy/renew-copy.sh并使其可执行。

 #!/bin/sh set -e for domain in $RENEWED_DOMAINS; do case $domain in good.citizen.vpn) daemon_cert_root=/etc/ipsec.d/ # Make sure the certificate and private key files are # never world readable, even just for an instant while # we're copying them into daemon_cert_root. umask 077 cp "$RENEWED_LINEAGE/cert.pem" "$daemon_cert_root/certs/" cp "$RENEWED_LINEAGE/chain.pem" "$daemon_cert_root/cacerts/" cp "$RENEWED_LINEAGE/privkey.pem" "$daemon_cert_root/private/" # Reread certificates /usr/sbin/ipsec reload /usr/sbin/ipsec purgecerts /usr/sbin/ipsec rereadall ;; esac done 

现在,在每次重新颁发证书之后,该脚本会将新文件复制到strongswan文件夹中,并向守护程序发送命令以重新读取证书。

Strongswan设置


添加strongswan /etc/ipsec.conf配置

 config setup #       uniqueids=no # Increase debug level # charondebug = ike 3, cfg 3 conn %default #       ike=aes256-sha256-modp1024,aes256-sha256-modp2048 #  ""  dpdaction=clear dpddelay=35s dpdtimeout=2000s keyexchange=ikev2 auto=add rekey=no reauth=no fragmentation=yes #compress=yes # left - local (server) side leftcert=cert.pem #      /etc/ipsec.d/certs/ leftsendcert=always #    leftsubnet=0.0.0.0/0 # right - remote (client) side eap_identity=%identity #   IP-  VPN- rightsourceip=10.0.1.0/24 rightdns=8.8.8.8,1.1.1.1 # Windows and BlackBerry clients usually goes here conn ikev2-mschapv2 rightauth=eap-mschapv2 # Apple clients usually goes here conn ikev2-mschapv2-apple rightauth=eap-mschapv2 leftid=good.citizen.vpn 

VPN客户端的登录名和密码在/etc/ipsec.secrets文件中设置

在此文件中,您还需要指定我们先前从letsencrypt文件夹复制的私钥的名称:

 #       /etc/ipsec.d/private/ : RSA privkey.pem #  VPN #  : EAP "" IrinaYarovaya : EAP "PleaseLoveMe123" Mizooleena : EAP "IwannaLoveToo3332" 

在此阶段,您可以重新启动Strongswan服务器,并检查是否已激活新配置:

 $ systemctl restart strongswan $ ipsec statusall Virtual IP pools (size/online/offline): 10.0.1.0/24: 254/0/0 Listening IP addresses: xxx.xxx.38.220 Connections: ikev2-mschapv2: %any...%any IKEv2, dpddelay=35s ikev2-mschapv2: local: [CN=good.citizen.vpn] uses public key authentication ikev2-mschapv2: cert: "CN=good.citizen.vpn" ikev2-mschapv2: remote: uses EAP_MSCHAPV2 authentication with EAP identity '%any' ikev2-mschapv2: child: 0.0.0.0/0 === dynamic TUNNEL, dpdaction=clear ikev2-mschapv2-apple: %any...%any IKEv2, dpddelay=35s ikev2-mschapv2-apple: local: [good.citizen.vpn] uses public key authentication ikev2-mschapv2-apple: cert: "CN=good.citizen.vpn" ikev2-mschapv2-apple: remote: uses EAP_MSCHAPV2 authentication with EAP identity '%any' ikev2-mschapv2-apple: child: 0.0.0.0/0 === dynamic TUNNEL, dpdaction=clear 

您可以看到配置已成功激活,并且证书已连接。 在此阶段,您已经可以连接到VPN服务器,但是它将无法访问Internet。 要释放Internet上的客户端,您需要启用转发并配置NAT。

NAT设置


我们激活转发包:

 echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf sysctl -p 

打开NAT。 重要的是要记住,这只是最小的iptables配置的示例。 根据您的需求自定义其余规则。

ethName0-替换为您的接口名称
10.0.1.0/24-将发布给VPN客户端的IP地址范围。 我们在/etc/ipsec.conf中询问了它
111.111.111.111-出口点的IP地址,在我们的示例中为地址super.cool.guy.vpn

 iptables -t nat -A POSTROUTING -s 10.0.1.0/24 -o ethName0 -j SNAT --to-source 111.111.111.111 

侦错


在配置的这一阶段,我们应该获得一个可以正常工作的服务器,客户端已经可以连接到该服务器。 在继续之前,最好通过检查连接进行验证。

如果出现连接问题,您可以实时查看日志:

 journalctl -f -u strongswan 

启动时启动


如果一切成功,则可以在启动时向启动添加“ strongswan”:

 systemctl enable strongswan 

保存iptables规则


要在重启后保存iptables规则,有一个特殊的iptables-persistent软件包。 重要的是要记住,它将保存当前规则集并将其添加到启动中。

 apt install iptables-persistent 

客户设置


在客户端设置非常简单-只需告诉客户端服务器地址,用户名和密码即可。 对于macOS和iOS,您可以创建自动配置配置文件,只需单击两次即可激活。

Windows设置
在新版本的Windows中,IKEv2是在一个简单的向导中配置的,可以从WiFi连接菜单访问该向导。



Windows没有为这种连接设置默认路由,因此我们将手动安装它。 在VPN连接的属性中,另外转到TCP / IPv4的属性->并选中“在远程网络上使用网关”框


可点击

MacOS设定
MacOS从版本10.11(El Capitan)开始支持IKEv2。 通过网络设置菜单创建连接。

图片

添加一个新的连接。 连接的名称可以是任意名称。

图片

要对证书进行身份验证,必须指定域名。 同时,在“服务器地址”字段中,您可以指定服务器的IP地址,而仅在“远程ID”中指定域,则将不为连接执行DNS解析,并且速度会更快一些。

图片

用户名和密码是从/etc/ipsec.secrets文件中指定的

图片

iOS设置
可以通过向导手动进行IOS配置,但是使用mobileconfig自动配置配置文件更加方便。

手动调整的含义与台式机macOS相似:

设置-> VPN->添加VPN配置

Apple设备的自动配置配置文件

自动配置配置文件.mobileconfig是一个XML文件,其设置可以配置从SSL证书到VPN连接的所有内容。

用户单击文件就足够了,所有必需的设置将自动安装。

连接到我们的IKEv2服务器的示例配置。
要为您的配置配置文件,只需在此模板中编辑一些参数:

AuthName- / etc/ipsec.secrets文件中的用户名
AuthPassword-用户密码/etc/ipsec.secrets
RemoteAddress-域或服务器IP地址
RemoteIdentifier-为其颁发证书的域

 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>PayloadContent</key> <array> <dict> <key>IKEv2</key> <dict> <!-- Username and password from ipsec.secrets --> <key>AuthName</key> <string>IrinaYarovaya</string> <key>AuthPassword</key> <string>PleaseLoveMe123</string> <!-- Hostname or IP address of VPN server. Chosing IP address instead of DNS name can avoid issues with client DNS resolvers and speed up connection process. --> <key>RemoteAddress</key> <string>123.123.123.123</string> <!-- leftid in ipsec.conf --> <key>RemoteIdentifier</key> <string>good.citizen.vpn</string> <key>AuthenticationMethod</key> <string>Certificate</string> <key>ChildSecurityAssociationParameters</key> <dict> <!-- in ipsec.conf this proposal is: ike=aes256-sha256-modp2048 --> <key>DiffieHellmanGroup</key> <integer>14</integer> <key>EncryptionAlgorithm</key> <string>AES-256</string> <key>IntegrityAlgorithm</key> <string>SHA2-256</string> <key>LifeTimeInMinutes</key> <integer>1440</integer> </dict> <key>DeadPeerDetectionRate</key> <!-- None (Disable) Low (keepalive sent every 30 minutes) Medium (keepalive sent every 10 minutes) High (keepalive sent every 1 minute) --> <string>High</string> <key>ExtendedAuthEnabled</key> <true/> <key>IKESecurityAssociationParameters</key> <dict> <key>DiffieHellmanGroup</key> <integer>14</integer> <key>EncryptionAlgorithm</key> <string>AES-256</string> <key>IntegrityAlgorithm</key> <string>SHA2-256</string> <key>LifeTimeInMinutes</key> <integer>1440</integer> </dict> <!-- Always On OnDemand Rule Cen be disabled in connection preferences by "On Demand" checkbox http://www.v2ex.com/t/137653 https://developer.apple.com/library/mac/featuredarticles/iPhoneConfigurationProfileRef/Introduction/Introduction.html https://github.com/iphoting/ovpnmcgen.rb --> <key>OnDemandEnabled</key> <integer>1</integer> <key>OnDemandRules</key> <array> <dict> <key>Action</key> <string>Connect</string> </dict> </array> </dict> <key>IPv4</key> <dict> <key>OverridePrimary</key> <integer>1</integer> </dict> <key>PayloadDescription</key> <string>Configures VPN settings</string> <key>PayloadDisplayName</key> <string>VPN</string> <key>PayloadIdentifier</key> <string>com.apple.vpn.managed.96C1C38F-D4D6-472E-BA90-9117ED8896B5</string> <key>PayloadType</key> <string>com.apple.vpn.managed</string> <key>PayloadUUID</key> <string>96C1C38F-D4D6-472E-BA90-9117ED8896B5</string> <key>PayloadVersion</key> <integer>1</integer> <!-- VPN connection name in Network Preferences --> <key>UserDefinedName</key> <string>London VPN</string> <key>VPNType</key> <string>IKEv2</string> </dict> </array> <!-- Set the name to whatever you like, it is used in the profile list on the device --> <key>PayloadDisplayName</key> <string>My Super IKEv2 VPN</string> <!-- A reverse-DNS style identifier (com.example.myprofile, for example) that identifies the profile. This string is used to determine whether a new profile should replace an existing one or should be added. --> <key>PayloadIdentifier</key> <string>vpn.googd.citizen</string> <!-- A globally unique identifier, use uuidgen on Linux/Mac OS X to generate it --> <key>PayloadUUID</key> <string>F3FAD91C-019C-4A79-87A1-CF334C583339</string> <key>PayloadType</key> <string>Configuration</string> <key>PayloadVersion</key> <integer>1</integer> </dict> </plist> 

Android设置
不幸的是,Android是唯一仍未内置支持IKEv2的流行操作系统之一。 要进行连接,您可以使用PlayMarket的官方Strongswan客户端

总结


我们展示了最简单的服务器设置选项,其中包含进入点和退出点的间隔。 尽管入口和出口点的IP地址位于不同的子网中,但由于此配置不使用服务器之间的其他隧道,因此可以使您获得最大的VPN速度。 通过这种方法,您可以通过将两个以上IP地址连接到服务器来进行进一步的实验。

IKEv2协议非常适合在桌面操作系统上用于日常工作,因为它最大程度地本机集成到了系统中,并且在所有其他条件相同的情况下,与第三方VPN程序相比,它可以使您获得更快的速度。





订阅我们的Instagram开发人员


Source: https://habr.com/ru/post/zh-CN469879/


All Articles