<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>服务器安全维护工作室 &#187; 系统安全</title>
	<atom:link href="https://www.fuwuqiok.com/tag/%e7%b3%bb%e7%bb%9f%e5%ae%89%e5%85%a8/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.fuwuqiok.com</link>
	<description></description>
	<lastBuildDate>Sun, 01 Mar 2020 07:28:40 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.2.26</generator>
	<item>
		<title>OpenVPN安装配置教程</title>
		<link>https://www.fuwuqiok.com/openvpn%e5%ae%89%e8%a3%85%e9%85%8d%e7%bd%ae%e6%95%99%e7%a8%8b/</link>
		<comments>https://www.fuwuqiok.com/openvpn%e5%ae%89%e8%a3%85%e9%85%8d%e7%bd%ae%e6%95%99%e7%a8%8b/#comments</comments>
		<pubDate>Tue, 08 Dec 2015 14:50:57 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[系统安全代维]]></category>
		<category><![CDATA[网站代维]]></category>
		<category><![CDATA[OpenVPN安装配置教程]]></category>
		<category><![CDATA[系统安全]]></category>

		<guid isPermaLink="false">https://www.fuwuqiok.com/?p=2816</guid>
		<description><![CDATA[<p>1、什么是 VPN ？ VPN （Virtual Private Network） 即虚拟专用网络，是一种常用 [&#8230;]</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/openvpn%e5%ae%89%e8%a3%85%e9%85%8d%e7%bd%ae%e6%95%99%e7%a8%8b/">OpenVPN安装配置教程</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></description>
				<content:encoded><![CDATA[<div class="entry-content">
<h1>1、什么是 VPN ？</h1>
<p>VPN （Virtual Private Network） 即虚拟专用网络，是一种常用于连接中、大型企业或团体与团体间的私人网络的通讯方法。虚拟私人网络的讯息透过公用的网络架构（例如：互联网）来传送内联网的网络讯息。它利用已加密的通道协议（Tunneling Protocol）来达到保密、发送端认证、消息准确性等私人消息安全效果。这种技术可以用不安全的网络（例如：互联网）来发送可靠、安全的消息。需要注意的是，加密消息与否是可以控制的。没有加密的虚拟专用网消息依然有被窃取的危险。【摘自<a href="http://zh.wikipedia.org/wiki/VPN">维基百科</a>】</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2015/12/a2ed3c22f3aec44fb1f39525b59adf8b.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2015/12/a2ed3c22f3aec44fb1f39525b59adf8b.png" alt="a2ed3c22f3aec44fb1f39525b59adf8b" width="1280" height="905" /></a></p>
<h3><span id=".E5.AE.89.E5.85.A8.E6.80.A7" class="mw-headline">2、安全性</span></h3>
<p>安全的虚拟私人网络使用<strong><a title="加密" href="http://zh.wikipedia.org/wiki/%E5%8A%A0%E5%AF%86">加密</a><a class="mw-redirect" title="穿隧协议" href="http://zh.wikipedia.org/wiki/%E7%A9%BF%E9%9A%A7%E5%8D%94%E8%AD%B0">穿隧协议</a></strong>，通过阻止截听与<strong><a title="嗅探" href="http://zh.wikipedia.org/wiki/%E5%97%85%E6%8E%A2">嗅探</a></strong>来提供<strong><a class="mw-redirect" title="机密性" href="http://zh.wikipedia.org/wiki/%E6%9C%BA%E5%AF%86%E6%80%A7">机密性</a></strong>，还允许发送者身份验证，以阻止身份伪造，同时通过防止信息被修改提供消息<strong><a title="完整性" href="http://zh.wikipedia.org/wiki/%E5%AE%8C%E6%95%B4%E6%80%A7">完整性</a></strong>。</p>
<p>某些虚拟私人网络不使用加密保护数据。虽然虚拟私人网络通常都会提供安全性，但<strong>未加密</strong>的虚拟私人网络严格来说是不“<strong><a title="信息安全" href="http://zh.wikipedia.org/wiki/%E4%BF%A1%E6%81%AF%E5%AE%89%E5%85%A8">安全</a></strong>”或“<strong><a title="可信计算" href="http://zh.wikipedia.org/wiki/%E5%8F%AF%E4%BF%A1%E8%AE%A1%E7%AE%97">可信</a></strong>”的。例如，一条通过<a title="通用路由封装" href="http://zh.wikipedia.org/wiki/%E9%80%9A%E7%94%A8%E8%B7%AF%E7%94%B1%E5%B0%81%E8%A3%85">GRE</a>协议在两台主机间创建的隧道属于虚拟私人网络，但既不安全也不可信。 除以上的GRE协议例子外，本地的明文穿隧协议包括<strong><a class="mw-redirect" title="L2TP" href="http://zh.wikipedia.org/wiki/L2TP">L2TP</a></strong>（不带IPsec时）和<strong>PPTP</strong>（不使用微软点对点加密(MPPE)时）。</p>
<h3>3、协议</h3>
<p>常用的虚拟专用网协议有：</p>
<ul>
<li><a title="L2F" href="http://zh.wikipedia.org/wiki/L2F">L2F</a></li>
<li><a title="第二层隧道协议" href="http://zh.wikipedia.org/wiki/%E7%AC%AC%E4%BA%8C%E5%B1%82%E9%9A%A7%E9%81%93%E5%8D%8F%E8%AE%AE">L2TP</a></li>
<li><strong><a title="点对点隧道协议" href="http://zh.wikipedia.org/wiki/%E9%BB%9E%E5%B0%8D%E9%BB%9E%E9%9A%A7%E9%81%93%E5%8D%94%E8%AD%B0">PPTP</a></strong></li>
<li><strong><a title="IPsec" href="http://zh.wikipedia.org/wiki/IPsec">IPsec</a></strong></li>
<li><a class="new" title="SSL VPN（页面不存在）" href="http://zh.wikipedia.org/w/index.php?title=SSL_VPN&amp;action=edit&amp;redlink=1">SSL VPN</a></li>
<li><a class="new" title="Cisco VPN（页面不存在）" href="http://zh.wikipedia.org/w/index.php?title=Cisco_VPN&amp;action=edit&amp;redlink=1">Cisco VPN</a></li>
<li><strong><a title="OpenVPN" href="http://zh.wikipedia.org/wiki/OpenVPN">OpenVPN</a></strong></li>
</ul>
<h3>4、<span id=".E7.89.B9.E6.AE.8A.E4.BD.BF.E7.94.A8" class="mw-headline">特殊使用</span></h3>
<p>由于<a class="mw-redirect" title="中华人民共和国网络审查" href="http://zh.wikipedia.org/wiki/%E4%B8%AD%E8%8F%AF%E4%BA%BA%E6%B0%91%E5%85%B1%E5%92%8C%E5%9C%8B%E7%B6%B2%E7%B5%A1%E5%AF%A9%E6%9F%A5">中国大陆境内对于海外网络的限制及封锁</a>，所以中国大陆兴盛起以采用免费或付费的虚拟专用网（VPN）进行海外网络连接服务的方法进行<a title="突破网络审查" href="http://zh.wikipedia.org/wiki/%E7%AA%81%E7%A0%B4%E7%BD%91%E7%BB%9C%E5%AE%A1%E6%9F%A5">翻墙</a>， 或许多外商公司欲连接回海外网站也多自行架设VPN或采用付费的VPN服务。2015年1月起，中国开始加强对外国VPN服务的封锁。VPN 供应商 Astrill 通知用户，因防火长城升级，使用 IPSec、L2TP/IPSec 和 PPTP 协议的设备无法访问它的服务，受影响的主要是iOS设备。中国工信部曾规定，在中国提供VPN服务的公司必须登记注册，否则将“不受中国法律的保护”。</p>
<h3 class="desc ">5、OpenVPN 的特点</h3>
<h3><strong>简介</strong></h3>
<p>OpenVPN 允许参与创建 VPN 的单点使用<strong>公开密钥、电子证书、</strong>或者<strong>用户名／密码</strong>来进行<strong>身份验证</strong>。 它大量使用了 OpenSSL 加密库中的 SSLv3/TLSv1 协议函数库。目前 OpenVPN 能在 Solaris、Linux、OpenBSD、FreeBSD、NetBSD、Mac OS X 和 Windows 上运行，并包含了许多安全性的功能。它并不是一个基于 Web 的 VPN 软件，也不与 IPsec 及其他 VPN 软件兼容。</p>
<h3><strong>加密</strong></h3>
<p>OpenVPN 使用 OpenSSL 库加密数据与控制信息：它使用了 OpenSSL 的加密以及验证功能，意味着，它能够使用任何 OpenSSL 支持的算法。它提供了可选的数据包 <strong><a href="http://zh.wikipedia.org/wiki/%E9%87%91%E9%91%B0%E9%9B%9C%E6%B9%8A%E8%A8%8A%E6%81%AF%E9%91%91%E5%88%A5%E7%A2%BC">HMAC</a> </strong>功能以提高连接的安全性。此外，OpenSSL 的硬件加速也能提高它的性能。</p>
<h3><strong>验证</strong></h3>
<p>OpenVPN 提供了多种身份验证方式，用以确认参与连接双方的身份，包括：<strong>预享私钥</strong>，<strong>第三方证书</strong>以及<strong>用户名／密码</strong>组 合。预享密钥最为简单，但同时它只能用于创建点对点的 VPN；基于 PKI 的第三方证书提供了最完善的功能，但是需要额外的精力去维护一个 PKI 证书体系。OpenVPN 2.0 后引入了用户名／口令组合的身份验证方式，它可以省略客户端证书，但是仍有一份服务器证书需要被用作加密。</p>
<h3><strong>网络</strong></h3>
<p><strong>OpenVPN 所有的通信都基于一个单一的 IP 端口</strong>，默认且推荐使用 <strong>UDP</strong> 协议通讯，同时 TCP 也被支持。OpenVPN 连接能通过大多数的代理服务器，并且能够在 NAT 的环境中很好地工作。服务端具有向客户端“推送”某些网络配置信息的功能，这些信息包括：<strong>IP地址、路由设置</strong>等。OpenVPN 提供了两种虚拟网络接口：通用 Tun/Tap 驱动，通过它们，可以创建三层 IP 隧道，或者虚拟二层以太网，后者可以传送任何类型的二层以太网络数据。传送的数据可通过<strong> LZO</strong> 算法压缩。IANA（Internet Assigned Numbers Authority）指定给 OpenVPN 的官方端口为 1194。OpenVPN 2.0 以后版本每个进程可以同时管理数个并发的隧道。 <strong>OpenVPN 使用通用网络协议（TCP与UDP）的特点使它成为IPsec 等协议的理想替代，尤其是在 ISP（Internet service provider）过滤某些特定VPN协议的情况下，如无视GFW。</strong></p>
<h3><strong>安全</strong></h3>
<p>OpenVPN 与生俱来便具备了许多安全特性：它在用户空间运行，<strong>无须对内核</strong>及<strong>网络协议栈</strong>作修改；初始完毕后以chroot方式运行，放弃root权限；使用 mlockall 以防止敏感数据交换到磁盘。<br />
OpenVPN 通过 PKCS#11支持硬件加密标识，如智能卡。</p>
<h3><strong>对比</strong></h3>
<table cellspacing="10">
<tbody>
<tr bgcolor="#808080">
<td></td>
<td>
<div><strong>PPTP</strong></div>
</td>
<td>
<div><strong>L2TP/IPSEC</strong></div>
</td>
<td>
<div><strong>OpenVPN</strong></div>
</td>
</tr>
<tr>
<td><strong>简介</strong></td>
<td>微软推出的第一个VPN协议。占用资源少，应用最为广泛。</td>
<td>更高级的VPN协议，支持各种平台。安全性更高，但是不太灵活，容易被封锁。</td>
<td>开源的 vpn 协议，加密性和适应性都比较好，也比较灵活，不容易被封锁。通过 udp 端口可以获得较好的速度。</td>
</tr>
<tr>
<td><strong>加密</strong></td>
<td>支持40位、56位和128位加密</td>
<td>256位加密</td>
<td>可自定义160位-256位</td>
</tr>
<tr>
<td><strong>平台支持</strong></td>
<td>
<ul>
<li>Windows</li>
<li>Mac</li>
<li>Linux</li>
<li>iOS</li>
<li>Android</li>
<li>DDWRT</li>
</ul>
</td>
<td>
<ul>
<li>Windows</li>
<li>Mac</li>
<li>Linux</li>
<li>iOS</li>
<li>Android</li>
</ul>
</td>
<td>
<ul>
<li>Windows（第三方软件）</li>
<li>Mac（第三方软件）</li>
<li>Linux</li>
<li>iOS（第三方软件）</li>
<li>Android（第三方软件）</li>
<li>DDWRT</li>
</ul>
</td>
</tr>
<tr>
<td><strong>连接速度</strong></td>
<td>很快</td>
<td>快</td>
<td>快</td>
</tr>
<tr>
<td><strong>端口</strong></td>
<td>1723 TCP</td>
<td>500 UDP<br />
1701 UDP<br />
5500 UDP</td>
<td>可根据需要自定义 和 更换，即 UDP/TCP的任何端口</td>
</tr>
<tr>
<td><strong>防封锁</strong></td>
<td>通过协议和端口很容易被封锁</td>
<td>通过协议和端口很容易被封锁</td>
<td>比较难封锁（基于标准的TCP/IP协议），其 UDP 模式是官方推荐的，速度很快，效率很高。</td>
</tr>
</tbody>
</table>
</div>
<footer class="entry-footer"></footer>
<footer class="entry-footer">
<h3 class="title-post">OpenVPN 的安装和配置（Windows 和 Linux 客户端连接 OpenVPN 服务器）</h3>
<div class="entry-content">
<h3>1、OpenVPN 官网</h3>
<p><a href="http://openvpn.net/">http://openvpn.net/</a> ，非常不幸，已被墙。</p>
<p>Windows 客户端<a href="https://community.openvpn.net/openvpn/wiki/OpenVPN-GUI"> https://community.openvpn.net/openvpn/wiki/OpenVPN-GUI</a> ，<a href="http://sourceforge.net/projects/openvpn-gui/">下载地址</a>。</p>
<h3>2、OpenVPN 安装</h3>
<h3>源码（安装包）</h3>
<p>下载地址： <a href="http://openvpn.net/index.php/open-source/downloads.html">http://openvpn.net/index.php/open-source/downloads.html</a></p>
<h3>RPM 安装(CentOS)：</h3>
<p>下面以 CentOS 5 的证书模式为例：</p>
<h4><strong>1）安装</strong>（客户端与服务器端安装方式一致）</h4>
<p>&nbsp;</p>
<p>a)  rpm 包方式</p>
<p><span class="pln">                   rpm </span><span class="pun">–</span><span class="pln">ivh lzo</span><span class="pun">–</span><span class="lit">2.03</span><span class="pun">–</span><span class="lit">3.1</span><span class="pun">.</span><span class="pln">el6_5</span><span class="pun">.</span><span class="lit">1.x86</span><span class="pln">_64</span><span class="pun">.</span><span class="pln">rpm openvpn</span><span class="pun">–</span><span class="lit">2.3</span><span class="pun">.</span><span class="lit">2</span><span class="pun">–</span><span class="lit">2.el6.x86</span><span class="pln">_64</span><span class="pun">.</span><span class="pln">rpm pkcs11</span><span class="pun">–</span><span class="pln">helper</span><span class="pun">–</span><span class="lit">1.08</span><span class="pun">–</span><span class="lit">1.el6.rf</span><span class="pun">.</span><span class="pln">x86_64</span><span class="pun">.</span><span class="pln">rpm</span></p>
<p>&nbsp;</p>
<p>b)  yum 方式（需要 rpmforge 源）</p>
<p><span class="pln">                   rpm </span><span class="pun">–</span><span class="pln">ivh http</span><span class="pun">:</span><span class="com">//apt.sw.be/redhat/el5/en/i386/rpmforge/RPMS/rpmforge-release-0.5.3-1.el5.rf.i386.rpm</span></p>
<p><span class="pln">                   yum makecache</span></p>
<p><span class="pln">                   yum install openvpn </span><span class="pun">–</span><span class="pln">y</span></p>
<p>&nbsp;</p>
<p><span class="pun"><span class="pln">                   </span>安装了以下</span><span class="lit">3</span><span class="pun">个包（可能由于更新，版本号会高一些）：</span></p>
<p><span class="pun"><span class="pln">                   </span>(</span><span class="lit">1</span><span class="pun">/</span><span class="lit">3</span><span class="pun">):</span><span class="pln"> lzo</span><span class="pun">–</span><span class="lit">2.03</span><span class="pun">–</span><span class="lit">3.1</span><span class="pun">.</span><span class="pln">el6</span><span class="pun">.</span><span class="pln">x86_64</span><span class="pun">.</span><span class="pln">rpm</span></p>
<p><span class="pun"><span class="pln">                   </span>(</span><span class="lit">2</span><span class="pun">/</span><span class="lit">3</span><span class="pun">):</span><span class="pln"> openvpn</span><span class="pun">–</span><span class="lit">2.2</span><span class="pun">.</span><span class="lit">2</span><span class="pun">–</span><span class="lit">1.el6.rf</span><span class="pun">.</span><span class="pln">x86_64</span><span class="pun">.</span><span class="pln">rpm</span></p>
<p><span class="pun"><span class="pln">                   </span>(</span><span class="lit">3</span><span class="pun">/</span><span class="lit">3</span><span class="pun">):</span><span class="pln"> pkcs11</span><span class="pun">–</span><span class="pln">helper</span><span class="pun">–</span><span class="lit">1.08</span><span class="pun">–</span><span class="lit">1.el6.rf</span><span class="pun">.</span><span class="pln">x86_64</span><span class="pun">.</span><span class="pln">rpm</span></p>
<p>&nbsp;</p>
<h4><strong>2）服务器配置</strong></h4>
<p>a)  证书制作，上传制作 key 的工具 （easy-rsa.zip）（至<strong>OpenVPN 的默认工作目录是 /etc/openvpn/</strong>），并解压 easy-rsa.zip：</p>
<p><span class="pln">                   cd </span><span class="pun">/</span><span class="pln">etc</span><span class="pun">/</span><span class="pln">openvpn</span><span class="pun">/</span></p>
<p><span class="pln">                   unzip easy</span><span class="pun">–</span><span class="pln">rsa</span><span class="pun">.</span><span class="pln">zip</span></p>
<p><span class="pln">                   cd </span><span class="pun">/</span><span class="pln">etc</span><span class="pun">/</span><span class="pln">openvpn</span><span class="pun">/</span><span class="pln">easy</span><span class="pun">–</span><span class="pln">rsa</span><span class="pun">/</span><span class="lit">2.0</span></p>
<p><span class="pln">                   chmod </span><span class="pun">+</span><span class="pln">x </span><span class="pun">*</span></p>
<p>&nbsp;</p>
<p>或者使用 yum 安装</p>
<p>yum install easy-rsa -y</p>
<p>cd /usr/share/</p>
<p>cp -a easy-rsa/ /etc/openvpn/</p>
<p>cd easy-rsa/2.0/</p>
<p>接下来的操作与上面类似。</p>
<p>&nbsp;</p>
<p>b)  配置服务器端证书：</p>
<p><span class="pln">                   cd </span><span class="pun">/</span><span class="pln">etc</span><span class="pun">/</span><span class="pln">openvpn</span><span class="pun">/easy-rsa/2.0</span></p>
<p><span class="pln">                   source </span><span class="pun">./</span><span class="pln">vars                                </span><span class="com">// 初始化环境变量</span></p>
<p><span class="pun"><span class="pln">                   </span>./</span><span class="pln">clean</span><span class="pun">-all</span><span class="pln">                                     </span><span class="com">// 清空keys目录</span></p>
<p><span class="pun"><span class="pln">                   ./build-ca server</span></span><span class="pln">                        </span><span class="com">// 创建CA</span></p>
<p><span class="pun"><span class="pln">                   </span>./</span><span class="pln">build</span><span class="pln"><span class="pun">-k</span>ey</span><span class="pun">-s</span><span class="pln">erver server       </span><span class="com">// 生成服务器证书,都是默认回车，最后2次是按y</span></p>
<p><span class="pun"><span class="pln">                   </span>./</span><span class="pln">build</span><span class="pun">-k</span><span class="pln">ey client1                   </span><span class="com">// 生成客户端证书,都是默认回车，最后2次是按y</span></p>
<p><span class="pun"><span class="pln">                   </span>./</span><span class="pln">build</span><span class="pun">-d</span><span class="pln">h                                   </span><span class="com">// 最后生成Diffie Hellman参数</span></p>
<p>c)  新增客户端证书：</p>
<p>cd /etc/openvpn/easy-rsa/2.0</p>
<p><span class="pln">                   source </span><span class="pun">./</span><span class="pln">vars                           </span><span class="com">// 初始化环境变量</span></p>
<p><span class="pun"><span class="pln">                   ./build-key client2</span></span><span class="pln">               </span><span class="com">// 生成客户端证书,都是默认回车，最后2次是按y</span></p>
<p>d)  Server 端配置文件，到 <code>/etc/openvpn/</code> 目录下新建 server.conf 文件（OpenVPN 默认会识别 .conf 结尾的文件，所以可以创建多个 .conf 以监听多个端口，即实例）</p>
<p>port 1194</p>
<p>proto udp</p>
<p>dev tun</p>
<p>ca /etc/openvpn/easy-rsa/2.0/keys/ca.crt</p>
<p>cert /etc/openvpn/easy-rsa/2.0/keys/server.crt</p>
<p>key /etc/openvpn/easy-rsa/2.0/keys/server.key</p>
<p>dh /etc/openvpn/easy-rsa/2.0/keys/dh2048.pem</p>
<p>server 10.10.0.0 255.255.0.0</p>
<p>ifconfig-pool-persist ipp.txt</p>
<p>client-config-dir ccd</p>
<p>client-to-client</p>
<p>keepalive 10 120</p>
<p>comp-lzo</p>
<p>user nobody</p>
<p>group nobody</p>
<p>persist-key</p>
<p>persist-tun</p>
<p>status openvpn-status.log</p>
<p>log         openvpn.log</p>
<p>verb 3</p>
<p>script-security 2</p>
<p>d)  启动 OpenVPN 服务器</p>
<p><span class="com"><span class="pln"><span class="pun">                   </span></span># 创建 ccd 目录</span></p>
<p><span class="pln"><span class="pun">                   </span>cd </span><span class="pun">/</span><span class="pln">etc</span><span class="pun">/</span><span class="pln">openvpn</span><span class="pun">/</span></p>
<p><span class="pln"><span class="pun">                   </span>mkdir ccd</span></p>
<p><span class="com"><span class="pln"><span class="pun">                   </span></span># 启动 OpenVPN 服务</span></p>
<p><span class="pln"><span class="pun">                   </span>service openvpn start</span></p>
<p><span class="com"><span class="pln"><span class="pun">                   </span></span># 查看监听端口</span></p>
<p><span class="pln"><span class="pun">                   </span>netstat </span><span class="pun">–</span><span class="pln">tunlp </span><span class="pun">|</span><span class="pln"> grep openvpn</span></p>
<p><span class="com"><span class="pln"><span class="pun">                   </span></span># 可能看到如下</span></p>
<p><span class="pun"><span class="pln">                   </span>[</span><span class="pln">root@node </span><span class="pun">~]#</span><span class="pln"> netstat </span><span class="pun">–</span><span class="pln">tunlp </span><span class="pun">|</span><span class="pln"> grep openvpn</span></p>
<p><span class="pln"><span class="pun">                   </span>udp      </span><span class="lit">0</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="lit">0.0</span><span class="pun">.</span><span class="lit">0.0</span><span class="pun">:</span><span class="lit">1194</span><span class="pln">        </span><span class="lit">0.0</span><span class="pun">.</span><span class="lit">0.0</span><span class="pun">:*</span><span class="pln">      </span><span class="lit">1625</span><span class="pun">/</span><span class="pln">openvpn</span></p>
<p><span class="com"><span class="pln"><span class="pun">                   </span></span># 设置开机启动</span></p>
<p><span class="pln"><span class="pun">                   </span>chkconfig openvpn on</span></p>
<p>到此，服务器端配置完毕。</p>
<h4><strong>3）客户端配置</strong></h4>
<p>Windows 客户端下载</p>
<p>a) 创建客户端配置文件</p>
<p>Linux 配置文件样例：</p>
<p>cd /etc/openvpn</p>
<p>cat &gt;&gt; client1.ovpn &lt;&lt; EOF</p>
<p>client</p>
<p>dev tun</p>
<p>proto udp</p>
<p>remote vpn.openvpnserver.com 1194</p>
<p>resolv-retry infinite</p>
<p>nobind</p>
<p>persist-key</p>
<p>persist-tun</p>
<p>ca  ca.crt</p>
<p>cert client1.crt</p>
<p>key client1.key</p>
<p>log openvpn-client.log</p>
<p>comp-lzo</p>
<p>script-security 2</p>
<p>verb 3</p>
<p>EOF</p>
<p>Windows 配置文件样例：</p>
<p>client<br />
dev tun<br />
proto tcp-client<br />
remote vpn.openvpnserver.com 1194<br />
resolv-retry infinite<br />
nobind<br />
persist-key<br />
persist-tun<br />
ca ca.crt<br />
cert client1.crt<br />
key client1.key<br />
comp-lzo<br />
script-security 2<br />
verb 3</p>
<p>b) 上传证书</p>
<p>由客户端配置文件可知，涉及3个文件 ca.crt、client1.crt 和 client1.key，这3个文件都是生成服务器的 <code>/etc/openvpn/easy-rsa/2.0/keys/</code> 目录下 。</p>
<p>将服务器端的 /etc/openvpn/easy-rsa/2.0/keys/ 下的3个文件：<br />
<code>ca.crt</code><br />
<code> client1.crt</code><br />
<code> client1.key</code><br />
和上面的client1.ovpn共四个文件放入：<code>/etc/openvpn/</code></p>
<p>所以在客户端（Linux）的 <code>/etc/openvpn/</code> 目录下应该有<strong> ca.crt、client1.crt、client1.key</strong> 和 <strong>client1.ovpn</strong> 共 4 个文件。</p>
<p>Win64 系统目录：<br />
C:\Program Files (x86)\OpenVPN\config<br />
Win32 系统目录：<br />
C:\Program Files\OpenVPN\config</p>
<p>c) 启动客户端</p>
<p><strong>Linux:</strong></p>
<p><span class="com"># 启动</span></p>
<p><span class="pln">cd </span><span class="pun">/</span><span class="pln">etc</span><span class="pun">/</span><span class="pln">openvpn</span></p>
<p><span class="pln">openvpn client1</span><span class="pun">.</span><span class="pln">ovpn </span><span class="pun">&amp;</span></p>
<p><span class="pln"> </span></p>
<p><span class="com"># 启动后，正常情况下将看到类似以下显示：</span></p>
<p><span class="pun">[</span><span class="pln">root@node home</span><span class="pun">]#</span><span class="pln"> ifconfig tun0</span></p>
<p><span class="pln">tun0      </span><span class="typ">Link</span><span class="pln"> encap</span><span class="pun">:</span><span class="pln">UNSPEC  </span><span class="typ">HWaddr</span><span class="pln"> </span><span class="lit">00</span><span class="pun">–</span><span class="lit">00</span><span class="pun">–</span><span class="lit">00</span><span class="pun">–</span><span class="lit">00</span><span class="pun">–</span><span class="lit">00</span><span class="pun">–</span><span class="lit">00</span><span class="pun">–</span><span class="lit">00</span><span class="pun">–</span><span class="lit">00</span><span class="pun">–</span><span class="lit">00</span><span class="pun">–</span><span class="lit">00</span><span class="pun">–</span><span class="lit">00</span><span class="pun">–</span><span class="lit">00</span><span class="pun">–</span><span class="lit">00</span><span class="pun">–</span><span class="lit">00</span><span class="pun">–</span><span class="lit">00</span><span class="pun">–</span><span class="lit">00</span><span class="pln">  </span></p>
<p><span class="pln">          inet addr</span><span class="pun">:</span><span class="lit">10.18</span><span class="pun">.</span><span class="lit">1.98</span><span class="pln">  P</span><span class="pun">–</span><span class="pln">t</span><span class="pun">–</span><span class="pln">P</span><span class="pun">:</span><span class="lit">10.10</span><span class="pun">.</span><span class="lit">1.97</span><span class="pln">  </span><span class="typ">Mask</span><span class="pun">:</span><span class="lit">255.255</span><span class="pun">.</span><span class="lit">255.255</span></p>
<p><span class="pln">          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU</span><span class="pun">:</span><span class="lit">1500</span><span class="pln">  </span><span class="typ">Metric</span><span class="pun">:</span><span class="lit">1</span></p>
<p><span class="pln">          RX packets</span><span class="pun">:</span><span class="lit">2848</span><span class="pln"> errors</span><span class="pun">:</span><span class="lit">0</span><span class="pln"> dropped</span><span class="pun">:</span><span class="lit">0</span><span class="pln"> overruns</span><span class="pun">:</span><span class="lit">0</span><span class="pln"> frame</span><span class="pun">:</span><span class="lit">0</span></p>
<p><span class="pln">          TX packets</span><span class="pun">:</span><span class="lit">2842</span><span class="pln"> errors</span><span class="pun">:</span><span class="lit">0</span><span class="pln"> dropped</span><span class="pun">:</span><span class="lit">0</span><span class="pln"> overruns</span><span class="pun">:</span><span class="lit">0</span><span class="pln"> carrier</span><span class="pun">:</span><span class="lit">0</span></p>
<p><span class="pln">          collisions</span><span class="pun">:</span><span class="lit">0</span><span class="pln"> txqueuelen</span><span class="pun">:</span><span class="lit">100</span><span class="pln"> </span></p>
<p><span class="pln">          RX bytes</span><span class="pun">:</span><span class="lit">881475</span><span class="pln"> </span><span class="pun">(</span><span class="lit">860.8</span><span class="pln"> </span><span class="typ">KiB</span><span class="pun">)</span><span class="pln">  TX bytes</span><span class="pun">:</span><span class="lit">924210</span><span class="pln"> </span><span class="pun">(</span><span class="lit">902.5</span><span class="pln"> </span><span class="typ">KiB</span><span class="pun">)</span></p>
<p><span class="pln"> </span></p>
<p><span class="com"># 开机启动</span></p>
<p><span class="pln">cat </span><span class="pun">&gt;&gt;</span><span class="pln"> </span><span class="str">/etc/</span><span class="pln">rc</span><span class="pun">.</span><span class="kwd">local</span><span class="pln"> </span><span class="pun">&lt;&lt;</span><span class="pln"> EOF</span></p>
<p><span class="pln">cd </span><span class="pun">/</span><span class="pln">etc</span><span class="pun">/</span><span class="pln">openvpn</span></p>
<p><span class="pln">openvpn client1</span><span class="pun">.</span><span class="pln">ovpn </span><span class="pun">&amp;</span></p>
<p><span class="pln">EOF</span></p>
<p><strong>Windows:</strong></p>
<p>Windows 7 和 8.1 需要以管理员权限运行</p>
<p>双击图标 <img src="http://www.linux-mac.com/wp-content/uploads/2015/05/openvpn2.jpg" alt="" /> 运行；</p>
<p>红色<a href="https://www.fuwuqiok.com/wp-content/uploads/2015/12/openvpn3-1.jpg"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2015/12/openvpn3-1.jpg" alt="openvpn3-1" width="198" height="40" /></a>表示未连接服务器；</p>
<p>黄色<a href="https://www.fuwuqiok.com/wp-content/uploads/2015/12/openvpn3-2.jpg"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2015/12/openvpn3-2.jpg" alt="openvpn3-2" width="195" height="40" /></a>表示正在连接 OpenVPN服务器；</p>
<p>绿色<a href="https://www.fuwuqiok.com/wp-content/uploads/2015/12/openvpn5.jpg"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2015/12/openvpn5.jpg" alt="openvpn5" width="196" height="40" /></a>表示已经连上OpenVPN服务器；</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2015/12/openvpn4.png"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2015/12/openvpn4.png" alt="openvpn4" width="586" height="379" /></a></p>
<p>上图中的日 <code>Wed May 13 14:44:19 2015 Successful ARP Flush on interface [23] {CACC8C9F-1609-484A-8606-2A2748A7A868}</code> 表示连接成功，图标也会变绿色。</p>
</div>
</footer>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/openvpn%e5%ae%89%e8%a3%85%e9%85%8d%e7%bd%ae%e6%95%99%e7%a8%8b/">OpenVPN安装配置教程</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></content:encoded>
			<wfw:commentRss>https://www.fuwuqiok.com/openvpn%e5%ae%89%e8%a3%85%e9%85%8d%e7%bd%ae%e6%95%99%e7%a8%8b/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>使用 supervisor 管理进程</title>
		<link>https://www.fuwuqiok.com/%e4%bd%bf%e7%94%a8-supervisor-%e7%ae%a1%e7%90%86%e8%bf%9b%e7%a8%8b/</link>
		<comments>https://www.fuwuqiok.com/%e4%bd%bf%e7%94%a8-supervisor-%e7%ae%a1%e7%90%86%e8%bf%9b%e7%a8%8b/#comments</comments>
		<pubDate>Tue, 08 Dec 2015 14:18:36 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[使用 supervisor 管理进程]]></category>
		<category><![CDATA[系统安全]]></category>

		<guid isPermaLink="false">https://www.fuwuqiok.com/?p=2811</guid>
		<description><![CDATA[<p>Supervisor (http://supervisord.org) 是一个用 Python 写的进程管理工 [&#8230;]</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e4%bd%bf%e7%94%a8-supervisor-%e7%ae%a1%e7%90%86%e8%bf%9b%e7%a8%8b/">使用 supervisor 管理进程</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></description>
				<content:encoded><![CDATA[<div class="entry-content">
<p>Supervisor (<a href="http://supervisord.org">http://supervisord.org</a>) 是一个用 Python 写的进程管理工具，可以很方便的用来启动、重启、关闭进程（不仅仅是 Python 进程）。除了对单个进程的控制，还可以同时启动、关闭多个进程，比如很不幸的服务器出问题导致所有应用程序都被杀死，此时可以用 supervisor 同时启动所有应用程序而不是一个一个地敲命令启动。</p>
<h2 id="安装:0374c09b00e8eddcfa304907db4e0a23">安装</h2>
<p>Supervisor 可以运行在 Linux、Mac OS X 上。如前所述，supervisor 是 Python 编写的，所以安装起来也很方便，可以直接用 pip :</p>
<pre><code class="language-bash hljs">sudo pip install supervisor
</code></pre>
<p>如果是 Ubuntu 系统，还可以使用 apt-get 安装。</p>
<h2 id="supervisord-配置:0374c09b00e8eddcfa304907db4e0a23">supervisord 配置</h2>
<p>Supervisor 相当强大，提供了很丰富的功能，不过我们可能只需要用到其中一小部分。安装完成之后，可以编写配置文件，来满足自己的需求。为了方便，我们把配置分成两部 分：supervisord（supervisor 是一个 C/S 模型的程序，这是 server 端，对应的有 client 端：supervisorctl）和应用程序（即我们要管理的程序）。</p>
<p>首先来看 supervisord 的配置文件。安装完 supervisor 之后，可以运行<code>echo_supervisord_conf</code> 命令输出默认的配置项，也可以重定向到一个配置文件里：</p>
<pre><code class="language-bash hljs"><span class="hljs-built_in">echo</span>_supervisord_conf &gt; /etc/supervisord.conf
</code></pre>
<p>去除里面大部分注释和“不相关”的部分，我们可以先看这些配置：</p>
<pre><code class="language-ini hljs"><span class="hljs-title">[unix_http_server]</span>
<span class="hljs-setting">file=<span class="hljs-value">/tmp/supervisor.sock   ; UNIX socket 文件，supervisorctl 会使用</span></span>
<span class="hljs-comment">;chmod=0700                 ; socket 文件的 mode，默认是 0700</span>
<span class="hljs-comment">;chown=nobody:nogroup       ; socket 文件的 owner，格式： uid:gid</span>

<span class="hljs-comment">;[inet_http_server]         ; HTTP 服务器，提供 web 管理界面</span>
<span class="hljs-comment">;port=127.0.0.1:9001        ; Web 管理后台运行的 IP 和端口，如果开放到公网，需要注意安全性</span>
<span class="hljs-comment">;username=user              ; 登录管理后台的用户名</span>
<span class="hljs-comment">;password=123               ; 登录管理后台的密码</span>
<span class="hljs-title">
[supervisord]</span>
<span class="hljs-setting">logfile=<span class="hljs-value">/tmp/supervisord.log ; 日志文件，默认是 <span class="hljs-variable">$CWD</span>/supervisord.log</span></span>
<span class="hljs-setting">logfile_maxbytes=<span class="hljs-value"><span class="hljs-number">50</span>MB        ; 日志文件大小，超出会 rotate，默认 <span class="hljs-number">50</span>MB</span></span>
<span class="hljs-setting">logfile_backups=<span class="hljs-value"><span class="hljs-number">10</span>           ; 日志文件保留备份数量默认 <span class="hljs-number">10</span></span></span>
<span class="hljs-setting">loglevel=<span class="hljs-value">info                ; 日志级别，默认 info，其它: debug,warn,trace</span></span>
<span class="hljs-setting">pidfile=<span class="hljs-value">/tmp/supervisord.pid ; pid 文件</span></span>
<span class="hljs-setting">nodaemon=<span class="hljs-value"><span class="hljs-keyword">false</span>               ; 是否在前台启动，默认是 <span class="hljs-keyword">false</span>，即以 daemon 的方式启动</span></span>
<span class="hljs-setting">minfds=<span class="hljs-value"><span class="hljs-number">1024</span>                  ; 可以打开的文件描述符的最小值，默认 <span class="hljs-number">1024</span></span></span>
<span class="hljs-setting">minprocs=<span class="hljs-value"><span class="hljs-number">200</span>                 ; 可以打开的进程数的最小值，默认 <span class="hljs-number">200</span></span></span>

<span class="hljs-comment">; the below section must remain in the config file for RPC</span>
<span class="hljs-comment">; (supervisorctl/web interface) to work, additional interfaces may be</span>
<span class="hljs-comment">; added by defining them in separate rpcinterface: sections</span>
<span class="hljs-title">[rpcinterface:supervisor]</span>
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
<span class="hljs-title">
[supervisorctl]</span>
<span class="hljs-setting">serverurl=<span class="hljs-value">unix:///tmp/supervisor.sock ; 通过 UNIX socket 连接 supervisord，路径与 unix_http_server 部分的 file 一致</span></span>
<span class="hljs-comment">;serverurl=http://127.0.0.1:9001 ; 通过 HTTP 的方式连接 supervisord</span>

<span class="hljs-comment">; 包含其他的配置文件</span>
<span class="hljs-title">[include]</span>
<span class="hljs-setting">files = <span class="hljs-value">relative/directory/*.ini    ; 可以是 *.conf 或 *.ini</span></span>
</code></pre>
<p>我们把上面这部分配置保存到 /etc/supervisord.conf（或其他任意有权限访问的文件），然后启动 supervisord（通过 -c 选项指定配置文件路径，如果不指定会按照这个顺序查找配置文件：$CWD/supervisord.conf, $CWD/etc/supervisord.conf, /etc/supervisord.conf）：</p>
<pre><code class="language-bash hljs">supervisord -c /etc/supervisord.conf
</code></pre>
<p>查看 supervisord 是否在运行：</p>
<pre><code class="language-bash hljs">ps aux | grep supervisord
</code></pre>
<h2 id="program-配置:0374c09b00e8eddcfa304907db4e0a23">program 配置</h2>
<p>上面我们已经把 supervisrod 运行起来了，现在可以添加我们要管理的进程的配置文件。可以把所有配置项都写到 supervisord.conf 文件里，但并不推荐这样做，而是通过 include 的方式把不同的程序（组）写到不同的配置文件里。</p>
<p>为了举例，我们新建一个目录 /etc/supervisor/ 用于存放这些配置文件，相应的，把 /etc/supervisord.conf 里 include 部分的的配置修改一下：</p>
<pre><code class="hljs ini"><span class="hljs-title">[include]</span>
<span class="hljs-setting">files = <span class="hljs-value">/etc/supervisor/*.conf</span></span>
</code></pre>
<p>假设有个用 Python 和 Flask 框架编写的用户中心系统，取名 usercenter，用 gunicorn (<a href="http://gunicorn.org/">http://gunicorn.org/</a>) 做 web 服务器。项目代码位于 <code>/home/leon/projects/usercenter</code>，gunicorn 配置文件为 <code>gunicorn.py</code>，WSGI callable 是 wsgi.py 里的 app 属性。所以直接在命令行启动的方式可能是这样的：</p>
<pre><code class="language-bash hljs"><span class="hljs-built_in">cd</span> /home/leon/projects/usercenter
gunicorn -c gunicorn.py wsgi:app
</code></pre>
<p>现在编写一份配置文件来管理这个进程（<strong>需要注意：用 supervisord 管理时，gunicorn 的 daemon 选项需要设置为 False</strong>）：</p>
<pre><code class="language-ini hljs"><span class="hljs-title">[program:usercenter]</span>
<span class="hljs-setting">directory = <span class="hljs-value">/home/leon/projects/usercenter ; 程序的启动目录</span></span>
<span class="hljs-setting">command = <span class="hljs-value">gunicorn -c gunicorn.py wsgi:app  ; 启动命令，可以看出与手动在命令行启动的命令是一样的</span></span>
<span class="hljs-setting">autostart = <span class="hljs-value"><span class="hljs-keyword">true</span>     ; 在 supervisord 启动的时候也自动启动</span></span>
<span class="hljs-setting">startsecs = <span class="hljs-value"><span class="hljs-number">5</span>        ; 启动 <span class="hljs-number">5</span> 秒后没有异常退出，就当作已经正常启动了</span></span>
<span class="hljs-setting">autorestart = <span class="hljs-value"><span class="hljs-keyword">true</span>   ; 程序异常退出后自动重启</span></span>
<span class="hljs-setting">startretries = <span class="hljs-value"><span class="hljs-number">3</span>     ; 启动失败自动重试次数，默认是 <span class="hljs-number">3</span></span></span>
<span class="hljs-setting">user = <span class="hljs-value">leon          ; 用哪个用户启动</span></span>
<span class="hljs-setting">redirect_stderr = <span class="hljs-value"><span class="hljs-keyword">true</span>  ; 把 stderr 重定向到 stdout，默认 <span class="hljs-keyword">false</span></span></span>
<span class="hljs-setting">stdout_logfile_maxbytes = <span class="hljs-value"><span class="hljs-number">20</span>MB  ; stdout 日志文件大小，默认 <span class="hljs-number">50</span>MB</span></span>
<span class="hljs-setting">stdout_logfile_backups = <span class="hljs-value"><span class="hljs-number">20</span>     ; stdout 日志文件备份数</span></span>
<span class="hljs-comment">; stdout 日志文件，需要注意当指定目录不存在时无法正常启动，所以需要手动创建目录（supervisord 会自动创建日志文件）</span>
<span class="hljs-setting">stdout_logfile = <span class="hljs-value">/data/logs/usercenter_stdout.log</span></span>

<span class="hljs-comment">; 可以通过 environment 来添加需要的环境变量，一种常见的用法是修改 PYTHONPATH</span>
<span class="hljs-comment">; environment=PYTHONPATH=$PYTHONPATH:/path/to/somewhere</span>
</code></pre>
<p>一份配置文件至少需要一个 <code>[program:x]</code> 部分的配置，来告诉 supervisord 需要管理那个进程。<code>[program:x]</code> 语法中的 <code>x</code> 表示 program name，会在客户端（supervisorctl 或 web 界面）显示，在 supervisorctl 中通过这个值来对程序进行 start、restart、stop 等操作。</p>
<h2 id="使用-supervisorctl:0374c09b00e8eddcfa304907db4e0a23">使用 supervisorctl</h2>
<p>Supervisorctl 是 supervisord 的一个命令行客户端工具，启动时需要指定与 supervisord 使用同一份配置文件，否则与 supervisord 一样按照顺序查找配置文件。</p>
<pre><code class="language-bash hljs">supervisorctl -c /etc/supervisord.conf
</code></pre>
<p>上面这个命令会进入 supervisorctl 的 shell 界面，然后可以执行不同的命令了：</p>
<pre><code class="language-bash hljs">&gt; status    <span class="hljs-comment"># 查看程序状态</span>
&gt; stop usercenter   <span class="hljs-comment"># 关闭 usercenter 程序</span>
&gt; start usercenter  <span class="hljs-comment"># 启动 usercenter 程序</span>
&gt; restart usercenter    <span class="hljs-comment"># 重启 usercenter 程序</span>
&gt; reread    ＃ 读取有更新（增加）的配置文件，不会启动新添加的程序
&gt; update    ＃ 重启配置文件修改过的程序
</code></pre>
<p>上面这些命令都有相应的输出，除了进入 supervisorctl 的 shell 界面，也可以直接在 bash 终端运行：</p>
<pre><code class="language-bash hljs">$ supervisorctl status
$ supervisorctl stop usercenter
$ supervisorctl start usercenter
$ supervisorctl restart usercenter
$ supervisorctl reread
$ supervisorctl update 
</code></pre>
<h2 id="其它:0374c09b00e8eddcfa304907db4e0a23">其它</h2>
<p>除了 supervisorctl 之外，还可以配置 supervisrod 启动 web 管理界面，这个 web 后台使用 Basic Auth 的方式进行身份认证。</p>
<p>除了单个进程的控制，还可以配置 group，进行分组管理。</p>
<p>经常查看日志文件，包括 supervisord 的日志和各个 pragram 的日志文件，程序 crash 或抛出异常的信息一半会输出到 stderr，可以查看相应的日志文件来查找问题。</p>
<p>Supervisor 有很丰富的功能，还有其他很多项配置，可以在官方文档获取更多信息：<a href="http://supervisord.org/index.html">http://supervisord.org/index.html</a></p>
</div>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e4%bd%bf%e7%94%a8-supervisor-%e7%ae%a1%e7%90%86%e8%bf%9b%e7%a8%8b/">使用 supervisor 管理进程</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></content:encoded>
			<wfw:commentRss>https://www.fuwuqiok.com/%e4%bd%bf%e7%94%a8-supervisor-%e7%ae%a1%e7%90%86%e8%bf%9b%e7%a8%8b/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>搭建 https proxy 服务器</title>
		<link>https://www.fuwuqiok.com/%e6%90%ad%e5%bb%ba-https-proxy-%e6%9c%8d%e5%8a%a1%e5%99%a8/</link>
		<comments>https://www.fuwuqiok.com/%e6%90%ad%e5%bb%ba-https-proxy-%e6%9c%8d%e5%8a%a1%e5%99%a8/#comments</comments>
		<pubDate>Tue, 01 Dec 2015 14:24:25 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[搭建 https proxy 服务器]]></category>
		<category><![CDATA[系统安全]]></category>

		<guid isPermaLink="false">https://www.fuwuqiok.com/?p=2789</guid>
		<description><![CDATA[<p>在各种上网的方法当中，https proxy 可能是最简单、方便、快速的，它免去了 vpn 各种拨号连接的麻烦 [&#8230;]</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e6%90%ad%e5%bb%ba-https-proxy-%e6%9c%8d%e5%8a%a1%e5%99%a8/">搭建 https proxy 服务器</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></description>
				<content:encoded><![CDATA[<p>在各种上网的方法当中，https proxy 可能是最简单、方便、快速的，它免去了 vpn 各种拨号连接的麻烦，也免去了安装各种客户端的麻烦，同时搭建所用的软件也是历史悠久的非常稳定。</p>
<p>吐槽：如果问为什么这么好的方式却很少人用，答案可能是因为它需要较多的￥money，而且可能需要一张双币/多币种信用卡来购买这些东西：一个虚拟服务器 vps，一个域名，一个 SSL 证书。vps 我比较推荐 linode，并不是因为你戳一下这个链接并成功购买后能返回一点零钱给我，而是 linode 相当厚道，它会跟随主流免费为你升级 CPU、内存、硬盘、带宽等等。域名和 SSL 证书大家可以参考我的前一篇《如何购买廉价 SSL 证书》。全部扔上购物车一年大概 $150 以上，捉襟见肘的可以考虑多人合购。</p>
<p>好了说回正题，用于实现 https proxy 的服务端软件很多，可以用老掉牙但很稳定的 squid，也可以随便用一个轻量级的 http proxy 程序搭配老掉牙的 stunnel，或者试试新秀 node-spdyproxy 也可以。</p>
<p>下面介绍一下比较简单的方案：轻量级 http proxy 程序 tinyproxy + stunnel 。</p>
<h2>1、安装 tinyproxy 和 stunnel</h2>
<p>首先使用各个 Linux 发行版的包管理器安装 tinyproxy 和 stunnel，比如：</p>
<pre lang="bash">$ sudo yum install tinyproxy stunnel // 对于 centos linux

$ sudo pacman -S tinyproxy stunnel // 对于 arch linux</pre>
<p>&nbsp;</p>
<p>安装完成后顺便设置它们随开机启动（可选）。</p>
<h2>2、设置 stunnel</h2>
<p>把你证书私钥和购买的证书扔到 /etc/stunnel 里，然后编辑文件 stunnel.conf，先指定私钥和证书文件名：</p>
<p>cert = /etc/stunnel/mycert.pem<br />
key = /etc/stunnel/mykey.pem</p>
<p>需要注意的是从证书服务商购买回来的证书通常是几个小文件，大概有是：一个你的域名证书，一个证书链证书，一个root证书。把它们用文本编辑器打开，然后按照上述的顺序复制粘贴成一个文件，这个文件就是上面 ”cert=“ 这行所需的文件。</p>
<p>然后指定端口转换，比如将端口 443 （https 的默认端口）绑定并转换到 tinyproxy 的默认端口 8888：</p>
[https]
accept = 443<br />
connect = 127.0.0.1:8888</p>
<p>其中 https 这个一项绑定的名称，可以随便起，accept 表示本机监听的端口，connect 表示转换到哪里。完整的意思就是为 127.0.0.1:8888 添加 SSL 加密层，然后通过 443 端口对外服务。</p>
<p>&nbsp;</p>
<h2>3、客户端设置</h2>
<p>目前默认支持 https/spdy 代理的只有 google chrome 浏览器（其他浏览器需要在客户端运行 stunnel 把 https 翻译为 http 才能使用）。而且很诡异的是 chrome 没有自己独立设置 proxy 的地方，使用系统全局的那个 https 设置是不行的（因为系统那个 https 代理指的是当你访问 https 的网站时所走的 http 代理通道，跟我们这篇说的 https proxy 是两码事），所以你还得在 chrome 浏览器里安装插件  TunnelSwitch，然后在这个插件里设置 https 代理为：“你的网站域名:443”，这样所有工作都完成可以直接上网了。</p>
<h3>4、一个给爱折腾的人的省钱方案</h3>
<p>如果想节省购买 SSL 证书的花费，那么自己生成一个“自签名”的证书也是可以的，不过如果你的 proxy 想共享给其他人使用的话，要慎重考虑这种方式，因为它会让不爱折腾的人觉得很折腾。</p>
<p>用下面命令即可生成一个自签名证书：</p>
<pre lang="bash">openssl genrsa -out key.pem 1024
openssl req -new -key key.pem -subj "/CN=localhost" -out req.pem
openssl x509 -req -days 365 -in req.pem -signkey key.pem -out cert.pem</pre>
<p>注意要将上面的 localhost 更改为你的域名，最终有用的分别是私钥文件 key.pem 和证书文件 cert.pem，把这两个文件替换上面第二步所提到的位置即可。</p>
<p>然后在客户端需要导入这个 cert.pem 才能顺利使用你所搭建的 https proxy 服务。各个操作系统的导入证书方法都不太相同。</p>
<ul>
<li>在 linux 里比较麻烦，需要用 libnss3 工具 certutil 来完成，命令如下：</li>
</ul>
<pre lang="bash">$ certutil -d "sql:$HOME/.pki/nssdb" -A -n dummy -i cert.pem -t C</pre>
<ul>
<li>在 mac osx 里使用 keychain 工具，把证书拖进”证书“一栏里。</li>
<li>在 windows 里双击证书文件，在选择“导入到位置”那一步选择”根信任“。</li>
</ul>
<p>然后重启你的 chrome 浏览器就可以了。</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e6%90%ad%e5%bb%ba-https-proxy-%e6%9c%8d%e5%8a%a1%e5%99%a8/">搭建 https proxy 服务器</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></content:encoded>
			<wfw:commentRss>https://www.fuwuqiok.com/%e6%90%ad%e5%bb%ba-https-proxy-%e6%9c%8d%e5%8a%a1%e5%99%a8/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Arch Linux 环境下使用 Tomcat 6 搭建多站点、带SSL证书、高性能NIO/APR网站的配置详解</title>
		<link>https://www.fuwuqiok.com/arch-linux-%e7%8e%af%e5%a2%83%e4%b8%8b%e4%bd%bf%e7%94%a8-tomcat-6-%e6%90%ad%e5%bb%ba%e5%a4%9a%e7%ab%99%e7%82%b9%e3%80%81%e5%b8%a6ssl%e8%af%81%e4%b9%a6%e3%80%81%e9%ab%98%e6%80%a7%e8%83%bdnioapr/</link>
		<comments>https://www.fuwuqiok.com/arch-linux-%e7%8e%af%e5%a2%83%e4%b8%8b%e4%bd%bf%e7%94%a8-tomcat-6-%e6%90%ad%e5%bb%ba%e5%a4%9a%e7%ab%99%e7%82%b9%e3%80%81%e5%b8%a6ssl%e8%af%81%e4%b9%a6%e3%80%81%e9%ab%98%e6%80%a7%e8%83%bdnioapr/#comments</comments>
		<pubDate>Tue, 01 Dec 2015 14:21:18 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[Arch Linux 环境下使用 Tomcat 6 搭建多站点]]></category>
		<category><![CDATA[带SSL证书]]></category>
		<category><![CDATA[系统安全]]></category>
		<category><![CDATA[高性能NIO/APR网站的配置详解]]></category>

		<guid isPermaLink="false">https://www.fuwuqiok.com/?p=2787</guid>
		<description><![CDATA[<p>由于 Tomcat 基于 Java，实际上在各种 Linux 发行版里的配置方法都大同小异，只是我看见在 Ar [&#8230;]</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/arch-linux-%e7%8e%af%e5%a2%83%e4%b8%8b%e4%bd%bf%e7%94%a8-tomcat-6-%e6%90%ad%e5%bb%ba%e5%a4%9a%e7%ab%99%e7%82%b9%e3%80%81%e5%b8%a6ssl%e8%af%81%e4%b9%a6%e3%80%81%e9%ab%98%e6%80%a7%e8%83%bdnioapr/">Arch Linux 环境下使用 Tomcat 6 搭建多站点、带SSL证书、高性能NIO/APR网站的配置详解</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></description>
				<content:encoded><![CDATA[<p>由于 Tomcat 基于 Java，实际上在各种 Linux 发行版里的配置方法都大同小异，只是我看见在 Arch Linux 环境里搭建 Tomcat 的文章比较少，所以在 Arch Linux 实践一遍然后得出此文。此文假设你对 Tomcat 并不十分了解，主要笔墨将会在 Tomcat 的配置之上。</p>
<h2>1、安装 Java JDK</h2>
<p>在 Arch Linux 的 extra 源里有 jdk7-openjdk 和 openjdk6，可以直接使用 pacman 安装，至于选用哪一个可以视具体情况而定。我安装的是 OpenJDK 7：</p>
<pre lang="bash">$ sudo pacman -S jdk7-openjdk</pre>
<h2>2、安装 Tomcat</h2>
<p>同样地，extra 源里已有 tomcat 版本5、6、7，可以根据具体情况而定，我这里安装的是tomcat 6。</p>
<pre lang="bash">$ sudo pacman -S tomcat6</pre>
<p>默认情况 tomcat 6 安装路径为 /usr/share/tomcat6，这里罗列一下主要目录的作用（箭头表示目录链接的实际位置）：</p>
<ul>
<li>/usr/share/tomcat6： 程序主目录，也是变量 $CATALINA_HOME 所指向的位置，在单 tomcat 实例的情况下，也是变量 $CATALINA_BASE 所指向的位置。</li>
<li>conf -&gt; /etc/tomcat6： 配置文件目录。</li>
<li>lib -&gt; /usr/share/java/tomcat6： 共享jar包目录，这些包既给 tomcat 所使用，也能给 web 应用程序所引用。</li>
<li>logs -&gt; /var/log/tomcat6： 日志目录，对于查找错误以及查看访问记录很有帮助。</li>
<li>webapps -&gt; /var/lib/tomcat6/webapps： 默认的 web 应用程序目录，tomcat 6 自带了几个示例程序，下面会介绍。</li>
</ul>
<p>现在可以尝试启动 tomcat 服务：</p>
<pre lang="bash">$ sudo /etc/rc.d/tomcat start</pre>
<p>根据安装的 Java 运行时的不同，启动时可能有错误，检查启动脚本的配置文件 /etc/conf.d/tomcat6 里面的 TOMCAT_JAVA_HOME 变量的值，在我的安装中 Java 运行时应该在 /opt/java 里（用 $ which java 就可以看到了），因此将：</p>
<p>TOMCAT_JAVA_HOME=/usr/lib/jvm/java-7-openjdk<br />
更改为如下即可：<br />
TOMCAT_JAVA_HOME=/opt/java</p>
<p>重启 tomcat 服务：</p>
<pre lang="bash">$ sudo /etc/rc.d/tomcat6 restart</pre>
<p>一般应该没有问题，打开任意浏览器并在地址栏里输入 “http://localhost:8080″，如果看到 tomcat 猫即说明服务已经安装妥当并且能正常运行了。</p>
<h2>3、认识 webapps 目录</h2>
<p>这个目录位于 tomcat6 的安装目录之下，实际内容位于 /var/lib/tomcat6/webapps。 webapps 目录里每一个目录对应一个web应用程序，比如 docs 目录的访问地址是 http://localhost:8080/docs，同理 manager 目录的访问地址是 http://localhost:8080/manager，其中比较特殊的是 ROOT 目录，它对应的访问地址恰好是网站的根目录，即 http://localhost:8080/。</p>
<p>Tomcat 附带的示例程序可以逐个访问体验一下，其中 manager 和 host-manager 这两个应用程序设置了需要登录验证才能访问，增加登录用户的方法是编辑 Tomcat 安装目录下的配置文件 conf/tomcat-users.xml （实际上也是文件 /etc/tomcat6/tomcat-users.xml），添加如下几行：</p>
<pre lang="xml">&lt;role rolename="manager-gui"/&gt;
&lt;role rolename="admin-script"/&gt;
&lt;role rolename="admin-gui"/&gt;
&lt;user username="tomcat" password="tomcat" roles="manager-gui,admin-script,admin-gui"/&gt;</pre>
<p>然后重启 Tomcat 服务，即可以通过用户名 tomcat 和密码 tomcat 登录并访问 manager 和 host-manager 两个应用程序。</p>
<p>每个 Java Web 应用程序都有如下的目录结构：</p>
<ul>
<li>/index.html 访客直接访问的资源，比如静态图片和CSS样式表。</li>
<li>/WEB-INF/ 访客不能直接访问的资源。</li>
<li>/WEB-INF/classes 应用程序的 Java 源码编译后的class文件。</li>
<li>/WEB-INF/web.xml 应用程序的配置文件。</li>
<li>/WEB-INF/lib 应用程序所引用的包。</li>
</ul>
<p>当然也不是所有都是必须的，你甚至可以创建一个目录，比如“hello”，然后在里面只创建一个 index.html 文件（内容随便），即可以通过 http://localhost:8080/hello/index.html 访问了。（当然这样的不是Web应用程序，此方法仅用于测试用）</p>
<p>下面使用 Apache Maven 创建一个最简单的 Web 应用程序，在用户目录里执行如下命令创建 Web 应用程序的骨架：</p>
<pre lang="bash">$ mvn archetype:generate</pre>
<p>在交互界面中，</p>
<p>Choose a number or apply filter: 输入 174，即创建 maven-archetype-webapp 类型项目。<br />
Choose version: 输入5，即版本 1.0。<br />
Define value for property ‘groupId’: 输入 org.test。<br />
Define value for property ‘artifactId’: 输入 demo。<br />
Define value for property ‘version’: 输入 1.0。<br />
Define value for property ‘package’: 输入 org.test.demo<br />
Confirm properties configuration: 直接回车</p>
<p>上面涉及 Maven 知识不在此文的讨论范围，如果不熟悉的话可以参阅免费的中文电子图书<a href="http://www.infoq.com/cn/minibooks/maven-in-action">《Maven in action》</a>，顺带提一下，Maven 是Java项目构建和管理的最常用工具之一。</p>
<p>现在应该看到一个名为 demo 的目录，进入后可以使用 Maven 打包项目：</p>
<pre lang="bash">$ cd demo

$ mvn package</pre>
<p>打包的结果是文件 ./target/demo.war，把这个文件复制到 webapps 目录：</p>
<pre lang="bash">$ sudo cp target/demo.war /var/lib/tomcat6/webapps/</pre>
<p>由于 Tomcat 默认创建的站点会自动部署应用程序，所以刚才复制到 webapps 目录的文件 demo.war 会被自动解压缩，检视 webapps 目录应该会发现多出一个名字为 demo 的目录，现在可以在浏览器里尝试访问 http://localhost:8080/demo，应该看到 “Hello World!”字样，这就是刚才用 Maven 创建的 Web 应用程序运行的结果。</p>
<p>需要说明的是，java web 应用程序打包之后所形成的 war 文件并不是一定要解压出来才能运行的，这点将会在下一节的配置里会讲到。</p>
<h2>4、认识 Tomcat 的主配置文件 server.xml</h2>
<p>这个文件位于 tomcat 6 安装目录之下的 conf 目录之内，实际内容位于 /etc/tomcat6/server.xml。</p>
<p>正如该文件的扩展名所示，这是一个 xml 格式的文件，打开之后将会看到如下的结构：</p>
<pre lang="xml">&lt;Server port="8005" shutdown="SHUTDOWN"&gt;
    &lt;Service name="Catalina"&gt;
        &lt;Executor ...... /&gt;
        &lt;Connector ...... /&gt;
        &lt;Connector ...... /&gt;
        &lt;Engine name="Catalina" ... &gt;
            &lt;Host name="localhost" ... &gt;
                &lt;Context ... /&gt;
            &lt;/Host&gt;
        &lt;/Engine&gt;
    &lt;/Service&gt;
&lt;/Server&gt;</pre>
<p>即一个由 Server-&gt;Service-&gt;Engine-&gt;Host-&gt;Context 组成的四层结构，从里层向外层分别是：</p>
<ul>
<li>Context： 即 Web 应用程序，一个 Context 即对于一个 Web 应用程序。</li>
<li>Host：即虚拟主机，比如 www.dog.com 对应一个虚拟主机，api.dog.com 对于另一个虚拟主机。一个 Host 用于定义一个虚拟主机。（所谓的”一个虚拟主机”可简单理解为”一个网站”）</li>
<li>Engine：一组虚拟主机的集合。比如www.dog.com 和 api.dog.com 可以组成一组虚拟主机集合。</li>
<li>Service：一组 Engine 的集合，包括线程池 Executor 和连接器 Connector 的定义。</li>
</ul>
<h3>Connector 的配置</h3>
<p>一个 Connector 即一个对外界开放的端口，简单理解就是大部分网络服务程序都会遇到的 IpAddress:Port 的组合，比如 192.168.0.10：8080 就是一个端口，当然在 Connector 里可以定义的内容要丰富得多，即 Connector 这个 XML 节点里可以加上许多属性。下面列举一下常用的：</p>
<ul>
<li>enableLookups：(default=true) 是否允许反向解析访客的IP地址，当你的应用程序使用 request.getRemoteHost() 时如果只需要IP地址，建议禁用此项，这样能节省反向域名解析的时间。</li>
<li>maxPostSize：(default=2097152 即2MB) 最大允许 POST 上传的数据大小（单位为：字节），对于一般网站来说，比如有写评论写文章的网站，默认的2MB已经足够，不过如果网站带有图片甚至文件上传功能，则需要根据具体情况来定。</li>
<li>protocol：连接器的类型，tomcat 6 有如下几种选择
<ul>
<li>org.apache.coyote.http11.Http11Protocol：简写为 “HTTP/1.1″，这是默认的连接器，一个访客网络连接需要一个线程，并发性能比较低。</li>
<li>org.apache.coyote.http11.Http11NioProtocol：NIO连接器，一个由非阻塞的socket工作模式构成的连接器，并发性能良好，纯Java实现。</li>
<li>org.apache.coyote.http11.Http11AprProtocol：APR连接器，所谓 APR 就是网络上最多服务器使用的 Web 服务程序 <a href="http://httpd.apache.org/">Apache Http Server</a> 所使用的库，Tomcat 建议在生产环境使用，具体方法下面会介绍。</li>
</ul>
</li>
<li>redirectPort：当用户访问非https的资源而该资源又需要https方式访问时，tomcat会自动重定向到https端口，一般https使用 TCP 443端口，所以一般取值”443″。</li>
<li>SSLEnabled：(default=false)，设置当前连接器是否使用安全SSL传输，如果设置为”true”，则应该同时设置下面两个属性：<br />
scheme=”https” (default=http) 可以设置为 http 或者 https。<br />
secure=”true” (default=false)。</li>
<li>adress：连接器所绑定的IP地址，当一台服务器存在多个ip地址时可以指定其中的需要绑定的一个，默认不设置该属性的值表示绑定当前服务器的所有ip地址。</li>
<li>compressableMimeType：(default=”text/html,text/xml,text/plain”) 指定需要GZIP压缩的资源的类型。</li>
<li>compression：(default=off) 是否启用GZIP压缩，可以取值 on/off/force，设置为on之后会对 compressableMimeType 属性指定的资源类型启用GZIP压缩。</li>
<li>connectionTimeout：(default=”60000″) 当访客网络连接后，服务器等待第一行Request头出现的时间。单位是毫秒。</li>
<li>executor：指定当前连接器使用的线程池的名称，如果指定，则忽略其他针对线程数量的设置，比如 maxThreads。</li>
<li>maxThreads：(default=200) 最多可创建线程的数量。</li>
<li>port=”80″：绑定端口。</li>
<li>keepAliveTimeout：(default=connectionTimeout)，访客完成一次请求后维持网络连接的时间。</li>
</ul>
<p>一个简单的 Connector 定义如下：</p>
<pre lang="xml">&lt;Connector port="80" protocol="HTTP/1.1"
               connectionTimeout="60000"
           redirectPort="443" /&gt;</pre>
<h3>Executor 的配置</h3>
<p>Executor 用于定义共享的线程池。默认情况下每个 Connector 都会产生自己的一个线程池，如果你想多个 Connector 共享一个线程池，则可以先定义一个线程池，如：</p>
<pre lang="xml">&lt;Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
        maxThreads="150" minSpareThreads="4"/&gt;</pre>
<p>然后修改上述的 Connector 配置，增加 executor 属性，修改后的配置如下：</p>
<pre lang="xml">&lt;Connector executor="tomcatThreadPool"
               port="80" protocol="HTTP/1.1"
               connectionTimeout="60000"
               redirectPort="443" /&gt;</pre>
<h3>Host 的配置</h3>
<p>一个 Host 配置即为一个虚拟主机，例如下面是一个简单的 Host 配置：</p>
<pre lang="xml">&lt;Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true"&gt;
        &lt;Alias&gt;dog.com&lt;/Alias&gt;
        &lt;Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"  
               prefix="localhost_access_log." suffix=".txt" pattern="common" resolveHosts="false"/&gt;
&lt;/Host&gt;</pre>
<p>Host 配置节点各个属性的作用：</p>
<ul>
<li>name：设置虚拟主机的域名，比如 localhost 表示本机名称，实际应用时应该填写具体域名，比如 www.dog.com 或者 dog.com，当然如果该虚拟主机是给内部人员访问的，也可以直接填写服务器的 ip 地址，比如 192.168.1.10。</li>
<li>autoDeploy：是否允许自动部署，默认值是 true，即表示 Tomcat 会自动检测 appBase 目录下面的文件变化从而自动应用到正在运行的 Web 应用程序。</li>
<li>unpackWARs：设置是否自动展开 war 压缩包再运行 Web 应用程序，默认值是 true。</li>
<li>appBase：设置 Web 应用程序组的路径。前面说过一个虚拟主机可以由多个 Web 应用程序构成，所以这里的 appBase 所指向的目录应该是准备用于存放这一组 Web 应用程序的目录，而不是具体某个 Web 应用程序的目录本身（即使该虚拟主机只由一个 Web 应用程序组成）。appBase 属性的值可以是相对于 Tomcat 安装目录的相对路径，也可以是绝对路径，需要注意的是该路径必须是 Tomcat 有权限访问的，通过 Arch Linux 源安装的 Tomcat 是通过 tomcat 用户运行的，因此创建一个新的 appBase 目录之后可以使用 chown 命令更改目录的所有者。</li>
</ul>
<p>下面举例说明如何创建一个新的虚拟主机 www.dog.com：</p>
<p>在目录 /var/lib/tomcat6 下面可以看到安装 Tomcat 时默认创建的 webapps 目录，为了方便管理我们即将创建的虚拟主机的文档也在 /var/lib/tomcat6 里创建：</p>
<pre lang="bash">$ sudo mkdir dog</pre>
<p>然后在 dog 目录里面创建目录 ROOT，再在 ROOT 里面创建文件 index.html（内容随便）。</p>
<p>现在将目录的所有者和所有组都更改为 tomcat：</p>
<pre lang="bash">$ sudo chown -R tomcat:tomcat dog</pre>
<p>然后在 server.xml 的 Host 节点下增加如下 Host 节点：</p>
<pre lang="xml">&lt;Host name="www.dog.com"  appBase="/var/lib/tomcat6/dog"&gt;
&lt;/Host&gt;</pre>
<p>重启 Tomcat 服务就可以在浏览器里通过地址 http://www.dog.com 访问这个新创建的虚拟主机了，当然你必须要先在 /etc/hosts 文件里增加 www.dog.com 到 127.0.0.1 的解析记录，如下：</p>
<pre lang="">127.0.0.1    www.dog.com</pre>
<p>有时一个虚拟主机可能会同时绑定多个域名，比如 www.dog.com 和 dog.com，这时可以通过在 Host 配置节点里增加 Alias 实现，比如：</p>
<pre lang="xml">&lt;Alias&gt;dog.com&lt;/Alias&gt;</pre>
<p>另外上面示例当中的 &lt;Valve className=… /&gt; 配置了访客的访问日志的储存位置以及文件名。</p>
<h3>Engine 的配置</h3>
<p>默认的 Engine 节点如下：</p>
<pre lang="xml">&lt;Engine name="Catalina" defaultHost="localhost"&gt;
&lt;/Engine&gt;</pre>
<p>这个应该不用展开叙述了，其中 defaultHost 用于指定访客在没有相应的虚拟主机时，Tomcat 默认选择的虚拟主机的名称。考虑如下的情形：</p>
<p>假如有3个域名都 DNS 解析到你的服务器，比如 dog.com, www.dog.com, api.dog.com，当前你只配置了虚拟主机 dog.com 和 www.dog.com，那么当有个访客通过 api.dog.com 访问你的服务器时，Tomcat 就会依据 defaultHost 的设置返回其中一个虚拟主机运行的结果。实际应用中 defaultHost 应该设置为你的主力域名，比如 www.dog.com。</p>
<h2> 5、多站点的配置</h2>
<p>有时我们需要在一台服务器上跑多个站点，通过 Tomcat 很容易实现这点，下面假设我们要搭建 www.dog.com 和 www.cat.com 这两个站点。</p>
<p>首先要确定你的两个域名的 DNS 已经能正确解析到你的服务器，因为这里我们是做实验，所以可以在本机添加域名解析。修改 /etc/hosts 文件，加入如下两行：</p>
<pre lang="">127.0.0.1    www.cat.com
127.0.0.1    www.dog.com</pre>
<p>然后在 /var/lib/tomcat6 目录里分别创建名字为 cat 和 dog 的两个目录，然后在每个目录里都创建名字为 ROOT 的目录，并在 ROOT 里面创建名字为 index.html 文件（内容随便）。然后将目录 cat 和 dog 的所有者和所有组都更改为 tomcat，方法参考上一节，这里不再赘述。</p>
<p>现在编辑 Tomcat 的主配置文件 server.xml，在默认的 Host 节点下面再加入如下两个新的 Host 节点：</p>
<pre lang="xml">&lt;Host name="www.dog.com" appBase="/var/lib/tomcat6/dog" autoDeploy="true" unpackWARs="true"&gt;
&lt;/Host&gt;
&lt;Host name="www.cat.com" appBase="/var/lib/tomcat6/cat" autoDeploy="true" unpackWARs="true"&gt;
&lt;/Host&gt;</pre>
<p>在 Host 节点里面可以根据上一节的说明加入自己需要的属性或者 Alias 和 Value 子节点。重启 Tomcat 服务，现在应该可以在浏览器里分别通过 http://www.dog.com 和 http://www.cat.com 浏览这两个站点了。</p>
<h2>6、使用 NIO 连接器</h2>
<p>默认的连接器并发性能不太好，如果网站的并发访问量不大则无所谓，或者在公司内部网这点可能体会不出来（因为在内部网可能每个请求在1秒钟之内就完 成了），当环境换成 Internet 之后，可能每个客户请求在网络会几秒甚至几十秒的延时才传输完成，这样则会导致“许多访客同时连接”的现象，当 Tomcat 的连接器所有线程都被占用的情况下，后来者（访客）就会被卡在门外。因此我们最好在实际环境中把默认的连接器改成 NIO 连接器（non blocking Java connector）。方法很简单，只要把 Connector 节点的 protocol 属性值更改为 “org.apache.coyote.http11.Http11NioProtocol” 即可，例如原先的是这样：</p>
<pre lang="xml">&lt;Connector port="80" protocol="HTTP/1.1"
           redirectPort="443" /&gt;</pre>
<p>修改为：</p>
<pre lang="xml">&lt;Connector port="80" protocol="org.apache.coyote.http11.Http11NioProtocol"
           redirectPort="443" /&gt;</pre>
<p>然后重启 Tomcat 服务器即可。</p>
<h2>7、为网站添加 SSL 证书</h2>
<p>有时网站可能涉及重要的业务数据，在互联网上传输这些页面最好以 https 方式传输，这样可以防止重要信息被中间环节窃取。</p>
<p>详细的方法可以参考我之前的一篇文章《添加 GoDaddy SSL 证书到你的网站》， 文章介绍如何申请签名的 SSL 证书以及如何修改 Tomcat 的配置。如果你现在只是想试验一下为网站添加 https 功能，或者只是在公司的内部网站使用上 https，则可以使用一个简单的方法实现：使用自签名 SSL 证书。所谓自签名的 SSL 证书就是自己产生的证书，这种证书没有通过第三方证书商签名认证，所以在浏览这种网站时浏览器会提示证书错误，不过访客是完全可以继续浏览网站内容。</p>
<p>下面假设我们要为上一节的 www.awsok.com 添加SSL证书。首先使用 Java 自带的 keytool 工具产生一个 keystore 文件（一种用于存放证书的文件格式），在自家目录执行如下命令：</p>
<pre lang="bash">$ keytool -keysize 2048 -genkey -alias tomcat -keyalg RSA -keystore tomcat.keystore</pre>
<p>然后它会提示你设置一个密码以及输入DN信息：</p>
<pre lang="">Enter keystore password:  设置一个用于保护你keystore文件的密码，例如123456
Re-enter new password: 重复上面的密码
What is your first and last name?
  [Unknown]:  www.awsok.com （就是域名啦）
What is the name of your organizational unit?
  [Unknown]:  Networking 组织单位名称（随便）
What is the name of your organization?
  [Unknown]:  awsok.com 组织名称（随便）
What is the name of your City or Locality?
  [Unknown]:  Shenzhen 所在城市（随便）
What is the name of your State or Province?
  [Unknown]:  Guangdong 所在省份（随便）
What is the two-letter country code for this unit?
  [Unknown]:  CN 所在国家的两位代号（随便）
Is CN=www.awsok.com, OU=Networking, O=awsok.com, L=Shenzhen, ST=Guangdong, C=CN correct?
  [no]:  yes 以上信息正确则输入yes

Enter key password for
    (RETURN if same as keystore password): 这一步直接敲回车</pre>
<p>完成后会在当前目录产生一个 tomcat.keystore 文件。把这个文件复制到 dog 网站应用程序的根目录（即 /var/lib/tomcat6/dog）：</p>
<pre lang="bash">$ sudo cp tomcat.keystore /var/lib/tomcat6/dog</pre>
<p>然后修改 Tomcat 的主配置文件 server.xml，在默认的 Connector 节点之下添加如下的新 Connector 节点：</p>
<pre lang="xml">&lt;Connector port="443" protocol="HTTP/1.1″
    SSLEnabled="true"
    scheme="https" secure="true"
    clientAuth="false" sslProtocol="TLS"
    keystoreFile="/var/lib/tomcat6/dog/tomcat.keystore"
    keystorePass="123456" /&gt;</pre>
<p>假如你使用的是 NIO 连接器，则应该这样把 protocol 属性值换成 Http11NioProtocol，即：</p>
<pre lang="xml">&lt;Connector port="443" protocol="Http11NioProtocol″
    SSLEnabled="true"
    scheme="https" secure="true"
    clientAuth="false" sslProtocol="TLS"
    keystoreFile="/var/lib/tomcat6/dog/tomcat.keystore"
    keystorePass="123456" /&gt;</pre>
<p>重启 Tomcat 服务，用浏览器访问 https://www.dog.com，这时浏览器可能会提示证书错误，忽略它（对于 Firefox 浏览器还需要点击 “添加例外” 按钮才能忽略）即可以看到已经是 https 方式在浏览网页了。</p>
<h2>8、使用 APR 高性能连接器</h2>
<p>APR 即 <a href="http://apr.apache.org/">Apache Portable Runtime</a>，提供了 Apache Http 的高性能特性，下面普通连接器、NIO和APR的特性简单比较（<a href="http://tomcat.apache.org/tomcat-6.0-doc/config/http.html#Connector%20Comparison">摘自这里</a>）：</p>
<pre lang="">                  Java Blocking Connector       Java Nio Blocking Connector       APR Connector
    Classname         Http11Protocol                  Http11NioProtocol         Http11AprProtocol
    Tomcat Version   3.x 4.x 5.x 6.x                       6.x                     5.5.x 6.x
    Support Polling         NO                             YES                        YES
    Polling Size           N/A                   Unlimited - Restricted by mem        Unlimited - Configurable
    Read HTTP Request     Blocking                     Non Blocking                   Blocking
    Read HTTP Body        Blocking                     Sim Blocking                   Blocking
    Write HTTP Response   Blocking                     Sim Blocking                   Blocking
    SSL Support           Java SSL                     Java SSL                       OpenSSL
    SSL Handshake         Blocking                     Non blocking                   Blocking
    Max Connections       maxThreads                   See polling size               See polling size</pre>
<p>Tomcat 文档在 NIO 和 APR 之间比较推荐后者，由于我没有实际环境（即大量从 internet 过来的访问）详细测试和比较，所以我也不太清楚两者相差多少。下面介绍使用 APR 的方法：</p>
<p>先安装 APR for Tomcat 的本地库和 OpenSSL（假如需要使用 SSL 证书并且系统还没安装的话），Arch Linux 的 local 源里面已经存在这两者，所以安装方法很简单：</p>
<pre lang="xml">$ sudo pacman -S tomcat-native
$ sudo pacman -S openssl</pre>
<p>然后修改 Tomcat 的主配置文件 server.xml，把 Connector 的 protocol 属性值修改为“org.apache.coyote.http11.Http11AprProtocol”，修改后的配置大致如下：</p>
<pre lang="xml">&lt;Connector port="80" protocol="org.apache.coyote.http11.Http11AprProtocol"
           redirectPort="443" /&gt;</pre>
<p>（注：保留 protocol=”HTTP/1.1″ 属性值也是可以的）</p>
<p>然后重启 Tomcat 服务即可，如何知道是否用上 APR 连接器呢？只要翻查 Tomcat 的日志文件就知道了，默认的日志文件为：/var/log/tomcat6/catalina.err：</p>
<pre lang="bash">$ sudo tail /var/log/tomcat6/catalina.err</pre>
<p>如果在重启 Tomcat 服务后看到日志末尾处有出现下面红色字的内容，则表示已经成功用上 APR连接器了。</p>
<p>Feb 19, 2012 9:44:05 AM org.apache.coyote.http11.<strong>Http11AprProtocol</strong> start<br />
INFO: Starting Coyote HTTP/1.1 on http-80<br />
Feb 19, 2012 9:44:05 AM org.apache.coyote.http11.<strong>Http11AprProtocol</strong> start<br />
INFO: Starting Coyote HTTP/1.1 on http-443<br />
Feb 19, 2012 9:44:05 AM org.apache.catalina.startup.Catalina start<br />
INFO: Server startup in 1281 ms</p>
<p>如果你使用了 APR 连接器同时又需要添加 SSL 证书（即需要 https 访问功能），则需要使用 OpenSSL 的方法产生加密私钥并且修改一下相应的 Connector 的配置，仍然以上面第7节的例子，即为 www.dog.com 站点添加 SSL 证书来讲解。</p>
<p>先用 OpenSSL 产生私钥以及自签名，在自家目录下执行下面命令：</p>
<pre lang="bash"># Generate private key
$ openssl genrsa -out ca.key 1024 

# Generate CSR
$ openssl req -new -key ca.key -out ca.csr

# Generate Self Signed Key
$ openssl x509 -req -days 365 -in ca.csr -signkey ca.key -out ca.crt</pre>
<p>同上面第7节类似，中途也会要求你输入 DN 信息，完成后把 ca.crt 和 ca.key 文件复制到 dog 站点应用程序的根目录：</p>
<pre lang="bash">$ sudo cp ca.crt /var/lib/tomcat6/dog
$ sudo cp ca.key /var/lib/tomcat6/dog</pre>
<p>然后修改 Connector 节点为如下：</p>
<pre lang="xml">&lt;Connector port="443" SSLEnabled="true"
           scheme="https" secure="true"
           SSLCertificateFile="/var/lib/tomcat6/dog/ca.crt"
           SSLCertificateKeyFile="/var/lib/tomcat6/dog/ca.key"/&gt;</pre>
<p>重启 Tomcat 服务之后生效。</p>
<h2>最后</h2>
<p>此文简单讲述在 Arch Linux 环境下安装 Tomcat 6、修改主配置文件、搭建多站点、添加 SSL 证书以及使用高性能的 NIO 和 APR 连接器的方法和步骤。因为内容比较多而且我只做了初级的试验，不知道有没有写错，也没办法给什么建议，所以强烈建议详细阅读 Tomcat 的官方文档</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/arch-linux-%e7%8e%af%e5%a2%83%e4%b8%8b%e4%bd%bf%e7%94%a8-tomcat-6-%e6%90%ad%e5%bb%ba%e5%a4%9a%e7%ab%99%e7%82%b9%e3%80%81%e5%b8%a6ssl%e8%af%81%e4%b9%a6%e3%80%81%e9%ab%98%e6%80%a7%e8%83%bdnioapr/">Arch Linux 环境下使用 Tomcat 6 搭建多站点、带SSL证书、高性能NIO/APR网站的配置详解</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></content:encoded>
			<wfw:commentRss>https://www.fuwuqiok.com/arch-linux-%e7%8e%af%e5%a2%83%e4%b8%8b%e4%bd%bf%e7%94%a8-tomcat-6-%e6%90%ad%e5%bb%ba%e5%a4%9a%e7%ab%99%e7%82%b9%e3%80%81%e5%b8%a6ssl%e8%af%81%e4%b9%a6%e3%80%81%e9%ab%98%e6%80%a7%e8%83%bdnioapr/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Haproxy 四层代理</title>
		<link>https://www.fuwuqiok.com/haproxy-%e5%9b%9b%e5%b1%82%e4%bb%a3%e7%90%86/</link>
		<comments>https://www.fuwuqiok.com/haproxy-%e5%9b%9b%e5%b1%82%e4%bb%a3%e7%90%86/#comments</comments>
		<pubDate>Thu, 05 Nov 2015 01:28:08 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[Haproxy 四层代理]]></category>
		<category><![CDATA[服务器基础环境搭建]]></category>
		<category><![CDATA[系统安全]]></category>

		<guid isPermaLink="false">https://www.fuwuqiok.com/?p=2746</guid>
		<description><![CDATA[<p>1.安装 #wget http://haproxy.1wt.eu/download/1.4/src/hapro [&#8230;]</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/haproxy-%e5%9b%9b%e5%b1%82%e4%bb%a3%e7%90%86/">Haproxy 四层代理</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></description>
				<content:encoded><![CDATA[<h3 class="com">1.安装</h3>
<ol class="linenums">
<li class="L0"><span class="com">#wget http://haproxy.1wt.eu/download/1.4/src/haproxy-1.4.22.tar.gz</span></li>
<li class="L1"><span class="com">#tar zxvf haproxy-1.4.22.tar.gz </span></li>
<li class="L2"><span class="com">#cd haproxy-1.4.22</span></li>
<li class="L3"><span class="com">#uname -r</span></li>
<li class="L4"><span class="com">#make TARGET=linux26 PREFIX=/usr/local/haproxy</span></li>
<li class="L5"><span class="com">#make install PREFIX=/usr/local/haproxy</span></li>
<li class="L6"><span class="com">#mkdir conf</span></li>
<li class="L7"><span class="com">#/usr/local/haproxy/sbin/haproxy -f haproxy.cfg</span></li>
</ol>
<p>haproxy.cfg配置</p>
<ol class="linenums">
<li class="L0"><span class="com">###########全局配置#########</span></li>
<li class="L1"><span class="kwd">global</span></li>
<li class="L2"><span class="pln">chroot </span><span class="pun">/</span><span class="pln">usr</span><span class="pun">/</span><span class="kwd">local</span><span class="pun">/</span><span class="pln">haproxy</span></li>
<li class="L3"><span class="pln">daemon</span></li>
<li class="L4"><span class="pln">nbproc </span><span class="lit">1</span></li>
<li class="L5"><span class="kwd">group</span><span class="pln"> nobody</span></li>
<li class="L6"><span class="pln">user nobody</span></li>
<li class="L7"><span class="pln">pidfile </span><span class="pun">/</span><span class="pln">usr</span><span class="pun">/</span><span class="kwd">local</span><span class="pun">/</span><span class="pln">haproxy</span><span class="pun">/</span><span class="pln">logs</span><span class="pun">/</span><span class="pln">haproxy</span><span class="pun">.</span><span class="pln">pid</span></li>
<li class="L8"><span class="pln">ulimit</span><span class="pun">&#8211;</span><span class="pln">n </span><span class="lit">65536</span></li>
<li class="L9"><span class="com">#spread-checks 5m </span></li>
<li class="L0"><span class="com">#stats timeout 5m</span></li>
<li class="L1"><span class="com">#stats maxconn 100</span></li>
<li class="L2"></li>
<li class="L3"><span class="com">########默认配置############</span></li>
<li class="L4"><span class="pln">defaults</span></li>
<li class="L5"><span class="pln">mode tcp </span><span class="com">#默认的模式mode { tcp|http|health }，tcp是4层，http是7层，health只会返回OK</span></li>
<li class="L6"><span class="pln">retries </span><span class="lit">3</span> <span class="com">#两次连接失败就认为是服务器不可用，也可以通过后面设置</span></li>
<li class="L7"><span class="pln">option redispatch </span><span class="com">#当serverId对应的服务器挂掉后，强制定向到其他健康的服务器</span></li>
<li class="L8"><span class="pln">option abortonclose </span><span class="com">#当服务器负载很高的时候，自动结束掉当前队列处理比较久的链接</span></li>
<li class="L9"><span class="pln">maxconn </span><span class="lit">32000</span> <span class="com">#默认的最大连接数</span></li>
<li class="L0"><span class="pln">timeout connect </span><span class="lit">5000ms</span> <span class="com">#连接超时</span></li>
<li class="L1"><span class="pln">timeout client </span><span class="lit">30000ms</span> <span class="com">#客户端超时</span></li>
<li class="L2"><span class="pln">timeout server </span><span class="lit">30000ms</span> <span class="com">#服务器超时</span></li>
<li class="L3"><span class="com">#timeout check 2000 #心跳检测超时</span></li>
<li class="L4"><span class="pln">log </span><span class="lit">127.0</span><span class="pun">.</span><span class="lit">0.1</span><span class="pln"> local0 err </span><span class="com">#[err warning info debug]</span></li>
<li class="L5"></li>
<li class="L6"><span class="com">########smtp配置#################</span></li>
<li class="L7"><span class="pln">listen smtp </span><span class="lit">192.168</span><span class="pun">.</span><span class="lit">1.68</span><span class="pun">:</span><span class="lit">25</span></li>
<li class="L8"><span class="com"># bind 0.0.0.0:25</span></li>
<li class="L9"><span class="pln">mode tcp</span></li>
<li class="L0"><span class="pln">balance roundrobin</span></li>
<li class="L1"><span class="pln">server s1 </span><span class="lit">192.168</span><span class="pun">.</span><span class="lit">1.118</span><span class="pun">:</span><span class="lit">25</span><span class="pln"> weight </span><span class="lit">1</span><span class="pln"> maxconn </span><span class="lit">10000</span><span class="pln"> check inter </span><span class="lit">10s</span></li>
<li class="L2"><span class="pln">server s2 </span><span class="lit">192.168</span><span class="pun">.</span><span class="lit">1.240</span><span class="pun">:</span><span class="lit">25</span><span class="pln"> weight </span><span class="lit">1</span><span class="pln"> maxconn </span><span class="lit">10000</span><span class="pln"> check inter </span><span class="lit">10s</span></li>
<li class="L3"></li>
<li class="L4"><span class="com">########pop3配置#################</span></li>
<li class="L5"><span class="pln">listen pop3 </span><span class="lit">192.168</span><span class="pun">.</span><span class="lit">1.68</span><span class="pun">:</span><span class="lit">110</span></li>
<li class="L6"><span class="com"># bind 0.0.0.0:25</span></li>
<li class="L7"><span class="pln">mode tcp</span></li>
<li class="L8"><span class="pln">balance roundrobin</span></li>
<li class="L9"><span class="pln">server s1 </span><span class="lit">192.168</span><span class="pun">.</span><span class="lit">1.118</span><span class="pun">:</span><span class="lit">110</span><span class="pln"> weight </span><span class="lit">1</span><span class="pln"> maxconn </span><span class="lit">10000</span><span class="pln"> check inter </span><span class="lit">10s</span></li>
<li class="L0"><span class="pln">server s2 </span><span class="lit">192.168</span><span class="pun">.</span><span class="lit">1.240</span><span class="pun">:</span><span class="lit">110</span><span class="pln"> weight </span><span class="lit">1</span><span class="pln"> maxconn </span><span class="lit">10000</span><span class="pln"> check inter </span><span class="lit">10s</span></li>
<li class="L1"></li>
<li class="L2"><span class="com">########imap配置#################</span></li>
<li class="L3"><span class="pln">listen imap </span><span class="lit">192.168</span><span class="pun">.</span><span class="lit">1.68</span><span class="pun">:</span><span class="lit">143</span></li>
<li class="L4"><span class="com"># bind 0.0.0.0:25</span></li>
<li class="L5"><span class="pln">mode tcp</span></li>
<li class="L6"><span class="pln">balance roundrobin</span></li>
<li class="L7"><span class="pln">server s1 </span><span class="lit">192.168</span><span class="pun">.</span><span class="lit">1.118</span><span class="pun">:</span><span class="lit">143</span><span class="pln"> weight </span><span class="lit">1</span><span class="pln"> maxconn </span><span class="lit">10000</span><span class="pln"> check inter </span><span class="lit">10s</span></li>
<li class="L8"><span class="pln">server s2 </span><span class="lit">192.168</span><span class="pun">.</span><span class="lit">1.240</span><span class="pun">:</span><span class="lit">143</span><span class="pln"> weight </span><span class="lit">1</span><span class="pln"> maxconn </span><span class="lit">10000</span><span class="pln"> check inter </span><span class="lit">10s</span></li>
<li class="L9"></li>
<li class="L0"><span class="com">########统计页面配置########</span></li>
<li class="L1"><span class="pln">listen admin_stats </span><span class="lit">192.168</span><span class="pun">.</span><span class="lit">1.68</span><span class="pun">:</span><span class="lit">8099</span></li>
<li class="L2"><span class="com"># bind 0.0.0.0:8099 #监听端口</span></li>
<li class="L3"><span class="pln">mode http </span><span class="com">#http的7层模式</span></li>
<li class="L4"><span class="pln">option httplog </span><span class="com">#采用http日志格式</span></li>
<li class="L5"><span class="com">#log 127.0.0.1 local0 err</span></li>
<li class="L6"><span class="pln">maxconn </span><span class="lit">5</span></li>
<li class="L7"><span class="pln">stats refresh </span><span class="lit">30s</span> <span class="com">#统计页面自动刷新时间</span></li>
<li class="L8"><span class="pln">stats uri </span><span class="pun">/</span><span class="pln">stats </span><span class="com">#统计页面url</span></li>
<li class="L9"><span class="pln">stats realm </span><span class="typ">XingCloud</span><span class="pln">\ </span><span class="typ">Haproxy</span> <span class="com">#统计页面密码框上提示文本</span></li>
<li class="L0"><span class="pln">stats auth admin</span><span class="pun">:</span><span class="pln">admin </span><span class="com">#统计页面用户名和密码设置</span></li>
<li class="L1"><span class="pln">stats hide</span><span class="pun">&#8211;</span><span class="pln">version </span><span class="com">#隐藏统计页面上HAProxy的版本信息</span></li>
</ol>
<p>监控图：</p>
<p><a href="https://www.fuwuqiok.com/wp-content/uploads/2015/11/haproxy.jpg"><img class="attachment-medium" src="https://www.fuwuqiok.com/wp-content/uploads/2015/11/haproxy.jpg" alt="haproxy" width="2332" height="1218" /></a></p>
<div class="open-message"></div>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/haproxy-%e5%9b%9b%e5%b1%82%e4%bb%a3%e7%90%86/">Haproxy 四层代理</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></content:encoded>
			<wfw:commentRss>https://www.fuwuqiok.com/haproxy-%e5%9b%9b%e5%b1%82%e4%bb%a3%e7%90%86/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OpenVPN部署 安装OpenVPN服务端</title>
		<link>https://www.fuwuqiok.com/openvpn%e9%83%a8%e7%bd%b2-%e5%ae%89%e8%a3%85openvpn%e6%9c%8d%e5%8a%a1%e7%ab%af/</link>
		<comments>https://www.fuwuqiok.com/openvpn%e9%83%a8%e7%bd%b2-%e5%ae%89%e8%a3%85openvpn%e6%9c%8d%e5%8a%a1%e7%ab%af/#comments</comments>
		<pubDate>Sat, 26 Sep 2015 14:32:57 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[OpenVPN部署 安装OpenVPN服务端]]></category>
		<category><![CDATA[系统安全]]></category>

		<guid isPermaLink="false">https://www.fuwuqiok.com/?p=2715</guid>
		<description><![CDATA[<p>1、OpenVPN是基于OpenSSL的，所有要先安装OpenSSL: [root@Zabbix-Server [&#8230;]</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/openvpn%e9%83%a8%e7%bd%b2-%e5%ae%89%e8%a3%85openvpn%e6%9c%8d%e5%8a%a1%e7%ab%af/">OpenVPN部署 安装OpenVPN服务端</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></description>
				<content:encoded><![CDATA[<p>1、OpenVPN是基于OpenSSL的，所有要先安装OpenSSL:</p>
<pre class="brush: bash; title: ; notranslate" title="">[root@Zabbix-Server ~]# yum install openssl openssl-devel gcc
</pre>
<p>2、安装lzo软件，用于压缩隧道通信数据加快传输数度（版本lzo-2.06）</p>
<pre class="brush: bash; title: ; notranslate" title="">[root@Zabbix-Server lzo-2.06]# ./configure --prefix=/usr/local/lzo
[root@Zabbix-Server lzo-2.06]# make
[root@Zabbix-Server lzo-2.06]# make install
</pre>
<p>3、安装OpenVPN（版本openvpn-2.2.2）</p>
<pre class="brush: bash; title: ; notranslate" title="">[root@Zabbix-Server openvpn-2.2.2]# ./configure --prefix=/usr/local/openvpn --with-lzo-lib=/usr/local/lzo/
[root@Zabbix-Server openvpn-2.2.2]# make
[root@Zabbix-Server openvpn-2.2.2]# make install
</pre>
<p>4、配置OpenVPN<br />
1）建立CA的详细信息，进入源代码相关目录操作，编辑文件vars设定相关变量值。</p>
<pre class="brush: bash; title: ; notranslate" title="">[root@Zabbix-Server ~]# cd /root/src/openvpn-2.2.2/easy-rsa/2.0
[root@Zabbix-Server 2.0]# vim vars
###vim vars 需要修该的项###
export KEY_COUNTRY="CN"    #定义国家
export KEY_PROVINCE="SH"    #定义省份
export KEY_CITY="Chengdu"    #定义城市
export KEY_ORG="fuwuqiok.com"    #定义组织
export KEY_EMAIL="zeus911@foxmail.com"    #定义邮件地址
###vim vars###
[root@Zabbix-Server 2.0]# source vars
NOTE: If you run ./clean-all, I will be doing a rm -rf on /root/src/openvpn-2.0.9/easy-rsa/2.0/keys
#初始化keys目录
[root@Zabbix-Server 2.0]# ./clean-all
</pre>
<p>生成根CA证书ca.key、ca,crt，用于签发server和client证书，由于定义了预设值创建过程中一路回车就可以。</p>
<pre class="brush: bash; title: ; notranslate" title="">[root@Zabbix-Server 2.0]# ./build-ca
</pre>
<p>为服务器生成Diffie-Hellman文件</p>
<pre class="brush: bash; title: ; notranslate" title="">[root@Zabbix-Server 2.0]# ./build-dh
</pre>
<p>2）为OpenVPN服务器生成证书和密钥，一般只需要输入A challenge password []、An optional company name []:这两项，其它的默认或”y”，如果不使用默认的预设值填入你想要的即可。</p>
<pre class="brush: bash; title: ; notranslate" title="">[root@Zabbix-Server 2.0]# ./build-key-server server
</pre>
<p>3）为OpenVPN客户端生成证书文件，以客户端fuwuqi120为例，与服务端的步骤一样如果不更改默认预设值，一路回车或”y”就行了。需要说明 的是每个客户端的证书文件都是这样生成的(如果结合radius认证就不用这么麻烦了，后面的文章有介绍)，每个客户端都要独立生成证书文件。</p>
<pre class="brush: bash; title: ; notranslate" title="">[root@Zabbix-Server 2.0]# ./build-key fuwuqi120
</pre>
<p>4）修改相关配置文件<br />
为了方便，将keys文件夹整个拷贝到OpenVPN的安装目录/usr/local/openvpn/</p>
<pre class="brush: bash; title: ; notranslate" title="">[root@Zabbix-Server 2.0]# cp -rp keys/ /usr/local/openvpn/
</pre>
<p>拷贝OpenVPN的配置文件/root/src/openvpn-2.2.2/sample-config-files/server.conf到OpenVPN的安装目录</p>
<pre class="brush: bash; title: ; notranslate" title="">[root@Zabbix-Server 2.0]# mkdir /usr/local/openvpn/etc
[root@Zabbix-Server 2.0]# cd ../../sample-config-files/
[root@Zabbix-Server sample-config-files]# cp server.conf /usr/local/openvpn/etc/
</pre>
<p>编辑配置文件/usr/local/openvpn/etc/server.conf</p>
<pre class="brush: bash; title: ; notranslate" title="">[root@Zabbix-Server sample-config-files]# cd /usr/local/openvpn/etc/
[root@Zabbix-Server etc]# vim server.conf
####vim server.conf 新增加或修改的项####
proto tcp    #使用TCP协议通信
ca /usr/local/openvpn/keys/ca.crt
cert /usr/local/openvpn/keys/server.crt
key /usr/local/openvpn/keys/server.key
server 10.8.0.0 255.255.255.0    #OpenVPN服务启动时为VPN网络分配的网段
push "dhcp-option DNS 202.96.209.5"
push "route 10.10.10.0 255.255.255.0"    #内网
#指定日志文件，默认的日志送给syslog记录在/var/log/message文件
log         /var/log/openvpn.log
####vim server.conf####
</pre>
<p>#开启系统IP转发功能，让数据包在不同的网段之间流通</p>
<pre class="brush: bash; title: ; notranslate" title="">[root@Zabbix-Server etc]# echo "1" &gt; /proc/sys/net/ipv4/ip_forward
上面只是临时开启IP转发功能，下次开机后失效。更改文件/etc/sysctl.conf使其永久生效。
[root@Zabbix-Server etc]# vim /etc/sysctl.conf
####vim 更改的参数 ####
net.ipv4.ip_forward = 1
#使用sysctl -p使参数立即生效
[root@Zabbix-Server etc]# sysctl -p
</pre>
<p>5）启动OpenVPN server</p>
<pre class="brush: bash; title: ; notranslate" title="">[root@Zabbix-Server openvpn]# /usr/local/openvpn/sbin/openvpn --config /usr/local/openvpn/etc/server.conf
#一般放到后台运行的这样
[root@Zabbix-Server openvpn]# nohup /usr/local/openvpn/sbin/openvpn --config /usr/local/openvpn/etc/server.conf &amp;
</pre>
<p>当然也可以使用源码包提供的脚本/root/src/openvpn-2.2.2/sample-scripts/openvpn.init稍加修改就适应当前的环境。</p>
<pre class="brush: bash; title: ; notranslate" title="">[root@Zabbix-Server sample-scripts]# cp openvpn.init /etc/init.d/openvpn
[root@Zabbix-Server sample-scripts]# vim /etc/init.d/openvpn
####vim openvpn 需要更改的项####
#添加openvpn可执行文件自定义的安装目录/usr/local/openvpn/sbin/openvpn
openvpn_locations="/usr/sbin/openvpn /usr/local/sbin/openvpn /usr/local/openvpn/sbin/openvpn"
#更改配置文件目录为/usr/local/openvpn/etc
work=/usr/local/openvpn/etc
####vim openvpn ####
#启动openvpn并加入开机启动项
[root@Zabbix-Server sample-scripts]# /etc/init.d/openvpn start
正在启动 openvpn：                                         [确定]
[root@Zabbix-Server sample-scripts]# chkconfig openvpn on
[root@Zabbix-Server sample-scripts]#
</pre>
<p>6）先安装OpenVPN客户端（我的win7 64位）安装程序也在网盘中，然后将keys文件夹下相关的三个证书ca.crt, fuwuqi120.crt, fuwuqi120.key文件放到客服端的C:\Program Files\OpenVPN\config文件夹下。</p>
<p>然后以OpenVPN服务端提供的client.conf（/root/src/openvpn-2.0.9/sample-config-files/client.conf）文件为模板建立客户端的配置文件，windows需要将后缀名改成.ovpn<br />
需要更改的项只有4项分别是：remote，ca，cert，key，我的一份配置fuwuqi120.ovpn如下：</p>
<pre class="brush: bash; title: ; notranslate" title="">client
dev tun
proto tcp
remote 192.168.5.168 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert fuwuqi120.crt
key fuwuqi120.key
comp-lzo
verb 3
</pre>
<p>配置完成后就可以双击OpenVPN的图标启动客户端程序，然后右击右下角的小图标选择“connect”连接即可。</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/openvpn%e9%83%a8%e7%bd%b2-%e5%ae%89%e8%a3%85openvpn%e6%9c%8d%e5%8a%a1%e7%ab%af/">OpenVPN部署 安装OpenVPN服务端</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></content:encoded>
			<wfw:commentRss>https://www.fuwuqiok.com/openvpn%e9%83%a8%e7%bd%b2-%e5%ae%89%e8%a3%85openvpn%e6%9c%8d%e5%8a%a1%e7%ab%af/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>在CentOS 6上部署PPTP VPN Server</title>
		<link>https://www.fuwuqiok.com/%e5%9c%a8centos-6%e4%b8%8a%e9%83%a8%e7%bd%b2pptp-vpn-server/</link>
		<comments>https://www.fuwuqiok.com/%e5%9c%a8centos-6%e4%b8%8a%e9%83%a8%e7%bd%b2pptp-vpn-server/#comments</comments>
		<pubDate>Sat, 26 Sep 2015 14:07:33 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[服务器迁移]]></category>
		<category><![CDATA[在CentOS 6上部署PPTP VPN Server]]></category>
		<category><![CDATA[系统安全]]></category>

		<guid isPermaLink="false">https://www.fuwuqiok.com/?p=2709</guid>
		<description><![CDATA[<p>背景介绍： 搭建PPTP VPN Server应该是每个站长都应该会的技能，搭建也是非常容易的。 相关配置：  [&#8230;]</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e5%9c%a8centos-6%e4%b8%8a%e9%83%a8%e7%bd%b2pptp-vpn-server/">在CentOS 6上部署PPTP VPN Server</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></description>
				<content:encoded><![CDATA[<p><strong>背景介绍：</strong><br />
搭建PPTP VPN Server应该是每个站长都应该会的技能，搭建也是非常容易的。</p>
<p><strong>相关配置：</strong><br />
OS: CentOS 6.4 x86_64 Minimal</p>
<p>1. 安装EPEL扩展库<br />
# yum install http://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm</p>
<p>2. 安装PPTP扩展库<br />
# yum install http://poptop.sourceforge.net/yum/stable/rhel6/pptp-release-current.noarch.rpm</p>
<p>3. 安装PPTP VPN Server<br />
# yum install pptpd</p>
<p>4. 编辑/etc/pptpd.conf<br />
# vim /etc/pptpd.conf</p>
<pre>###############################################################################
# $Id: pptpd.conf,v 1.11 2011/05/19 00:02:50 quozl Exp $
#
# Sample Poptop configuration file /etc/pptpd.conf
#
# Changes are effective when pptpd is restarted.
###############################################################################

# TAG: ppp
#	Path to the pppd program, default '/usr/sbin/pppd' on Linux
#
#ppp /usr/sbin/pppd

# TAG: option
#	Specifies the location of the PPP options file.
#	By default PPP looks in '/etc/ppp/options'
#
option /etc/ppp/options.pptpd

# TAG: debug
#	Turns on (more) debugging to syslog
#
debug

# TAG: stimeout
#	Specifies timeout (in seconds) on starting ctrl connection
#
stimeout 120

# TAG: noipparam
#       Suppress the passing of the client's IP address to PPP, which is
#       done by default otherwise.
#
#noipparam

# TAG: logwtmp
#	Use wtmp(5) to record client connections and disconnections.
#
#logwtmp

# TAG: vrf &lt;vrfname&gt;
#	Switches PPTP &amp; GRE sockets to the specified VRF, which must exist
#	Only available if VRF support was compiled into pptpd.
#
#vrf test

# TAG: bcrelay &lt;if&gt;
#	Turns on broadcast relay to clients from interface &lt;if&gt;
#
#bcrelay eth1

# TAG: delegate
#	Delegates the allocation of client IP addresses to pppd.
#
#       Without this option, which is the default, pptpd manages the list of
#       IP addresses for clients and passes the next free address to pppd.
#       With this option, pptpd does not pass an address, and so pppd may use
#       radius or chap-secrets to allocate an address.
#
#delegate

# TAG: connections
#       Limits the number of client connections that may be accepted.
#
#       If pptpd is allocating IP addresses (e.g. delegate is not
#       used) then the number of connections is also limited by the
#       remoteip option.  The default is 100.
#connections 100

# TAG: localip
# TAG: remoteip
#	Specifies the local and remote IP address ranges.
#
#	These options are ignored if delegate option is set.
#
#       Any addresses work as long as the local machine takes care of the
#       routing.  But if you want to use MS-Windows networking, you should
#       use IP addresses out of the LAN address space and use the proxyarp
#       option in the pppd options file, or run bcrelay.
#
#	You can specify single IP addresses seperated by commas or you can
#	specify ranges, or both. For example:
#
#		192.168.0.234,192.168.0.245-249,192.168.0.254
#
#	IMPORTANT RESTRICTIONS:
#
#	1. No spaces are permitted between commas or within addresses.
#
#	2. If you give more IP addresses than the value of connections,
#	   it will start at the beginning of the list and go until it
#	   gets connections IPs.  Others will be ignored.
#
#	3. No shortcuts in ranges! ie. 234-8 does not mean 234 to 238,
#	   you must type 234-238 if you mean this.
#
#	4. If you give a single localIP, that's ok - all local IPs will
#	   be set to the given one. You MUST still give at least one remote
#	   IP for each simultaneous client.
#
# (Recommended)
#localip 192.168.0.1
#remoteip 192.168.0.234-238,192.168.0.245
# or
#localip 192.168.0.234-238,192.168.0.245
#remoteip 192.168.1.234-238,192.168.1.245
localip 10.192.168.1
remoteip 10.192.168.100-200
</pre>
<p>注解：在以上配置文件中，<br />
指定了PPP配置文件路径：option /etc/ppp/options.pptpd<br />
开启了调试日志：debug<br />
设置了建立连接时的超时时间为120秒：stimeout 120<br />
PPTP VPN Server的本地地址，即客户端会自动获取到的网关地址：localip 10.192.168.1<br />
分配给客户端的地址范围：remoteip 10.192.168.100-200</p>
<p>5. 编辑/etc/ppp/options.pptpd</p>
<pre>###############################################################################
# $Id: options.pptpd,v 1.11 2005/12/29 01:21:09 quozl Exp $
#
# Sample Poptop PPP options file /etc/ppp/options.pptpd
# Options used by PPP when a connection arrives from a client.
# This file is pointed to by /etc/pptpd.conf option keyword.
# Changes are effective on the next connection.  See "man pppd".
#
# You are expected to change this file to suit your system.  As
# packaged, it requires PPP 2.4.2 and the kernel MPPE module.
###############################################################################


# Authentication

# Name of the local system for authentication purposes
# (must match the second field in /etc/ppp/chap-secrets entries)
name ec2-tokyo

# Strip the domain prefix from the username before authentication.
# (applies if you use pppd with chapms-strip-domain patch)
#chapms-strip-domain


# Encryption
# (There have been multiple versions of PPP with encryption support,
# choose with of the following sections you will use.)


# BSD licensed ppp-2.4.2 upstream with MPPE only, kernel module ppp_mppe.o
# {{{
refuse-pap
refuse-chap
refuse-mschap
# Require the peer to authenticate itself using MS-CHAPv2 [Microsoft
# Challenge Handshake Authentication Protocol, Version 2] authentication.
require-mschap-v2
# Require MPPE 128-bit encryption
# (note that MPPE requires the use of MSCHAP-V2 during authentication)
require-mppe-128
# }}}


# OpenSSL licensed ppp-2.4.1 fork with MPPE only, kernel module mppe.o
# {{{
#-chap
#-chapms
# Require the peer to authenticate itself using MS-CHAPv2 [Microsoft
# Challenge Handshake Authentication Protocol, Version 2] authentication.
#+chapms-v2
# Require MPPE encryption
# (note that MPPE requires the use of MSCHAP-V2 during authentication)
#mppe-40	# enable either 40-bit or 128-bit, not both
#mppe-128
#mppe-stateless
# }}}


# Network and Routing

# If pppd is acting as a server for Microsoft Windows clients, this
# option allows pppd to supply one or two DNS (Domain Name Server)
# addresses to the clients.  The first instance of this option
# specifies the primary DNS address; the second instance (if given)
# specifies the secondary DNS address.
#ms-dns 10.0.0.1
#ms-dns 10.0.0.2
ms-dns 172.31.0.2

# If pppd is acting as a server for Microsoft Windows or "Samba"
# clients, this option allows pppd to supply one or two WINS (Windows
# Internet Name Services) server addresses to the clients.  The first
# instance of this option specifies the primary WINS address; the
# second instance (if given) specifies the secondary WINS address.
#ms-wins 10.0.0.3
#ms-wins 10.0.0.4

# Add an entry to this system's ARP [Address Resolution Protocol]
# table with the IP address of the peer and the Ethernet address of this
# system.  This will have the effect of making the peer appear to other
# systems to be on the local ethernet.
# (you do not need this if your PPTP server is responsible for routing
# packets to the clients -- James Cameron)
proxyarp

# Normally pptpd passes the IP address to pppd, but if pptpd has been
# given the delegate option in pptpd.conf or the --delegate command line
# option, then pppd will use chap-secrets or radius to allocate the
# client IP address.  The default local IP address used at the server
# end is often the same as the address of the server.  To override this,
# specify the local IP address here.
# (you must not use this unless you have used the delegate option)
#10.8.0.100


# Logging

# Enable connection debugging facilities.
# (see your syslog configuration for where pppd sends to)
debug

# Print out all the option values which have been set.
# (often requested by mailing list to verify options)
dump


# Miscellaneous

# Create a UUCP-style lock file for the pseudo-tty to ensure exclusive
# access.
lock

# Disable BSD-Compress compression
nobsdcomp

# Disable Van Jacobson compression
# (needed on some networks with Windows 9x/ME/XP clients, see posting to
# poptop-server on 14th April 2005 by Pawel Pokrywka and followups,
# http://marc.theaimsgroup.com/?t=111343175400006&amp;r=1&amp;w=2 )
novj
novjccomp

# turn off logging to stderr, since this may be redirected to pptpd,
# which may trigger a loopback
nologfd

# put plugins here
# (putting them higher up may cause them to sent messages to the pty)

logfile /var/log/pptpd.log
multilink
</pre>
<p>注解：在以上配置文件中，<br />
定义了PPTP VPN Server的服务名：name ec2-tokyo<br />
定义了加密的规则，如下：<br />
refuse-pap<br />
refuse-chap<br />
refuse-mschap<br />
require-mschap-v2<br />
require-mppe-128<br />
定义了推送到客户端的DNS地址：ms-dns 172.31.0.2 （我通常选择PPTP VPN Server所在服务器的默认DNS设置）<br />
允许相同局域网的主机在PPTP VPN Server上互相可见：proxyarp<br />
开启了调试信息：debug<br />
启用了一些通用的设置，如下：<br />
dump<br />
lock<br />
nobsdcomp<br />
novj<br />
novjccomp<br />
nologfd<br />
指定了日志文件的位置：logfile /var/log/pptpd.log<br />
允许把多个物理通道捆绑为单一逻辑信道：multilink</p>
<p>6. 编辑用户账号密码文件/etc/ppp/chap-secrets<br />
# vim /etc/ppp/chap-secrets</p>
<pre># Secrets for authentication using CHAP
# client	server	secret			IP addresses
"fuwuqiok.com"  *       "password"        *
</pre>
<p>7. 编辑/etc/sysconfig/iptables-config<br />
修改 IPTABLES_MODULES=&#8221;&#8221; 为 IPTABLES_MODULES=&#8221;ip_nat_pptp&#8221; 确保在启动iptables服务时自动加载模块。</p>
<p>8. 编辑/etc/sysconfig/iptables（默认eth0为公网IP地址所在网口）<br />
# vim /etc/sysconfig/iptables</p>
<pre>*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p gre -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 1723 -j ACCEPT
-A INPUT -s 10.192.168.0/255.255.255.0 -m state --state NEW -m tcp -p tcp -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A POSTROUTING -s 10.192.168.0/255.255.255.0 -o eth0 -j MASQUERADE
COMMIT
</pre>
<p>注解：在以上iptables脚本中，<br />
对所有GRE协议的数据包放行；<br />
对TCP端口1723放行；<br />
对整个PPTP VPN的局域网地址段10.192.168.0/24放行；<br />
将整个PPTP VPN的局域网地址段10.192.168.0/24通过NAT映射到eth0网口，实现共享上网；</p>
<p>9. 开启数据转发，编辑/etc/sysctl.conf<br />
修改 net.ipv4.ip_forward = 0 为 net.ipv4.ip_forward = 1<br />
执行 sysctl -p</p>
<p>10. 启动PPTP VPN Server<br />
# /etc/init.d/pptpd restart<br />
# /etc/init.d/iptables restart</p>
<p>11. 设置PPTP VPN Server与iptables服务开机自启动<br />
# chkconfig pptpd on<br />
# chkconfig iptables on</p>
<p>12. 在本地PC上配置客户端并连接PPTP VPN Server</p>
<p>ps　对于使用OpenVPN部署 iptables设置</p>
<p>如果安装好openvpn后能拨号成功，也能成功登录openvpn服务器，但是怎么也登录不了除openvpn服务器外的其它内网机器，这时需要配置iptables实现内网任何机器的登陆。<br />
1、打开系统的转发功能</p>
[root@who-am-i ~]# vim /etc/sysctl.conf<br />
net.ipv4.ip_forward = 1<br />
[root@who-am-i ~]# sysctl -p</p>
<p>2、新增iptable规则</p>
[root@who-am-i ~]# vim /bin/iptables.sh<br />
iptables -t nat -F</p>
<p>####openvpn####<br />
iptables -A INPUT -p tcp &#8211;destination-port 1194 -j ACCEPT<br />
iptables -A INPUT -i tun0 -j ACCEPT<br />
iptables -A INPUT -i lo -j ACCEPT<br />
iptables -t nat -A POSTROUTING -s 192.168.85.0/24 -j SNAT &#8211;to-source 10.10.10.167</p>
<p>#iptables -A FORWARD -j DROP</p>
<p>说明：<br />
首先删除所有的nat表。<br />
开放openvpn服务监控端口1194。<br />
开放openvpn的虚拟网络设备tun0。<br />
开放lo。<br />
添加nat规则，对所有源地址（openvpn为客户端分配的地址）为192.168.85.0/24的数据包转发后进行源地址伪装，伪装成openvpn服务器内网地址10.10.10.167，这样就可以内网的其它机器通信了。<br />
注释默认规则 iptables -A FORWARD -j DROP 允许任何数据包的转发。</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e5%9c%a8centos-6%e4%b8%8a%e9%83%a8%e7%bd%b2pptp-vpn-server/">在CentOS 6上部署PPTP VPN Server</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></content:encoded>
			<wfw:commentRss>https://www.fuwuqiok.com/%e5%9c%a8centos-6%e4%b8%8a%e9%83%a8%e7%bd%b2pptp-vpn-server/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>生产线上HAProxy内核参数调优</title>
		<link>https://www.fuwuqiok.com/%e7%94%9f%e4%ba%a7%e7%ba%bf%e4%b8%8ahaproxy%e5%86%85%e6%a0%b8%e5%8f%82%e6%95%b0%e8%b0%83%e4%bc%98/</link>
		<comments>https://www.fuwuqiok.com/%e7%94%9f%e4%ba%a7%e7%ba%bf%e4%b8%8ahaproxy%e5%86%85%e6%a0%b8%e5%8f%82%e6%95%b0%e8%b0%83%e4%bc%98/#comments</comments>
		<pubDate>Sat, 26 Sep 2015 14:00:43 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[服务器迁移]]></category>
		<category><![CDATA[生产线上HAProxy内核参数调优]]></category>
		<category><![CDATA[系统安全]]></category>

		<guid isPermaLink="false">https://www.fuwuqiok.com/?p=2706</guid>
		<description><![CDATA[<p>HAProxy生产环境配置 CPU: 8核 内存: 16G 数量：4 Servers 数量: 150 类型：H [&#8230;]</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e7%94%9f%e4%ba%a7%e7%ba%bf%e4%b8%8ahaproxy%e5%86%85%e6%a0%b8%e5%8f%82%e6%95%b0%e8%b0%83%e4%bc%98/">生产线上HAProxy内核参数调优</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></description>
				<content:encoded><![CDATA[<p><strong>HAProxy生产环境配置</strong><br />
CPU: 8核<br />
内存: 16G<br />
数量：4</p>
<p><strong>Servers</strong><br />
数量: 150<br />
类型：HTTP/HTTPS响应GET/POST请求，返回json数据并产生日志<br />
稳定支持的并发会话数量：400K</p>
<p><strong>系统相关配置</strong><br />
# grep -E &#8216;maxconn|nbproc&#8217; /etc/haproxy/haproxy.cfg</p>
<pre>maxconn     200000
nbproc           7
</pre>
<p># cat /etc/security/limits.d/90-nproc.conf</p>
<pre># Default limit for number of user's processes to prevent
# accidental fork bombs.
# See rhbz #432903 for reasoning.

*          -    nproc     4096
root       -    nproc     unlimite
</pre>
<p># cat /etc/security/limits.d/90-nofile.conf</p>
<p><code class="plain">*          -    nofile     200000</code></p>
<p># cat /etc/sysctl.conf</p>
<pre># Kernel sysctl configuration file for Red Hat Linux
#
# For binary values, 0 is disabled, 1 is enabled.  See sysctl(8) and
# sysctl.conf(5) for more details.

# Controls IP packet forwarding
net.ipv4.ip_forward = 1
net.ipv4.ip_nonlocal_bind = 1

# Controls source route verification
net.ipv4.conf.default.rp_filter = 0

# Do not accept source routing
net.ipv4.conf.default.accept_source_route = 0

# Controls the System Request debugging functionality of the kernel
kernel.sysrq = 0

# Controls whether core dumps will append the PID to the core filename.
# Useful for debugging multi-threaded applications.
kernel.core_uses_pid = 1

# Controls the use of TCP syncookies
net.ipv4.tcp_syncookies = 1

# Disable netfilter on bridges.
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0

# Controls the maximum size of a message, in bytes
kernel.msgmnb = 65536

# Controls the default maxmimum size of a mesage queue
kernel.msgmax = 65536

# Controls the maximum shared segment size, in bytes
kernel.shmmax = 68719476736

# Controls the maximum number of shared memory segments, in pages
kernel.shmall = 4294967296

# Maximize ephemeral port range
net.ipv4.ip_local_port_range = 1024 65535

# ARP related
net.ipv4.conf.all.arp_notify = 1
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2

# General gigabit tuning
net.core.somaxconn = 32768
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.rmem_default = 16777216
net.core.wmem_default = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 87380 16777216
net.ipv4.tcp_mem = 94500000 915000000 927000000

# Give the kernel more memory for tcp
# which need with many (100k+) open socket connections
net.core.netdev_max_backlog = 262144
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_max_tw_buckets = 2000000
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_no_metrics_save = 1
net.ipv4.tcp_fin_timeout = 1
net.ipv4.tcp_keepalive_probes = 5
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_time = 1800
net.ipv4.tcp_slow_start_after_idle = 0

## Protect against tcp time-wait assassination hazards
## drop RST packets for sockets in the time-wait state
net.ipv4.tcp_rfc1337 = 1

# Enusre that immediatly subsequent connections use the new values
net.ipv4.route.flush = 1

# Increase system file descriptor limit
fs.file-max = 200000
kernel.pid_max = 65536

# Limit number of orphans, each orphan can eat up to 16M (max wmem) of unswappable memory
net.ipv4.tcp_max_orphans = 60000
net.ipv4.tcp_synack_retries = 3
net.ipv4.tcp_syn_retries = 3
</pre>
<p>&nbsp;</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e7%94%9f%e4%ba%a7%e7%ba%bf%e4%b8%8ahaproxy%e5%86%85%e6%a0%b8%e5%8f%82%e6%95%b0%e8%b0%83%e4%bc%98/">生产线上HAProxy内核参数调优</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></content:encoded>
			<wfw:commentRss>https://www.fuwuqiok.com/%e7%94%9f%e4%ba%a7%e7%ba%bf%e4%b8%8ahaproxy%e5%86%85%e6%a0%b8%e5%8f%82%e6%95%b0%e8%b0%83%e4%bc%98/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>网站防cc攻击iptables方法</title>
		<link>https://www.fuwuqiok.com/%e7%bd%91%e7%ab%99%e9%98%b2cc%e6%94%bb%e5%87%bbiptables%e6%96%b9%e6%b3%95/</link>
		<comments>https://www.fuwuqiok.com/%e7%bd%91%e7%ab%99%e9%98%b2cc%e6%94%bb%e5%87%bbiptables%e6%96%b9%e6%b3%95/#comments</comments>
		<pubDate>Sun, 23 Aug 2015 10:29:06 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[cc攻击]]></category>
		<category><![CDATA[iptables]]></category>
		<category><![CDATA[系统安全]]></category>
		<category><![CDATA[网站防cc攻击iptables方法]]></category>

		<guid isPermaLink="false">https://www.fuwuqiok.com/?p=2701</guid>
		<description><![CDATA[<p>CC攻击原理 CC攻击的原理就是攻击者控制某些主机不停地发大量数据包给对方服务器造成服务器资源耗尽，一直 到宕 [&#8230;]</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e7%bd%91%e7%ab%99%e9%98%b2cc%e6%94%bb%e5%87%bbiptables%e6%96%b9%e6%b3%95/">网站防cc攻击iptables方法</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></description>
				<content:encoded><![CDATA[<p><strong>CC攻击原理</strong><br />
CC攻击的原理就是攻击者控制某些主机不停地发大量数据包给对方服务器造成服务器资源耗尽，一直 到宕机崩溃。CC主要是用来攻击页面的，每个人都有这样的体验：当一个网页访问的人数特别多的时候，打开网页就慢了，CC就是模拟多个用户（多少线程就是 多少用户）不停地进行访问那些需要大量数据操作（就是需要大量CPU时间）的页面，造成服务器资源的浪费，CPU长时间处于100%，永远都有处理不完的 连接直至就网络拥塞，正常的访问被中止。</p>
<p>1、第一种<br />
#!/bin/sh<br />
IP=`tail -1000 access.log| awk &#8216;{print $1}&#8217; | sort | uniq -c | sort -rn|awk &#8216;$1 &gt; 100 {print $2}&#8217;`<br />
for i in $IP<br />
do<br />
iptables -I INPUT -p tcp &#8211;dport 80 -s $i -j DROP<br />
done</p>
<p>2、第二种<br />
#!/bin/sh<br />
status=`netstat -na|awk &#8216;$5 ~ /[0-9]+:[0-9]+/ {print $5}&#8217; |awk -F &#8220;:&#8221; &#8212; &#8216;{print $1}&#8217; |sort -n|uniq -c |sort -n|tail -n 1`<br />
NUM=`echo $status|awk &#8216;{print $1}&#8217;`<br />
IP=`echo $status|awk &#8216;{print $2}&#8217;`<br />
result=`echo &#8220;$NUM &gt; 100&#8243; | bc`<br />
if [ $result = 1 ]
then<br />
echo IP:$IP is over $NUM, BAN IT! &gt;&gt; ip_deny.txt<br />
/sbin/iptables -I INPUT -s $IP -j DROP<br />
fi</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e7%bd%91%e7%ab%99%e9%98%b2cc%e6%94%bb%e5%87%bbiptables%e6%96%b9%e6%b3%95/">网站防cc攻击iptables方法</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></content:encoded>
			<wfw:commentRss>https://www.fuwuqiok.com/%e7%bd%91%e7%ab%99%e9%98%b2cc%e6%94%bb%e5%87%bbiptables%e6%96%b9%e6%b3%95/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iptables 屏蔽IP</title>
		<link>https://www.fuwuqiok.com/iptables-%e5%b1%8f%e8%94%bdip/</link>
		<comments>https://www.fuwuqiok.com/iptables-%e5%b1%8f%e8%94%bdip/#comments</comments>
		<pubDate>Sun, 23 Aug 2015 10:26:22 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[iptables 屏蔽IP]]></category>
		<category><![CDATA[系统安全]]></category>

		<guid isPermaLink="false">https://www.fuwuqiok.com/?p=2699</guid>
		<description><![CDATA[<p>IPdeny 下载以国家代码编制好的 IP 地址列表，比如下载 cn.zone： 有了国家的所有 IP 地址， [&#8230;]</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/iptables-%e5%b1%8f%e8%94%bdip/">iptables 屏蔽IP</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></description>
				<content:encoded><![CDATA[<p>IPdeny 下载以国家代码编制好的 IP 地址列表，比如下载 cn.zone：<br />
有了国家的所有 IP 地址，要想屏蔽这些 IP 就很容易了，直接写个脚本逐行读取 cn.zone 文件并加入到 iptables 中：</p>
<div class="code">
#!/bin/bash<br />
# Block traffic from a specific country<br />
# written by fuwuqiok.com</p>
<p>COUNTRY=&#8221;cn&#8221;<br />
IPTABLES=/sbin/iptables<br />
EGREP=/bin/egrep</p>
<p>if [ &#8220;$(id -u)&#8221; != &#8220;0&#8221; ]; then<br />
echo &#8220;you must be root&#8221; 1&gt;&amp;2<br />
exit 1<br />
fi</p>
<p>resetrules() {<br />
$IPTABLES -F<br />
$IPTABLES -t nat -F<br />
$IPTABLES -t mangle -F<br />
$IPTABLES -X<br />
}</p>
<p>resetrules</p>
<p>for c in $COUNTRY<br />
do<br />
country_file=$c.zone</p>
<p>IPS=$($EGREP -v &#8220;^#|^$&#8221; $country_file)<br />
for ip in $IPS<br />
do<br />
echo &#8220;blocking $ip&#8221;<br />
$IPTABLES -A INPUT -s $ip -j DROP<br />
done<br />
done</p>
<p>exit 0</p></div>
<p>以上脚本可以延伸成防ddos攻击！</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/iptables-%e5%b1%8f%e8%94%bdip/">iptables 屏蔽IP</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></content:encoded>
			<wfw:commentRss>https://www.fuwuqiok.com/iptables-%e5%b1%8f%e8%94%bdip/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
