Centos 7 配置PPTP VPN攻略

准备工作:

1、一台centos7主机,内网ip 192.*.*.*

2、一个连接外网的路由器,外网固定ip 210.*.*.*  DNS 210.*.*.*

开始安装:

1、更新centos7主机

1
2
yum update –y
reboot #重启

2、检测系统环境

1
modprobe ppp-compress-18 && echo success

显示success说明系统支持MPPE补丁,如果不支持,需要先安装kernel-devel

# yum install kernel-devel

检查系统是否开启TUN/TAP支持

1
cat /dev/net/tun

显示结果为下面的文本,则表明通过:

cat:/dev/net/tun: File descriptor in bad state

检查系统是否开启ppp支持

1
cat /dev/ppp

显示结果为下面的文本,则表明通过:

cat:/dev/ppp: No such device or address

上面三条必须同时满足,否则不能安装pptp vpn

3、关闭SELINUX

1
2
3
4
5
vi /etc/selinux/config
#SELINUX=enforcing #注释掉
#SELINUXTYPE=targeted #注释掉
SELINUX=disabled #增加
setenforce 0 #使配置立即生效

4、更新epel(参考 http://mannerwang.blog.51cto.com/12009183/1852806

1
2
yum makecache #更新yum缓存
yum repolist #查看yum源,会多一个epel源

5、安装iptables、ppp、pptpd

1
yum install -y ppp iptables pptpd

6、配置pptp参数

1
vi /etc/ppp/options.pptpd

找到 ms-dns两行,将注释#去掉,并改为如下

ms-dns 210.*.*.*(公司外网DNS、可以使用114、8等通用DNS)

ms-dns 8.8.8.8

7、设置pptp拨号用户和密码(可以设置多个用户,每行一个)

1
2
3
vi /etc/ppp/chap-secrets
#client          server   secret                   IP addresses
vpntest          pptpd    123456                   *

*表示为客户端自动分配IP地址

8、设置pptp服务器IP地址,设置vpn拨入客户端ip地址池

1
2
3
vi /etc/pptpd.conf
localip 172.16.36.1  #设置pptp虚拟拨号服务器IP地址(注意:不是服务器本身的IP地址)
remoteip 172.16.36.2-254  #为拨入vpn的用户动态分配IP地址

这里有个坑是最后一行需要为空内容,原因目前未知..

9、启动服务

1
2
3
systemctl start pptpd.service #启动pptp
systemctl status pptpd.service #查看pptp状态
systemctl enable pptpd.service #设置开机启动

10、修改内核转发参数

1
2
3
vi /etc/sysctl.conf  #编辑
net.ipv4.ip_forward = 1  #设置为1
/sbin/sysctl -p  #使设置立刻生效

11、修改防火墙规则—重点内容

1
systemctl start iptables.service #启动防火墙

开机启动:chkconfig iptables on

编辑配置文件,以下为我的配置,请自行对比默认配置参考

主要是添加1723端口和gre协议.不推荐SHELL运行,建议直接编辑配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
vi /etc/sysconfig/iptables
#sample configuration for iptables service
#you can edit this manually or use system-config-firewall
#please do not ask us to add additional ports/services to this defaultconfiguration
 
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
 
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW,RELATED,ESTABLISHED -m tcp --dport 22 -jACCEPT
-A INPUT -p tcp -m state --state NEW,RELATED,ESTABLISHED -m tcp --dport 1723 -jACCEPT
-A INPUT -p gre -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i ppp+ -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -m state --state INVALID -j DROP
-A OUTPUT -m state --state INVALID -j DROP
 
COMMIT
#completed on 2016-9-18 15:33:54
 
*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A POSTROUTING -s 172.16.36.0/24 -o eno16777984 -j MASQUERADE
COMMIT
#completed on 2016-9-18 15:33:54

由于centos7中的iptables规则重启失效,添加到local文件中

vi /etc/rc.d/rc.local #在文件末尾添加此行代码

1
iptables -t nat -A POSTROUTING -s 172.16.36.0/24 -o eno16777984 -j MASQUERADE

上面有2处需要注意,两个POSTROUTING字段都使用了本机的网卡名称,其中eno16777984是虚拟主机网卡,而不是传统上的eth0,务必注意!

重启iptables使得规则生效

systemctl restart iptables.service

查看路由表及iptables规则

1
2
3
4
5
6
7
8
9
10
iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
MASQUERADE  all  --  172.16.36.0/24       anywhere
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
iptables -t filter -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     icmp --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     tcp  --  anywhere             anywhere             state NEW,RELATED,ESTABLISHED tcp dpt:ssh
ACCEPT     tcp  --  anywhere             anywhere             state NEW,RELATED,ESTABLISHED tcp dpt:pptp
ACCEPT     gre  --  anywhere             anywhere             state NEW,RELATED,ESTABLISHED
ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere             state NEW,RELATED,ESTABLISHED
ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED
DROP       all  --  anywhere             anywhere             state INVALID
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
DROP       all  --  anywhere             anywhere             state INVALID

坑点又来了,iptables启动时默认是不加载模块的,这样就会导致连接时报619无法验证密码的错误

加载iptables模块

1
2
modprobeip_nat_pptp
modprobeip_conntrack_pptp

查看模块是否加载

1
2
3
4
5
6
7
lsmod|grep pptp
nf_nat_pptp            13115  0
nf_nat_proto_gre       13009 1 nf_nat_pptp
nf_conntrack_pptp      19257 1 nf_nat_pptp
nf_conntrack_proto_gre    14287 1 nf_conntrack_pptp
nf_nat                 26146  4nf_nat_proto_gre,nf_nat_ipv4,nf_nat_pptp,nf_nat_masquerade_ipv4
nf_conntrack          105745  8nf_conntrack_proto_gre,nf_nat,nf_nat_ipv4,nf_nat_pptp,xt_conntrack,nf_nat_masquerade_ipv4,nf_conntrack_ipv4,nf_conntrack_pptp

如果想让iptables自动加载以上模块,可以编辑

1
vi /etc/sysconfig/iptables-config

在IPTABLES_MODULES=””字段中添加以上模块。

IPTABLES_MODULES=”ip_nat_pptp ip_nat_proto_gre”

重启iptables即可

12、安装net-tools,查看1723端口

1
2
3
yuminstall -y net-tools
netstat -nap | grep 1723 | grep pptpd
tcp        0      0 0.0.0.0:1723            0.0.0.0:*               LISTEN      1070/pptpd

13、在路由器侧配置端口及外网ip,这个要看各自的路由本身的操作了,可能还需要配置路由表,将172.16.36.0加到表中.

查看pptp服务状态

systemctl status pptpd.service

systemctl status iptables.service

要保证的服务:

pptpd可以自启动

iptables可以自启动并加载转发、gre模块

经过如上一系列操作,系统PPTP搭建成功,且重启后服务即刻启动。

通信分析:

外网用户通过210 的PPTP外网映射ip及账号密码默认端口访问到内网192 PPTP主机并获得172 的IP

访问内网页面时,192的请求指向172 VPN并由内网PPTP主机将172 IP nat到内网192 并返回数据,实现VPN的功能,,,也不知道我说得对不对

Q&A:

1、为什么选择pptp而不是openvpn?因为后者还没研究成果…

2、关于吞吐量、关于安全—目前还在研究,包括iptables的规则也需要细化

3、PPTP支持同一用户多地重复连接

4、连接多个不同VPN时是否有安全隐患–一般没有,可以设置路由表对网络通信进行区分

本文参考了如下作者内容,表示感谢!

http://www.wanghailin.cn/centos-7-vpn/

http://www.osyunwei.com/archives/7407.html

http://www.111cn.net/sys/linux/86641.htm

http://www.centoscn.com/image-text/install/2014/1201/4211.html

http://www.tuicool.com/articles/uu6NJb

 

转载自: http://mannerwang.blog.51cto.com/12009183/1854931/

PHPExcel 行号、数字互转

$a = PHPExcel_Cell::columnIndexFromString(‘A’);

// $a = 1;

$b = PHPExcel_Cell::stringFromColumnIndex(0);

// $b = ‘A’;

注意,这两个方法的起始数字 一个是1 一个是0

laravel eloquent relation manyToMany

User Model 和 Role Model 多对多关系示例

其中 role_user 是枢纽表表名

public function roles()
{
    return $this->belongsToMany(Role::class, 'role_user', 'user_id', 'role_id');
}