\chapter{网络封锁突破计划}
\label{chap:vpn}

\section{VPN 和 OpenVPN 的选定}
VPN 是一种较有前景的安全加密通信方法。而 OpenVPN 则是较为开放的 VPN 的实现，比较便于自定义和开发。

\section{实现目标}
我们希望我们的系统具有：
\begin{itemize}
	\item 安全连接功能：用户可以在国内自由地访问互联网资源。
	\item 基于用户名和密码认证的连接：用户不需要客户端证书，而使用用户名和密码连接服务器。
	\item 用户使用及用量监控功能：记录用户流量和连接详情。
	\item 用户账户管理功能：管理员（出资者）可以随时浏览用户的使用情况，添加或删除账户。
	\item 高级路由功能：为国内网站设置专门路由，令其不通过 VPN 来访问网络，节约服务器资源，提高浏览速度。
\end{itemize}

目前，我们实现了前 3 项。后 2 项由于时间等原因还没有进行实现。

\section{用户名和密码认证的实现}
这部分内容已有人实现过，并且发布在了互联网上。我们参照 DozView 的\href{http://dozview.com/blog/an-implementation-of-openvpn-system-based-on-userpass-authentication-bandwidth-control}{《基于用户名/密码认证和流量控制的OpenVPN系统的实现》}完成了基于用户名和密码认证，以及流量记录。

我们的数据表结构和该文章不同，我们自行设计了用户和日志数据表，如下：
\lstset{language=SQL,caption={`log` 数据表}}
\begin{quote}
\begin{lstlisting}[breaklines]
CREATE TABLE `log` (
  `username` varchar(32) COLLATE utf8_unicode_ci NOT NULL COMMENT 'The owner of this log entry',
  `started_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Connected at...',
  `ended_at` timestamp NULL DEFAULT NULL COMMENT 'Ended at...',
  `server_mode` text COLLATE utf8_unicode_ci NOT NULL COMMENT 'The mode of the OpenVPN server',
  `remote_ip` text COLLATE utf8_unicode_ci NOT NULL COMMENT 'The IP address connected to the server',
  `bytes_rcvd` bigint(20) DEFAULT NULL COMMENT 'How much data were sent from the client',
  `bytes_sent` bigint(20) DEFAULT NULL COMMENT 'How much data did the client receive'
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='Connection log';
\end{lstlisting}
\end{quote}

\lstset{language=SQL,caption={`log` 数据表}}
\begin{quote}
\begin{lstlisting}[breaklines]
CREATE TABLE `users` (
  `username` varchar(32) COLLATE utf8_unicode_ci NOT NULL COMMENT 'Username of the user',
  `password` varchar(64) COLLATE utf8_unicode_ci NOT NULL COMMENT 'Password of the user',
  `role` tinyint(4) NOT NULL DEFAULT '1' COMMENT 'User role: 1 for normal; 9 for admin',
  `status` tinyint(4) NOT NULL DEFAULT '1' COMMENT 'User status: 1 for active; 2 for manually-set inactive; 3 for exceeded quota',
  `quota_30d` bigint(20) NOT NULL DEFAULT '0' COMMENT 'Quota for this user in bytes. 0 for unlimited',
  `usage_30d` bigint(20) NOT NULL DEFAULT '0' COMMENT 'How much traffic did this user make',
  `note` text COLLATE utf8_unicode_ci COMMENT 'The maintainer''s note',
  PRIMARY KEY (`username`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
\end{lstlisting}
\end{quote}

\section{网页管理部分}
所有代码均可在\datamedia 的 \texttt{网页管理系统/} 目录中找到，在此不再赘述。界面请看 \autoref{fig:webinterface}。

\begin{center}
	\includegraphics[width=1.00\textwidth]{screenshot-vpn-jiehan-org-test-launch.png}
	\captionof{figure}{vpn.jiehan.org 截图}
	\label{fig:webinterface}
\end{center}

\section{帐号发放策略}
目前，任何四中校内申请帐号的请求都会被批准。当前共有 7 个帐号。

\section{成本估计}
本次的 VPN 服务运行在 \texttt{us2.jiehan.org} 上。它使用 \texttt{Thrust::VPS} 的服务，月收费 7.95 美金，提供 1 TB 的流量。由于运行的是 VPN 服务，不仅要接收用户的流量，还要再转发一次，因此实际可以服务 500 GB 的数据。

\[
    7.95 \text{ dollars} \div 500 \text{ GB} = 0.0159 \text{ dollars/GB}
\]

也就是说，用户使用 1 GB，只需要投资者支付 0.0159 美金。

由于目前 VPN 服务用户数量不大，因此无法得出单个用户的预计资金使用情况。
