CentOS7中PPTP的配置
最近做各种vpn,记录一下pptp的流程
1 | #yum install -y perl ppp iptables //centos默认安装了iptables和ppp |
1 | #yum install pptpd |
3. 修改配置文件
3.1 配置文件/etc/ppp/options.pptpd
1 2 | #cp /etc/ppp/options.pptpd /etc/ppp/options.pptpd.bak #vi /etc/ppp/options.pptpd |
将如下内容添加到到options.pptpd中(如果需要使用代码来启动进程方式,需要修改name,这个name和chap-secets文件中的第二项对应):
1 2 | ms - dns 8.8 . 8.8 ms - dns 8.8 . 4.4 |
然后保存这个文件。
解析:ms-dns 8.8.8.8, ms-dns 8.8.4.4是使用google的dns服务器
3.2 配置文件/etc/ppp/chap-secrets
1 2 | #cp /etc/ppp/chap-secrets /etc/ppp/chap-secrets.bak #vi /etc/ppp/chap-secrets |
chap-secrets内容如下:
1 2 3 | # Secrets for authentication using CHAP # client server secret IP addresses myusername pptpd mypassword * |
PS:
//myusername是你的vpn帐号
pptpd和options.pptpd中的name对应
mypassword是你的vpn的密码
*表示允许任何ip连接该pptp vpn
我这里根据这个格式,假设我的vpn的帐号是ksharpdabu,密码是 sky。那么,应该如下:
ksharpdabu pptpd sky *
3.3 配置文件/etc/pptpd.conf
1 2 | #cp /etc/pptpd.conf /etc/pptpd.conf.bak #vi /etc/pptpd.conf |
修改下面:
1 2 3 | connection 100 #最大连接数 localip 192.168 . 9.1 #vpn服务占用的ip remoteip 192.168 . 9.11 - 30 / / 表示vpn客户端获得ip的范围 |
3.4 配置文件/etc/sysctl.conf
1 | #vi /etc/sysctl.conf //修改内核设置,使其支持转发 |
将net.ipv4.ip_forward = 0 改成 net.ipv4.ip_forward = 1
保存修改后的文件
1 | #/sbin/sysctl -p |
4. 启动pptp vpn服务和iptables
1 | #service pptpd start |
经过前面步骤,我们的VPN已经可以拨号登录了,但是还不能访问任何网页。
最后一步就是添加iptables转发规则了,输入下面的指令:
启动iptables和nat转发功能,很关键的呀:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #/sbin/service iptables start //启动iptables #iptables -t nat -A POSTROUTING -p tcp --syn -s 192.168.9.0/24 -j TCPMSS --set-mss 1356 #这里主要是解决pptp无法访问https站点的问题,还有一种方法是连接后修改ppp0的mtu值,但是每次都需要手动修改太麻烦了 #iptables -t nat -A POSTROUTING -s 192.168.9.0/24 -j SNAT --to-source 207.210.83.140 #添加转发规则 / / 注意: 需要注意的是,“ 192.168 . 9.0 / 24 ”是根据之前的配置文件中的“localip”网段来改变的(这个网段是用户自定义的 ),比如你设置的 “ 10.0 . 0.1 ”网段,则应该改为“ 10.0 . 0.0 / 24 ” to - source 的值写外网网卡的ip地址即可 #/etc/init.d/iptables save //保存iptables的转发规则 #/sbin/service iptables restart //重新启动iptables |
5. 重启pptp vpn
1 | #service pptpd restart |
客户端如何拨号登陆vpn,我就不写了,大家可以自行google
6. 设置pptp vpn 开机启动
1 2 3 | #chkconfig pptpd on //开机启动pptp vpn服务 #chkconfig iptables on //开机启动iptables |
7. 过程中遇到的问题
之前pptp测试都是好的,可是在其他环境部署的时候出现了问题
1 2 3 4 5 6 7 | LCP: timeout sending Config - Requests Jun 3 14 : 52 : 05 localhost pppd[ 29491 ]: Connection terminated. Jun 3 14 : 52 : 05 localhost pppd[ 29491 ]: Modem hangup Jun 3 14 : 52 : 05 localhost pppd[ 29491 ]: Exit. Jun 3 14 : 52 : 05 localhost pptpd[ 29490 ]: GRE: read(fd = 6 , buffer = 7fc6156eb480 , len = 8196 ) from PTY failed: status = - 1 error = Input / output error, usually caused by unexpected termination of pppd, check option syntax and pppd logs Jun 3 14 : 52 : 05 localhost pptpd[ 29490 ]: CTRL: PTY read or GRE write failed (pty,gre) = ( 6 , 7 ) Jun 3 14 : 52 : 05 localhost pptpd[ 29490 ]: CTRL: Client 192.168 . 1.112 control connection finished |
往上各种说法,可能情况不同
基本上是:
1. 注释pptpd.conf中的logwtmp(版本不匹配的原因)
2. 注释options.pptpd中的require-mschap-v2和require-mppe-128
尝试后都没有成功,最终找到了解决方案:
是两个内核模块没有在机器启动的时候加载进来:nf_conntrack_pptp和nf_conntrack_proto_gre
原因是这样的:
在内核版本为3.18或者更高时,模式在开机时已经加载了nf_conntrack_pptp模块
如果低版本内核,开机没有加载该模块,需要手动加载modprobe nf_conntrack_pptp
iptables支持pptp gre模块的规则过滤需要有上述模块的支持,在没有加载的该模块的时候iptables都会将pptp和gre的数据包识别为invalid类型,drop掉
手动加载
1 | # modprobe nf_conntrack_pptp |
开机加载
1 2 | sudo touch / etc / modules - load.d / nf_conntrack_pptp.conf sudo echo "nf_conntrack_pptp" > / etc / modules - load.d / nf_conntrack_pptp.conf |
希望可以帮到同样问题的人
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,携手博客园推出1Panel与Halo联合会员
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步