一、检查是否支持PPTP
1、查看系统是否支持PPTP
modprobe ppp-compress-18 && echo success
#应该输出:success
2、是否开启TUN/TAP
cat /dev/net/tun
#应该输出:cat: /dev/net/tun: File descriptor in bad state
3、是否开启ppp
cat /dev/ppp
#应该输出:cat: /dev/ppp: No such device or address
如果环境不满足上面3个条件,表示很可能不支持pptp
二、安装相关软件
1、安装PPP
yum install -y ppp
2、安装PPTP
yum install -y pptpd
3、安装Iptbles
yum install -y iptables-services
三、配置PPTP
1、设置vpn网卡
vi /etc/pptpd.conf
# vpn服务虚拟网卡地址
localip 192.168.0.1
# 给连接到的机器分配的ip池
remoteip 192.168.0.101-200
2、修改DNS服务器及日志文件
vi /etc/ppp/options.pptpd
#更改DNS
ms-dns 8.8.8.8
ms-dns 8.8.4.4
#修改日志文件
nologfd
logfile /var/log/pptpd.log
3、设置VPN账号密码vi /etc/ppp/chap-secrets
# 格式:<用户名> pptpd <密码> *
pptptest pptpd 123456 *
4、启动pptp
- 启动pptp:service pptpd start
- 关闭pptp:service pptpd stop
- 重启pptp:service pptpd restart
这时候本地电脑可以访问VPN服务器,但是不能访问外网
四、修改内核参数支持转发
1、开启服务器系统路由模式,支持包转发
vi /etc/sysctl.conf
(如果文件没有内容,把下面这些全部复制进去即可)
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
vm.swappiness = 0
net.ipv4.neigh.default.gc_stale_time = 120
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_announce = 2
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_max_syn_backlog = 1024
net.ipv4.tcp_synack_retries = 2
kernel.sysrq = 1
# 增加这一行
net.ipv4.ip_forward = 1
2、生效
sysctl -p
五、配置firewalld
1、创建规则文件
vi /usr/lib/firewalld/services/pptpd.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>pptpd</short>
<description>PPTP</description>
<port protocol="tcp" port="1723"/>
</service>
2、启动防火墙
service firewalld start
3、添加服务
firewall-cmd --permanent --zone=public --add-service=pptpd
- 注:pptpd就是上面创建的pptpd.xml
4、允许防火墙伪装IP
firewall-cmd --add-masquerade
5、开启47及1723端口
firewall-cmd --permanent --zone=public --add-port=47/tcp
firewall-cmd --permanent --zone=public --add-port=1723/tcp
6、允许gre协议
firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -p gre -j ACCEPT
firewall-cmd --permanent --direct --add-rule ipv4 filter OUTPUT 0 -p gre -j ACCEPT
7、设置规则允许数据包由可访问外网的网卡(上图的em1)和 vpn虚拟网卡ppp+(加号指正则匹配一个数字)中进出
firewall-cmd --permanent --direct --add-rule ipv4 filter FORWARD 0 -i ppp+ -o em1 -j ACCEPT
firewall-cmd --permanent --direct --add-rule ipv4 filter FORWARD 0 -i em1 -o ppp+ -j ACCEPT
- 注意把这里的em1改成自己可以访问外网的网卡
8、设置转发规则,从指定源地址发出的所有包都进行伪装,改变地址,由可访问外网的网卡发出
firewall-cmd --permanent --direct --passthrough ipv4 -t nat -I POSTROUTING -o em1 -j MASQUERADE -s 192.168.0.0/24
- 注意:
- em1:改成自己可访问外网网卡地址
- 192.168.0.0/24:要和 /etc/pptpd.conf 的 remoteip 地址段对应,格式为 xxx.xxx.xxx.0/24
9、重启防火墙
service firewalld restart
六、配置iptables
1、开放pptp端口1723(pptp的连接端口)
iptables -I INPUT 7 -m state --state NEW -p tcp --dport 1723 -j ACCEPT
2、允许转发
iptables -P FORWARD ACCEPT
3、iptables配置,配置虚拟网段NAT支持。
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
4、解决PPTP服务网速慢
(参考网页: http://www.92csz.com/52/1244.html)
iptables -I FORWARD -p tcp --syn -i ppp+ -j TCPMSS --set-mss 1356
5、保存iptables规则
service iptables save
6、重启防火墙
service iptables restart
service firewalld restart
firewalld与iptables补充说明:
1、配置存储位置
- iptables服务将配置存储在 /etc/sysconfig/iptables和/etc/sysconfig/ip6tables 中
- firewalld将配置存储在/usr/lib/firewalld/和/etc/firewalld/中的各种XML文件中
- 注意,/etc/sysconfig/iptables文件不存在,因为在Red Hat Enterprise Linux上默认安装了firewalld
- 所以两个防火墙软件配置互不相干,如果要开启端口要把两个都开启
2、每次更改配置时
- 在iptables服务中,每次更改都意味着刷新所有旧规则并从/etc/sysconfig/iptables读取所有新规则,即一次save之后,之前的所有的设置将丢失,只会保存该次save的内容
- 而在firewalld中不需要重新创建所有规则。
- iptables在更改配置后会丢失连接,但firewalld可以在运行时更改设置,而不会丢失现有的连接。
为了保证速度 限制一个账户登录(参考)
1、创建auth-up文件
vi /etc/ppp/auth-up
#!/bin/sh
# get the username/ppp line number from the parameters
REALDEVICE=$1
USER=$2
# create the directory to keep pid files per user
mkdir -p /var/run/pptpd-users
# if there is a session already for this user, terminate the old one
if [ -f /var/run/pptpd-users/$USER ]; then
kill -HUP `cat /var/run/pptpd-users/$USER`
rm /var/run/pptpd-users/$USER
fi
# copy the pid file of current user to /var/run/pptpd-users
cp "/var/run/$REALDEVICE.pid" /var/run/pptpd-users/$USER
流程如下:
- 1.用户登录判断是否有/var/run/pptpd-users/用户名的文件
- 2.如果有平滑重启这个vpn用户进程,如果没有创建这个文件,文本里面有用户进程ID
- 3.老的连接被踢掉,新的连接可以使用
- 备注:这种模式下,一个账号只允许一个用户使用。
2、保证有可执行权限chmod a+x /etc/ppp/auth-up
3、重启pptpd
service pptpd restart
日志记录更多用户信息(参考)
vpn 登录和断开的时候,会自动执行/etc/ppp/ip-up和/etc/ppp/ip-down两个脚本,查看这两个脚本,会发现有这样一行 “This file ”should not be modified – make local changes to /etc/ppp/ip-up.local instead"
也就是说这两个脚本不要修改,如果要添加自定义的功能,修改ip-up.local脚本。
vi /etc/ppp/ip-up.local
echo "---------------Login---------------------------------------" >> /var/log/pptpd.log
echo "time: `date -d today +%F_%T`" >> /var/log/pptpd.log
echo "clientIP: $6" >> /var/log/pptpd.log
echo "username: $PEERNAME" >> /var/log/pptpd.log
echo "device: $1" >> /var/log/pptpd.log
echo "vpnIP: $4" >> /var/log/pptpd.log
echo "assignIP: $5" >> /var/log/pptpd.log
echo "-----------------------------------------------------------" >> /var/log/pptpd.log
保存后,注意chmod +x ip-up.local
添加可执行权限;
vi /etc/ppp/ip-down.local
echo "---------------Logout--------------------------------------" >> /var/log/pptpd.log
echo "time: `date -d today +%F_%T`" >> /var/log/pptpd.log
echo "clientIP: $6" >> /var/log/pptpd.log
echo "username: $PEERNAME" >> /var/log/pptpd.log
echo "device: $1" >> /var/log/pptpd.log
echo "vpnIP: $4" >> /var/log/pptpd.log
echo "assignIP: $5" >> /var/log/pptpd.log
echo "-----------------------------------------------------------" >> /var/log/pptpd.log
保存后,注意chmod +x ip-down.local
添加可执行权限;
最后重启pptpd服务