Centos6.8 X64下安装OpenVPN,centos6架设VPN,OpenVPN免流教程

迅恒数据中心

Centos6.8 X64下安装OpenVPN
环境说明:
安装版本为openvpn-2.3.11-1.el6.x86_64

相关资源下载连接如下:
http://pan.baidu.com/s/1bp64xsF 提取码98di
将安装源rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm、epel-release-6-8.noarch.rpm等上传到/home

1、关闭selinux安全
vi /etc/selinux/config
把SELINUX=enforcing 改为SELINUX=disabled后存盘退出,重启机器.

2. 安装"EPEL"源
cd /home
rpm -ivh rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
rpm -Uvh epel-release-6-8.noarch.rpm


3. 安装openvpn
yum install lzo lzo-devel
rpm -qa | grep lzo
yum -y install openSSL openssl-devel
rpm -qa | grep openssl
yum install openvpn easy-rsa
rpm -qa | grep openvpn

4. easy-rsa配置
mkdir -p /etc/openvpn/easy-rsa/keys
cp -rf /usr/share/easy-rsa/2.0/*   /etc/openvpn/easy-rsa/

5. 创建CA证书和密钥
vi /etc/openvpn/easy-rsa/vars
注释掉下满3个:
# PKCS11 fixes
# export PKCS11_MODULE_PATH="dummy"
# export PKCS11_PIN="dummy"
更改为你自己的国家,省份,城市,组织,邮箱,单位:
export KEY_COUNTRY="CN"
export KEY_PROVINCE="GD"
export KEY_CITY="GuangZhou"  
export KEY_ORG="XHISP.NET"
export KEY_EMAIL="me@xhisp.net"
export KEY_OU="XHISP"

继续命令:
cd /etc/openvpn/easy-rsa
cp openssl-1.0.0.cnf openssl.cnf
source ./vars
./clean-all
./build-ca  #创建CA证书和密钥,一直回车

6.  创建服务端的证书和密钥(在/etc/openvpn/easy-rsa中执行):
./build-key-server server
#一直回车,其中有2处选择y

7.  创建客户端的证书和密钥
./build-key client
#一直回车,其中有2处选择y

8.  创建 迪菲 霍尔曼密钥交换参数
创建DH参数.此过程时间比较久:
./build-dh

9、生成ta.key文件,防止DDOS、UDP淹没等恶意攻击
openvpn --genkey --secret /etc/openvpn/easy-rsa/keys/ta.key
#客户端证书秘钥:ca.crt、client.crt、client.key、ta.key(以后编辑openvpn客户端配置文件会用到)
#用ll keys可以查看生成的所有文件

10、更改主机名称,不然启动会报错。
vi /etc/hosts
将其中的localhost.localdomain修改为正确的主机名
如果你的服务器在安装的时候没设置主机名就不用修改
可以用hostname命令查看服务器的主机名

11.直接使用证书认证方式
vi /etc/openvpn/server.conf
详细内容如下:
port 443
proto udp
dev tun

ca /etc/openvpn/easy-rsa/keys/ca.crt
cert /etc/openvpn/easy-rsa/keys/server.crt
key /etc/openvpn/easy-rsa/keys/server.key
dh /etc/openvpn/easy-rsa/keys/dh2048.pem

server 10.8.0.0 255.255.255.0
ifconfig-pool-persist /var/log/ipp.txt

push "dhcp-option DNS 114.114.114.114"
push "dhcp-option DNS 8.8.4.4"
push "dhcp-option DNS 202.96.128.86"
push "dhcp-option DNS 202.96.134.133"
push "route 10.8.0.0 255.255.255.0"
push "redirect-gateway"   #所有用户端流量都走VPN出去

duplicate-cn
keepalive 10 120

tls-auth /etc/openvpn/easy-rsa/keys/ta.key 0

comp-lzo
persist-key
persist-tun
status /var/log/openvpn-status.log
log   /var/log/openvpn.log
verb 3

12、启动服务
mkdir /var/log/openvpn
service openvpn start
chkconfig openvpn on #设置OpenVPN开机启动
启动后查看服务是否正常:
tail -f /var/log/openvpn.log
tarting openvpn: /etc/init.d/openvpn: line 162:   328 Segmentation fault 
这里可能报错,因为openvpn的启动脚本和发行版稍有差别,可编辑文件/etc/init.d/openvpn里面注释如下几行:
# Source networking configuration.
#. /etc/sysconfig/network
# Check that networking is up.
#if [ ${NETWORKING} = "no" ]
#then
#  echo "Networking isdown"
#  exit 0
#fi
#我直接将上面注释掉了

13、设置IP包转发:
开启路由转发:
vi /etc/sysctl.conf
将 net.ipv4.ip_forward = 1 值改为1.
然后执行命令使其生效:
sysctl -p
配置iptables内网转发和增加规则:
iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j MASQUERADE
service iptables save || iptables-save > /etc/sysconfig/iptables
#上面的规则可以将-o eth0去掉
然后修改vi /etc/sysconfig/iptables在-A INPUT -i lo -j ACCEPT下行加入规则:
-A INPUT -i tun0 -j ACCEPT
-A INPUT -p udp -m udp --dport 443 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
-A INPUT -s 10.8.0.0/255.255.255.0 -j ACCEPT
在-A FORWARD -j REJECT --reject-with icmp-host-prohibited前面加入规则:
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -s 10.8.0.0/255.255.255.0 -j ACCEPT
保存后重启防火墙生效service iptables restart
最终iptables防火墙规则参考:
*nat
:PREROUTING ACCEPT [10:1426]
:POSTROUTING ACCEPT [3:269]
:OUTPUT ACCEPT [3:269]
-A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j MASQUERADE
COMMIT
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [71798:8685596]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -i tun0 -j ACCEPT
-A INPUT -p udp -m udp --dport 443 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -s 10.8.0.0/255.255.255.0 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -s 10.8.0.0/255.255.255.0 -j ACCEPT
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT


14、客户端配置
在服务器中生成的客户端证书和配置文件在/etc/openvpn/easy-rsa/keys下
ca.crt、client.crt、client.key、ta.key(如果不开启tls-auth,则无需该文件)、client.ovpn(这个是在本地电脑建的)
使用Notepad++ 编辑软件,打开上面所说的四个证书与key文件内容,分别粘贴到client.ovpn相对应的地方。
client.ovpn内容及格式如下(14.17.65.108是OpenVPN服务器的IP):
client
dev tun
proto udp
remote 14.17.65.108 443
resolv-retry infinite
nobind
persist-key
persist-tun
ns-cert-type server
comp-lzo
verb 3


## /etc/openvpn/easy-rsa/keys/ca.crt
<ca>
-----BEGIN CERTIFICATE-----
MIIEzTCCA7……代码省略
-----END CERTIFICATE-----
</ca>

##/etc/openvpn/easy-rsa/keys/client.crt
<cert>
-----BEGIN CERTIFICATE-----
MIIFCjCCA……代码省略
-----END CERTIFICATE-----
</cert>

##/etc/openvpn/easy-rsa/keys/client.key
<key>
-----BEGIN PRIVATE KEY-----
MIIEvgI……代码省略
-----END PRIVATE KEY-----
</key>

##/etc/openvpn/easy-rsa/keys/ta.key
key-direction 1
<tls-auth>
-----BEGIN OpenVPN Static key V1-----
7b18b95dd86……代码省略
-----END OpenVPN Static key V1-----
</tls-auth>

15、客户端连接:
A、在Windows系统中:
如果是安装openvpn-install-2.3.3-I002-x86_64.exe的就将client.ovpn放于C:/Program Files/OpenVPN/config下
如果是安装SecurepointSSLVPN_RC4.exe安装就启动后导入client.ovpn文件(在path to the *.ovpn file处导入)
B、安卓系统中安装好openvpn-1.1.17-76.apk。
将openvpn导入即可:
依次选择“Import”---"Import Profile from card ",找到client.ovpn,导入

以上,openvpn client 是使用的证书+key方式认证拨通VPN的。


====================================================================================
如果服务器端server.conf使用Mysql 帐号、密码来验证时,需要加的四行参数:
plugin /lib64/security/openvpn-auth-pam.so openvpn_mysql
client-cert-not-required
username-as-common-name
auth-nocache
通过Mysql 帐号、密码来验证请看后面的详细介绍
====================================================================================
一、使用Mysql pam数据库认证(认证方法二)
1、安装并建立数据库
先删除以前版本数据库
# rpm -qa | grep mysql
mysql-5.0.77-4.el5_6.6
mod_auth_mysql-3.0.0-3.2.el5_3
mysql-libs-5.1.73-3.el6_5.x86_64
# rpm -e mod_auth_mysql-3.0.0-3.2.el5_3
# rpm -e mysql-5.0.77-4.el5_6.6
# yum -y remove mysql-libs-5.1*
请按顺序删除旧版本的数据库。

rpm安装Mysql 5.7.4-m14版本,
# rpm -ivh MySQL-server-5.7.4_m14-1.el6.x86_64.rpm
# rpm -ivh MySQL-client-5.7.4_m14-1.el6.x86_64.rpm
# rpm -ivh MySQL-devel-5.7.4_m14-1.el6.x86_64.rpm
# rpm -ivh MySQL-shared-5.7.4_m14-1.el6.x86_64.rpm
# rpm -ivh MySQL-shared-compat-5.7.4_m14-1.el6.x86_64.rpm
# chown -R mysql:mysql /var/lib/mysql
注意,默认密码请到下面文件中查看
You will find that password in '/root/.mysql_secret'.

# service mysql start
# mysql -uroot -p
登录后,用下面命令设定密码为pk168007
mysql> set password=password('pk168007');
mysql> flush privileges;
mysql> quit
[root@openvpn01 openvpn]# service mysql restart
[root@openvpn01 openvpn]# chkconfig mysql on
[root@openvpn01 openvpn]# mysql -u root -p
运行以下SQL命令:
– 创建数据库
mysql> CREATE DATABASE openvpn;
– 切换数据库
mysql> USE openvpn;
创建用户,用户名openvpn,密码evanmis(可自行设定)
mysql>GRANT ALL ON openvpn.* TO 'openvpn'@'localhost' IDENTIFIED BY 'evanmis';
– 创建用户数据表
CREATE TABLE IF NOT EXISTS `user` (
  `username` char(32) COLLATE utf8_unicode_ci NOT NULL,
  `password` char(128) COLLATE utf8_unicode_ci DEFAULT NULL,
  `active` int(10) NOT NULL DEFAULT '1',
  `creation` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `name` varchar(32) COLLATE utf8_unicode_ci NOT NULL,
  `email` char(128) COLLATE utf8_unicode_ci DEFAULT NULL,
  `note` text COLLATE utf8_unicode_ci,
  `quota_cycle` int(10) NOT NULL DEFAULT '30',
  `quota_bytes` bigint(20) NOT NULL DEFAULT '10737418240',
  `enabled` int(10) NOT NULL DEFAULT '1',
  PRIMARY KEY (`username`),
  KEY `idx_active` (`active`),
  KEY `idx_enabled` (`enabled`)
) DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

-- 创建日志数据表
CREATE TABLE IF NOT EXISTS `log` (
  `username` varchar(32) COLLATE utf8_unicode_ci NOT NULL,
  `start_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `end_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `trusted_ip` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL,
  `trusted_port` int(10) DEFAULT NULL,
  `protocol` varchar(16) COLLATE utf8_unicode_ci DEFAULT NULL,
  `remote_ip` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL,
  `remote_netmask` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL,
  `bytes_received` bigint(20) DEFAULT '0',
  `bytes_sent` bigint(20) DEFAULT '0',
  `status` int(10) NOT NULL DEFAULT '1',
  KEY `idx_username` (`username`),
  KEY `idx_start_time` (`start_time`),
  KEY `idx_end_time` (`end_time`)
) DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

2、建立客户端的VPN拨入帐号
登入MySQL数据库:
[root@openvpn01 openvpn]# mysql -uopenvpn -p
执行以下命令:
mysql> USE openvpn;
mysql> INSERT INTO user(username, password) VALUES('test', ENCRYPT('123456'));
mysql> INSERT INTO user(username, password) VALUES('evan', ENCRYPT('evanmis'));
mysql> INSERT INTO user(username, password) VALUES('jack', ENCRYPT('345345'));
这样就建立好了一个用户test,密码为123456的帐号。
再查看当然数据库中的用户数量。如下
mysql> select * from user;
+----------+---------------+--------+---------------------+------+-------+------+-------------+-------------+---------+
| username | password      | active | creation            | name | email | note | quota_cycle | quota_bytes | enabled |
+----------+---------------+--------+---------------------+------+-------+------+-------------+-------------+---------+
| test     | st3rCn.zSAbZU |      1 | 2012-05-08 08:56:24 |      | NULL  | NULL |          30 | 10737418240 |       1 |
| evan     | bT.y7RjLv90mc |      1 | 2012-05-08 14:57:43 |      | NULL  | NULL |          30 | 10737418240 |       1 |
+----------+---------------+--------+---------------------+------+-------+------+-------------+-------------+---------+
2 rows in set (0.00 sec)

3、配置OpenVPN的PAM Mysql认证

安装pam_mysql验证安装包
[root@openvpn01 openvpn]#  yum install pam_krb5  pam  pam-devel
[root@openvpn01 openvpn]#  rpm -ivh pam_mysql-0.7-0.12.rc1.el6.x86_64.rpm
[root@openvpn01 openvpn]#  rpm -qa | grep pam_mysql
pam_mysql-0.7-0.12.rc1.el6.x86_64
并确认这个文件已经存在 /lib64/security/pam_mysql.so

[root@openvpn01 ~]# rpm -qa | grep pam
pam-devel-1.1.1-22.el6.x86_64
pam_mysql-0.7-0.12.rc1.el6.x86_64
fprintd-pam-0.1-22.git04fd09cfa.el6.x86_64
pam_passwdqc-1.0.5-8.el6.x86_64
pam-1.1.1-22.el6.x86_64
pam_krb5-2.3.11-9.el6.x86_64

[root@openvpn01 ~]# touch /etc/pam.d/openvpn_mysql
[root@openvpn01 ~]# vi /etc/pam.d/openvpn_mysql
auth            sufficient      pam_mysql.so /
user=openvpn passwd=evanmis host=localhost db=openvpn /
table=user usercolumn=username passwdcolumn=password /
where=active=1 sqllog=0 crypt=1
 
account         required        pam_mysql.so /
user=openvpn passwd=evanmis host=localhost db=openvpn /
table=user usercolumn=username passwdcolumn=password /
where=active=1 sqllog=0 crypt=1

4、测试pam验证是否成功
[root@openvpn01 openvpn]#  /etc/init.d/saslauthd restart
[root@openvpn01 openvpn]#  chkconfig saslauthd on
[root@openvpn01 openvpn]#  testsaslauthd -u test -p 123456 -s openvpn_mysql
如果显示
0: OK "Success."
则说明mysql认证配置成功。否则,请根据/var/log/auth.log日志查找原因。

5、复制OpenVPN PAM认证模块。
注意,2.2.2版本的认证模块文件有问题,会造成帐号密码无法得到认证,所以只能用2.0.9版的生成。
[root@openvpn01 openvpn]#  wget http://openvpn.net/release/openvpn-2.0.9.tar.gz
[root@openvpn01 openvpn]#  tar zxvf openvpn-2.0.9.tar.gz
[root@openvpn01 openvpn]# cd /openvpn/openvpn-2.0.9/plugin/auth-pam/
[root@openvpn01 auth-pam]# make
编译生成认证模块文件openvpn-auth-pam.so
[root@mailserver auth-pam]# cp  openvpn-auth-pam.so   /lib64/security/


[root@openvpn01 openvpn]# vi /etc/openvpn/server.conf
将下面一行启用。注意:Mysql 与Radius两种认证只能启用其中一种,不能2个同时使用.
plugin /lib64/security/openvpn-auth-pam.so openvpn_mysql

===============================================================================

最后说说:关于通过OpenVPN做免流
当用户通过OpenVPN免流时,在你的VPS和移动设备之间打通一个隧道,你的所有网络请求都先经过OpenVPN传给VPS,
然后VPS把你请求的东西拿到之后又通过OpenVPN传回来。免流的关键就在于,每次利用OpenVPN发起网络请求之前,
都要对请求头进行伪装,加上X-Online-Host字段,让运营商认为你请求的是运营商自己的免流量网站。
只用在client.ovpn文件中最后增加免流代码(每个地区的免流代码都可能不一样,请自行研究):
########免流代码仅做参考########
http-proxy-option EXT1 "POST http://rd.go.10086.cn"
http-proxy-option EXT1 "GET http://rd.go.10086.cn"
http-proxy-option EXT1 "X-Online-Host: rd.go.10086.cn"
http-proxy-option EXT1 "POST http://rd.go.10086.cn"
http-proxy-option EXT1 "X-Online-Host: rd.go.10086.cn"
http-proxy-option EXT1 "POST http://rd.go.10086.cn"
http-proxy-option EXT1 "Host: rd.go.10086.cn"
http-proxy-option EXT1 "GET http://rd.go.10086.cn"
http-proxy-option EXT1 "Host: rd.go.10086.cn"
http-proxy 10.0.0.172 80
########免流代码仅做参考########

下面是一些常用的免流代码。
#联通仅做参考:
http-proxy-retry
http-proxy 10.0.0.172 80
http-proxy-option EXT1 "X-Online-Host: wap.10010.com"
http-proxy-option EXT2 "Host: wap.10010.com"

#电信仅做参考:
http-proxy-retry
http-proxy 10.0.0.200 80
http-proxy-option EXT1 "X-Online-Host: ltetp.tv189.com"
http-proxy-option EXT2 "Host: ltetp.tv189.com"

#移动-默认仅做参考:
http-proxy-retry
http-proxy 10.0.0.172 80
http-proxy-option EXT1 "POST http://rd.go.10086.cn"
http-proxy-option EXT1 "GET http://rd.go.10086.cn"
http-proxy-option EXT1 "X-Online-Host: rd.go.10086.cn"
http-proxy-option EXT1 "POST http://rd.go.10086.cn"
http-proxy-option EXT1 "X-Online-Host: rd.go.10086.cn"
http-proxy-option EXT1 "POST http://rd.go.10086.cn"
http-proxy-option EXT1 "Host: rd.go.10086.cn"
http-proxy-option EXT1 "GET http://rd.go.10086.cn"
http-proxy-option EXT1 "Host: rd.go.10086.cn"

#移动-彩信仅做参考:
http-proxy-retry
http-proxy 10.0.0.172 80
http-proxy-option EXT1 "POST http://mmsc.monternet.com"
http-proxy-option EXT1 "GET http://mmsc.monternet.com"
http-proxy-option EXT1 "X-Online-Host: mmsc.monternet.com"
http-proxy-option EXT1 "CMCC: mmsc.monternet.com"
 

特别说明:下面的所有服务器为独立物理服务器,不是虚拟的云主机(云服务器、VPS)
租用服务器请自觉遵守服务器所在地的法律法规,国内服务器禁止任何违法违规用途!!!
香港、韩国、日本、美国、台湾、新加坡、菲律宾等境外服务器由机房直供(一手资源,价格最低),我公司只是代购,请自行遵守中国法律和服务器所在地的法规,勿用于违法犯罪用途,做什么用途虽然机房不过问,但是如果您私自做违法用途请自担责任!需要租用服务器请联系QQ16764407或微信18988993510
国内普通防御服务器.png
福建高防<a href=/fuwuqizuyong/ target=_blank class=infotextkey>服务器租用</a>.png
陕西高防BGP服务器租用.png
下面的香港、韩国、日本、美国、台湾、新加坡、菲律宾等境外服务器由机房直供(物理独立服务器,一手资源,价格最低),我公司只是代购,请自行遵守中国法律和服务器所在地的法规,勿用于违法犯罪用途,做什么用途虽然机房不过问,但是如果您私自做违法用途请自担责任!需要租用服务器请联系QQ16764407或微信18988993510
香港企业型服务器租用.png
香港高防服务器租用.png
韩国普通线路服务器租用.png
韩国KT机房CN2专线.png
韩国LG机房CN2专线.png
日本服务器租用.png
台湾服务器租用.png
新加坡服务器租用.png
菲律宾服务器租用.png
美国CN2高防服务器.png

分类:建站知识 百度收录 必应收录