如何建立一个OpenVPN服务器在Ubuntu 14.04

如何建立一个OpenVPN服务器在Ubuntu 14.04

介绍

当连接到不受信任的网络(例如酒店或咖啡店的WiFi)时,是否想从智能手机或笔记本电脑安全,安全地访问互联网?虚拟专用网络(VPN)允许您将不可信的网络私密安全地传送到DigitalOcean Droplet,就像您在安全的专用网络上一样。连接从Droplet出现并继续前往目的地。

HTTPS连接结合使用时,此设置可以保护您的无线登录和交易。您可以规避地理限制和审查,并屏蔽您的位置和来自不可信网络的未加密HTTP流量。

OpenVPN是一个全功能的开放源代码安全套接字层(SSL)VPN解决方案,适用于各种配置。在本教程中,我们将在Droplet上设置OpenVPN服务器,然后配置Windows,OS X,iOS和Android的访问权限。本教程将尽可能简化这些设置的安装和配置步骤。

注意:启动OpenVPN时,可以通过将此脚本添加到用户数据中来自动安装OpenVPN。 看看这个教程,以了解更多关于Droplet的用户数据。

必备条件

唯一的先决条件是建立并运行Ubuntu 14.04 Droplet。 您将需要root权限才能完成本指南。

  • 可选:在完成本教程之后,最好创建一个标准用户帐户,使用sudo权限执行服务器上的常规维护。

第1步 - 安装和配置OpenVPN的服务器环境

完成这些步骤为您的服务器端设置。

OpenVPN配置

在我们安装任何软件包之前,首先我们将更新Ubuntu的存储库列表。

apt-get update

然后我们可以安装OpenVPN和Easy-RSA。

apt-get install openvpn easy-rsa

示例VPN服务器配置文件需要提取到/etc/openvpn,以便我们可以将其纳入我们的设置。这可以用一个命令完成:

gunzip -c /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz > /etc/openvpn/server.conf

解压后,在文本编辑器中打开server.conf。 本教程将使用Vim,但您可以使用您喜欢的任何编辑器。

vim /etc/openvpn/server.conf

这个文件有几个变化。 你会看到一个这样的部分:

# Diffie hellman parameters.
# Generate your own with:
#   openssl dhparam -out dh1024.pem 1024
# Substitute 2048 for 1024 if you are using
# 2048 bit keys.
dh dh1024.pem

编辑dh1024.pem,改为:

dh2048.pem

生成服务器和客户端密钥时,将使使用的RSA密钥长度加倍。

仍然在server.conf中,现在查找这个部分:

# If enabled, this directive will configure
# all clients to redirect their default
# network gateway through the VPN, causing
# all IP traffic such as web browsing and
# and DNS lookups to go through the VPN
# (The OpenVPN server machine may need to NAT
# or bridge the TUN/TAP interface to the internet
# in order for this to work properly).
;push "redirect-gateway def1 bypass-dhcp"

取消注释push“redirect-gateway def1 bypass-dhcp”,以使VPN服务器将客户端的网络流量传递到目的地。 完成后应该看起来像这样:

push "redirect-gateway def1 bypass-dhcp"

下一个编辑是在这个领域:

# Certain Windows-specific network settings
# can be pushed to clients, such as DNS
# or WINS server addresses.  CAVEAT:
# http://openvpn.net/faq.html#dhcpcaveats
# The addresses below refer to the public
# DNS servers provided by opendns.com.
;push "dhcp-option DNS 208.67.222.222"
;push "dhcp-option DNS 208.67.220.220"

取消注释push “dhcp-option DNS 208.67.222.222”push “dhcp-option DNS 208.67.220.220”。完成后应该看起来像这样:

push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"

这告诉服务器在可能的情况下将OpenDNS推送到连接的客户端以进行DNS解析。这可以帮助防止DNS请求泄漏到VPN连接之外。但是,在客户端设备中指定所需的DNS解析器也很重要。

server.conf中的最后一个需要改变区域是:

# You can uncomment this out on
# non-Windows systems.
;user nobody
;group nogroup

取消注释user nobodygroup nogroup。完成后应该看起来像这样:

user nobody
group nogroup

默认情况下,OpenVPN以root用户身份运行,因此具有对系统的完全的root权限。相反,我们将OpenVPN限制在user nobody和group nogroup。这是一个没有默认登录功能的非特权用户,通常保留用于运行不受信任的应用程序,如面向网络的服务器。

现在保存您的更改并退出Vim。

数据包转发

这是一个sysctl的设置,它告诉服务器的内核,转发来自客户端设备投放到互联网上。否则,流量将停止在服务器上。 通过输入以下命令在运行时启用数据包转发:

echo 1 > /proc/sys/net/ipv4/ip_forward

我们需要使其成为永久性的,因此服务器在重新启动后仍然会转发流量。

vim /etc/sysctl.conf

在sysctl文件的顶部附近,你会看到:

# Uncomment the next line to enable packet forwarding for IPv4
#net.ipv4.ip_forward=1

取消注释net.ipv4.ip_forward。 完成后应该看起来像这样:

# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1

保存您的更改并退出。

简单的防火墙(ufw)

ufw是iptables的前端,建立ufw并不难。 它在Ubuntu 14.04中默认包含,所以我们只需要做一些规则和配置编辑,然后打开防火墙。作为ufw更多用途的参考,请参阅如何在Ubuntu和Debian云服务器上使用UFW设置防火墙。

首先设置ufw以允许SSH。 在命令提示符下,输入:

ufw allow ssh

本教程将使用UDP上的OpenVPN,所以ufw也必须允许通过端口1194的UDP通信。

ufw allow 1194/udp

ufw转发策略也需要设置。 我们将在ufw的主配置文件中执行此操作。

vim /etc/default/ufw

寻找DEFAULT_FORWARD_POLICY =“DROP”。 这必须从DROP更改为ACCEPT。 完成后应该看起来像这样:

DEFAULT_FORWARD_POLICY="ACCEPT"

接下来,我们将添加额外的ufw规则,用于连接客户端的网络地址转换和IP伪装。

vim /etc/ufw/before.rules

让你的illeru文件的顶部如下所示。 必须添加OPENVPN RULES的区域:

随着ufw的变化,我们现在可以启用它。 进入命令提示符:

ufw enable

启用ufw将返回以下提示:

Command may disrupt existing ssh connections. Proceed with operation (y|n)?

回答y。结果将是这个输出:

Firewall is active and enabled on system startup

要检查ufw的主要防火墙规则:

ufw status

状态命令应该返回这些条目:

Status: active

To                         Action      From
--                         ------      ----
22                         ALLOW       Anywhere
1194/udp                   ALLOW       Anywhere
22 (v6)                    ALLOW       Anywhere (v6)
1194/udp (v6)              ALLOW       Anywhere (v6)

第2步 - 创建证书颁发机构和服务器端证书和密钥

OpenVPN使用证书来加密流量。

Configure and Build the Certificate Authority

现在是时候建立我们自己的证书颁发机构(CA)并为OpenVPN服务器生成一个证书和密钥。OpenVPN支持基于证书的双向认证,这意味着客户端必须认证服务器证书,服务器必须在建立互信之前认证客户端证书。我们将使用之前复制的Easy RSA脚本来执行此操作。

首先复制Easy-RSA生成脚本。

cp -r /usr/share/easy-rsa/ /etc/openvpn

然后制作密钥存储目录。

mkdir /etc/openvpn/easy-rsa/keys

Easy-RSA有一个我们可以编辑的变量文件来创建证书,这个证书是我们个人,公司或者我们选择的任何实体的唯一证书。这些信息被复制到证书和密钥中,以后将有助于识别密钥。

vim /etc/openvpn/easy-rsa/vars

以红色标记的变量应根据您的偏好进行更改。

在同一个变量文件中,也编辑下面这一行。为了简单起见,我们将使用服务器作为关键名称。如果您想使用不同的名称,则还需要更新引用server.keyserver.crt的OpenVPN配置文件。

export KEY_NAME="server"

我们需要生成Diffie-Hellman参数; 这可能需要几分钟的时间。

openssl dhparam -out /etc/openvpn/dh2048.pem 2048

现在让我们改变一下目录,以便我们直接从Easy-RSA的脚本移到第二步的早期。

cd /etc/openvpn/easy-rsa

初始化PKI(公钥基础设施)。注意./vars命令前面的点(.)空格。这表示当前的工作目录(来源)。

. ./vars

上述命令的输出如下所示。 由于我们还没有在密钥目录中产生任何东西,警告是没有什么可担心的。

NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/easy-rsa/keys

现在,我们将清除任何可能的旧键或示例键的工作目录,以便让我们的新键使用。

./clean-all

该最终命令通过调用交互式OpenSSL命令来构建证书颁发机构(CA)。输出将提示您确认先前输入到Easy-RSA变量文件(国家名称,组织等)中的专有名称变量。

./build-ca

只需按ENTER即可通过每个提示。 如果必须更改某些内容,则可以在提示中执行该操作。

###为服务器生成证书和密钥

仍然从/ etc / openvpn / easy-rsa工作,现在输入命令来构建服务器的密钥。您看到服务器标记是我们在步骤2中的Easy-RSA vars文件中设置的导出KEY_NAME变量。

./build-key-server server

当我们运行./build-ca时产生类似的输出,可以再次按下ENTER以确认可分辨名称的每一行。不过,这次有两个额外的提示:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

两者都应该留空,所以只需按ENTER键通过每一个。

最后两个额外的查询需要肯定(y)的回应:

Sign the certificate? [y/n]
1 out of 1 certificate requests certified, commit? [y/n]

上面的最后一个提示应该完成:

Write out database with 1 new entries
Data Base Updated

移动服务器证书和密钥

OpenVPN希望在/ etc / openvpn中看到服务器的CA,证书和密钥。 让我们把它们复制到适当的位置。

cp /etc/openvpn/easy-rsa/keys/{server.crt,server.key,ca.crt} /etc/openvpn

您可以通过以下方式验证副本是否成功:

ls /etc/openvpn

您应该看到服务器的证书和密钥文件。

此时,OpenVPN服务器已准备就绪。 启动并检查状态。

service openvpn start
service openvpn status

状态命令应该返回:

VPN 'server' is running

恭喜! 您的OpenVPN服务器正在运行。如果状态消息显示VPN没有运行,请查看/ var / log / syslog文件中的错误,如:

Options error: --key fails with 'server.key': No such file or directory

该错误表示server.key未正确复制到/ etc / openvpn。 重新复制文件并重试。

第3步 - 为客户端生成证书和密钥

到目前为止,我们已经安装并配置了OpenVPN服务器,创建了一个证书颁发机构,并创建了服务器自己的证书和密钥。在这一步中,我们使用服务器的CA为将要连接到VPN的每个客户端设备生成证书和密钥。这些文件稍后将被安装到客户端设备上,如笔记本电脑或智能手机。

重点和证书建设

对于连接到VPN的每个客户端来说,它都是理想的选择,拥有自己独特的证书和密钥。这比在所有客户端设备中生成一个通用证书和密钥更好。

注意:默认情况下,OpenVPN不允许使用同一证书和密钥的客户端同时连接到服务器。 (请参阅/etc/openvpn/server.conf中的duplicate-cn。)

要为要连接到VPN的每个设备创建不同的身份验证凭据,应该为每个设备完成此步骤,但将以下名称client1更改为不同的名称,例如client2或iphone2。凭借每台设备的单独凭据,如果需要,可以稍后在服务器上单独停用。本教程中的其余示例将使用client1作为示例客户端设备的名称。

正如我们对服务器的关键所做的,现在我们为客户端的例子建立一个。 你仍然应该使用/ etc / openvpn / easy-rsa。

./build-key client1

再一次,系统会要求您更改或确认可分辨名称变量以及这两个应该保留为空的提示。按ENTER接受默认值。

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

如前所述,在构建过程结束时,这两个确认需要(y)响应:

Sign the certificate? [y/n]
1 out of 1 certificate requests certified, commit? [y/n]

如果密钥构建成功,则输出将再次为:

Write out database with 1 new entries
Data Base Updated

示例客户端配置文件也应该被复制到Easy-RSA密钥目录中。我们将使用它作为模板,将其下载到客户端设备进行编辑。在复制过程中,我们将示例文件的名称从client.conf更改为client.ovpn,因为.ovpn文件扩展名是客户端期望使用的。

cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /etc/openvpn/easy-rsa/keys/client.ovpn

您可以为每个客户端再次重复此部分,始终用适当的客户端名称替换client1。

将证书和密钥传输到客户端设备

回想一下上面的步骤,我们创建了客户端证书和密钥,并且将它们存储在/ etc / openvpn / easy-rsa / keys目录中的OpenVPN服务器上。

对于每个客户端,我们需要将客户端证书,密钥和配置文件模板文件传输到本地计算机或其他客户端设备上的文件夹。

在这个例子中,我们的client1设备需要位于服务器上的证书和密钥:

  • /etc/openvpn/easy-rsa/keys/client1.crt
  • /etc/openvpn/easy-rsa/keys/client1.key

ca.crt和client.ovpn文件是相同的所有客户端。下载这两个文件以及; 请注意,ca.crt文件与其他目录不在同一目录中。

  • /etc/openvpn/easy-rsa/keys/client.ovpn
  • /etc/openvpn/ca.crt

虽然用于完成此传输的确切应用程序将取决于您的选择和设备的操作系统,但您希望应用程序在后端使用SFTP(SSH文件传输协议)或SCP(安全复制)。 这将通过加密连接传输客户端的VPN认证文件。

下面是一个使用我们client1例子的例子SCP命令。 它将文件client1.key放到本地计算机的Downloads目录中。

scp root@your-server-ip:/etc/openvpn/easy-rsa/keys/client1.key Downloads/

这里有几个工具和教程,用于安全地将文件从服务器传输到本地计算机:

在本节结束时,请确保您的客户端设备上有以下四个文件:

  • client1.crt
  • client1.key
  • client.ovpn
  • ca.crt

第4步 - 为客户端设备创建一个统一的OpenVPN配置文件

有几种管理客户端文件的方法,但最简单的方法是使用统一的配置文件。 这是通过修改client.ovpn模板文件来创建的,以包含服务器的证书颁发机构,以及客户端的证书和密钥。 一旦合并,只有一个client.ovpn配置文件需要导入到客户端的OpenVPN应用程序。

我们将在我们下载的所有客户端文件所在的本地计算机上为我们的client1设备创建一个配置文件。 这台本地计算机本身可能是一个预期的客户端或只是一个临时工作区域来合并身份验证文件。 原始的client.ovpn模板文件应该被复制并重命名。 你如何做到这一点将取决于你的本地计算机的操作系统。

注意:您复制的client.ovpn的名称不需要与客户端设备相关。 客户端OpenVPN应用程序将使用文件名作为VPN连接本身的标识符。 相反,你应该将client.ovpn复制到你想要的VPN名称标签在你的操作系统中。 例如:work.ovpn将被识别为工作,school.ovpn作为学校等。

在本教程中,我们将命名VPN连接DigitalOcean,DigitalOcean.ovpn将成为此时引用的文件名。 一旦命名,我们就必须在文本编辑器中打开DigitalOcean.ovpn; 你可以使用你喜欢的编辑器。

第一个关注的领域将是你的Droplet的IP地址。 在文件顶部附近,更改my-server-1以反映您的VPN的IP。

# The hostname/IP and port of the server.
# You can have multiple remote entries
# to load balance between the servers.
remote my-server-1 1194

接下来,找到如下所示的区域,取消注释user nobody和group nogroup,就像我们在步骤1中的server.conf中所做的一样。注意:这不适用于Windows,因此您可以跳过它。 完成后应该看起来像这样:

# Downgrade privileges after initialization (non-Windows only)
user nobody
group nogroup

下面给出的区域需要显示的三行注释,所以我们可以将证书和密钥直接包含在DigitalOcean.ovpn文件中。 完成后应该看起来像这样:

# SSL/TLS parms.
# . . .
#ca ca.crt
#cert client.crt
#key client.key

要将各个文件合并到一个统一的配置文件中,ca.crt,client1.crt和client1.key文件的内容将使用基本的类似XML的语法直接粘贴到.ovpn配置文件中。 文件末尾的XML应该采用以下形式:

<ca>
(insert ca.crt here)
</ca>
<cert>
(insert client1.crt here)
</cert>
<key>
(insert client1.key here)
</key>

完成后,文件的结尾应该类似于这个缩写的例子:

<ca>
-----BEGIN CERTIFICATE-----
. . .
-----END CERTIFICATE-----
</ca>

<cert>
Certificate:
. . .
-----END CERTIFICATE-----
. . .
-----END CERTIFICATE-----
</cert>

<key>
-----BEGIN PRIVATE KEY-----
. . .
-----END PRIVATE KEY-----
</key>

client1.crt文件中有一些额外的信息; 只包含整个文件就可以了。

保存更改并退出。 我们现在有一个统一的OpenVPN客户端配置文件来配置我们的客户端1。

第5步 - 安装客户端配置文件

现在我们将讨论在Windows,OS X,iOS和Android上安装客户端VPN配置文件。 这些客户端说明都不依赖于对方,因此您可以跳到适用于您的那一条。

请记住,连接将被称为.ovpn文件。 在我们的示例中,由于该文件名为DigitalOcean.ovpn,因此该连接将被命名为DigitalOcean

Windows

安装

OpenVPN的下载页面上可以找到Windows的OpenVPN客户端应用程序。 为您的Windows版本选择适当的安装程序版本。

注意:OpenVPN需要管理权限才能安装。

安装OpenVPN之后,将统一的DigitalOcean.ovpn配置文件复制到:

C:\Program Files\OpenVPN\config

当您启动OpenVPN时,它将自动查看配置文件并使其可用。

每次使用OpenVPN时,都必须以管理员身份运行,即使是管理帐户。 要做到这一点,不必右键单击并选择每次使用VPN时以管理员身份运行,都可以预设,但必须从管理帐户完成。 这也意味着标准用户需要输入管理员密码才能使用OpenVPN。 另一方面,除非客户端上的OpenVPN具有管理权限,否则标准用户无法正确连接到服务器,因此需要提升权限。

要将OpenVPN应用程序设置为始终以管理员身份运行,请右键单击其快捷方式图标并转到“属性”。 在“兼容性”选项卡的底部,单击按钮以更改所有用户的设置。 在新窗口中,选中以管理员身份运行该程序。

连接

每次启动OpenVPN GUI时,Windows都会询问您是否要让程序对您的计算机进行更改。 单击是。 启动OpenVPN客户端应用程序只会将applet放在系统托盘中,这样就可以根据需要连接和断开VPN。 它实际上并不建立VPN连接。

一旦OpenVPN启动,进入系统托盘小程序,并右键单击OpenVPN小程序图标启动连接。 这将打开上下文菜单。 在菜单顶部选择DigitalOcean(这是我们的DigitalOcean.ovpn配置文件),然后选择连接。

状态窗口将打开,显示建立连接时的日志输出,一旦客户端连接,将显示一条消息。

断开与VPN的连接方式相同:进入系统托盘小程序,右键单击OpenVPN小程序图标,选择客户端配置文件,然后单击断开连接。

OS X

安装

Tunnelblick是一款适用于Mac OS X的免费开源OpenVPN客户端。您可以从Tunnelblick下载页面下载最新的磁盘映像。 双击下载的.dmg文件并按照提示进行安装。

在安装过程结束时,Tunnelblick会问你是否有任何配置文件。 回答No并让Tunnelblick完成可能会更容易。 打开Finder窗口并双击DigitalOcean.ovpn。 Tunnelblick将安装客户端配置文件。 管理权限是必需的。

连接

通过双击应用程序文件夹中的Tunnelblick来启动Tunnelblick。 一旦Tunnelblick启动,屏幕右上角的菜单栏会出现一个Tunnelblick图标来控制连接。 点击图标,然后点击连接菜单项来启动VPN连接。 选择DigitalOcean连接。

iOS

安装

从iTunes App Store中,搜索并安装官方的iOS OpenVPN客户端应用程序OpenVPN Connect。 要将iOS客户端配置文件传输到设备上,请将其直接连接到计算机。

完成与iTunes转移将在这里概述。 在电脑上打开iTunes,然后点击iPhone>应用程序。 向下滚动到文件共享部分的底部,然后点击OpenVPN应用程序。 右侧的空白窗口OpenVPN Documents是用于共享文件的。 将.ovpn文件拖到“OpenVPN文档”窗口。

现在在iPhone上启动OpenVPN应用程序。 将会有一个通知,即一个新的配置文件准备导入。 点击绿色的加号来导入它。

连接

OpenVPN现在可以使用新的配置文件。 将连接按钮滑动到开启位置,开始连接。 通过将同一个按钮滑动到关闭来断开连接。

注意:设置下的VPN交换机不能用于连接到VPN。 如果你尝试,你会收到一个通知,只使用OpenVPN的应用程序连接。

Android

安装

打开Google Play商店。 搜索并安装Android OpenVPN Connect,这是官方的Android OpenVPN客户端应用程序。

.ovpn配置文件可以通过USB连接到您的计算机并复制文件来传输。 或者,如果您有SD读卡器,则可以取出设备的SD卡,将配置文件复制到SD卡上,然后将其插回到Android设备中。

启动OpenVPN应用程序,点击菜单导入配置文件。

然后导航到保存的配置文件的位置(屏幕截图使用/ sdcard / Download /)并选择文件。 该应用程序将记下该配置文件已导入。

连接

要连接,只需点击连接按钮。 你会被问到你是否信任OpenVPN应用程序。 选择确定以启动连接。 要从VPN断开连接,请返回到OpenVPN应用程序,然后选择断开连接。

第6步 - 测试您的VPN连接

一旦安装了所有东西,一个简单的检查确认一切正常。 如果没有启用VPN连接,请打开浏览器并转到DNSLeakTest

该网站将返回由您的互联网服务提供商分配的IP地址,而且您将看到世界其他地方。 要通过同一个网站检查你的DNS设置,点击扩展测试,它会告诉你你正在使用哪个DNS服务器。

现在将OpenVPN客户端连接到您的Droplet VPN并刷新浏览器。 现在应该出现您的VPN服务器完全不同的IP地址。 那现在是你如何看待这个世界。 再次,DNSLeakTest的扩展测试将检查您的DNS设置,并确认您现在正在使用您的VPN推送的DNS解析器。

恭喜! 您现在正在安全地穿越互联网,保护您的身份,位置以及来自窥探者和审查者的流量。

原文链接:https://www.digitalocean.com/community/tutorials/how-to-set-up-an-openvpn-server-on-ubuntu-14-04

原文作者:James

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏meteorzx

FTP错误详解及解决方案

这个问题在于你输入的网址有错误。有可能是你要连接的服务器不能识别你要求浏览的文档,或者你没有访问它的权利甚至它根本就是不存在的。仔细检查一下 你是否将网址写错,...

1896
来自专栏我的小碗汤

LAMP环境部署物联网项目

物联网,即Internet of Things,简写IOT。让所有能行使独立功能的普通物体实现互联互通的网络,通过物联网可以用中心计算机对机器、设备、人员进行集...

652
来自专栏北京马哥教育

9 个使用前必须再三小心的 Linux 命令

Linux shell/terminal 命令非常强大,即使一个简单的命令就可能导致文件夹、文件或者路径文件夹等被删除。 在一些情况下,Linux 甚至不会询问...

3246
来自专栏趣谈编程

DNS原理入门

DNS 是互联网核心协议之一。不管是上网浏览,还是编程开发,都需要了解一点它的知识。

1190
来自专栏沈唁志

在Ubuntu 14.04上安装Zimbra开源版

Zimbra是一个完整的邮件服务器,它提供配置的Postfix与OpenDKIM,Amavis,ClamAV和Nginx,准备处理一个或多个域的邮件。Linod...

611
来自专栏北京马哥教育

Nginx专题: 从编译安装到URL重写

前言 本文主要实现使用Nginx作为Web服务器,并使用URL Rewrite实现将手机对Web站点的请求专门重写到一个专门为手机定制的Web页面中。 环境介绍...

3055
来自专栏月色的自留地

新麦装机问题汇

1273
来自专栏小俊博客

随机图片API

3394
来自专栏我的博客

HTTP 状态码汇总

400 Bad request(错误请求) 401.1 Logon failed(登录失败) 401.2 Logon failed due to serve...

3308
来自专栏野路子程序员

关于weiphp的openid外链分享的严重BUG

3268

扫码关注云+社区