在linux系统中使用pptp协议连接VPN后,出现无法访问内网的情况是比较常见的问题,这类问题大多和路由配置、防火墙规则、网络参数设置相关,需要从多个维度逐步排查解决。

常见原因分析
导致pptp连接后无法访问内网的核心原因主要有以下几类:
- 默认路由被pptp连接覆盖,所有流量都走VPN通道,而内网流量不需要经过VPN
- 内网对应的网段没有添加到pptp的路由表中,系统不知道访问内网该走哪个网卡
- 系统防火墙或者iptables规则拦截了VPN相关的流量,导致内网请求无法正常转发
- MTU值设置不合理,导致数据包分片失败,内网请求无法正常传输
- DNS配置异常,虽然能连通内网IP但无法通过域名访问内网服务
排查与解决步骤
1. 检查路由表配置
首先查看当前的路由表,确认内网网段是否被正确添加,以及默认路由是否符合预期。执行以下命令查看路由信息:
# 查看系统路由表 route -n # 或者使用ip命令查看 ip route show
正常情况下,pptp连接后应该只有访问VPN服务端内网网段的流量走ppp0网卡,其他流量走原默认网卡。如果发现默认路由变成了ppp0,需要删除错误的默认路由,添加内网网段路由:
# 假设内网网段是192.168.10.0/24,ppp0是pptp连接生成的网卡 # 添加内网网段路由 ip route add 192.168.10.0/24 dev ppp0 # 如果需要删除错误的默认路由 ip route del default dev ppp0
2. 检查防火墙规则
如果路由配置正确但依然无法访问,需要检查iptables规则是否拦截了流量。执行以下命令查看当前iptables规则:
# 查看filter表规则 iptables -L -n -v # 查看nat表规则 iptables -t nat -L -n -v
如果发现有规则丢弃了ppp0网卡的流量,需要添加允许规则:
# 允许ppp0网卡的输入流量 iptables -A INPUT -i ppp0 -j ACCEPT # 允许ppp0网卡的输出流量 iptables -A OUTPUT -o ppp0 -j ACCEPT # 允许ppp0网卡的转发流量 iptables -A FORWARD -i ppp0 -j ACCEPT iptables -A FORWARD -o ppp0 -j ACCEPT
3. 调整MTU值
pptp封装会增加数据包的大小,如果MTU值设置过大,会导致数据包分片失败。可以尝试将ppp0网卡的MTU调整为1400:
# 设置ppp0网卡MTU为1400 ifconfig ppp0 mtu 1400 # 或者使用ip命令设置 ip link set ppp0 mtu 1400
4. 检查DNS配置
如果通过IP可以访问内网但域名不行,需要检查DNS配置。查看/etc/resolv.conf文件,确认是否有内网DNS服务器:
# 查看DNS配置 cat /etc/resolv.conf
如果需要添加内网DNS,可以直接编辑该文件,添加内网DNS服务器地址:
# 编辑resolv.conf文件 vim /etc/resolv.conf # 添加内网DNS,示例如下 nameserver 192.168.10.1
永久配置方法
上述命令修改的配置重启后会失效,如果需要永久生效,可以将路由添加、防火墙规则等写入pptp的连接脚本。以常见的ppp配置为例,编辑/etc/ppp/ip-up.d/目录下的脚本,添加自定义配置:
# 创建自定义脚本 vim /etc/ppp/ip-up.d/pptp-route # 脚本内容如下,注意替换内网网段和网卡名称 #!/bin/bash # 添加内网路由 ip route add 192.168.10.0/24 dev $1 # 设置MTU ip link set $1 mtu 1400 # 添加防火墙规则 iptables -A INPUT -i $1 -j ACCEPT iptables -A OUTPUT -o $1 -j ACCEPT # 给脚本添加执行权限 chmod +x /etc/ppp/ip-up.d/pptp-route
其中$1是pptp连接生成的网卡名称,脚本会在pptp连接成功后自动执行,无需每次手动配置。