A-A+

公司办公网络单向直接访问机房网络方案实践

2017年06月03日 站长资讯 暂无评论

【背景】

办公网络使用ADSL上网,无固定IP。IDC机房有固定的IP。为了安全,服务器的公网ip只开放了应用的端口,基于这种情况,要访问机房,使用VPN是一个较好方案。

但是给公司每个员工分一个IDC的vpn帐号是一个苦逼的活儿,因为每个客户机会遇到各种问题,vpn本来就不是一个非常稳定的东西。
那么就想到,只要哥哥使用一台linux服务器拨号,之后用这个机器做网关,做snat那么就能让办公网络访问线上服务器了^_^
这个方案已经做出来,实际运行一段时间了,路由器也经历了检验,今天成文,和大家分享。

【具体方案】

第一、各模块功能介绍

1、IDC一台linux服务器当pptp vpn的SERVER

2、一台linux服务充当pptp client,同时作为访问IDC机房的网关

3、办公网络一台路由器(员工电脑的默认网关)

4、VPN守护脚工具(因为网络原因,VPN就不是很稳定,意味着经常挂,那么需要一个监控工具,守护vpn的状态,一旦vpn挂了,就要再次启动)

网络结构如下:

注意:实施环境为centos 6.5 64位服务器

第二、各模块具体安装配置说明

(1)#####IDC一台linux服务器当pptp vpn的SERVER#####

1.1具体请yum安装一下组件

  1. ppp-2.4.5-5.el6.x86_64  
  2. pptpd-1.4.0-3.el6.x86_64   
  3. kernel-devel   

1.2配置文件

  1. # grep -v "#" /etc/pptpd.conf        
  2. option /etc/ppp/options.pptpd  
  3. logwtmp  
  4. localip 10.1.1.101 #VPN server的起始ip,注意不是VPN server的真实的ip  
  5. remoteip 10.1.253.1-254,10.1.0.254 #vpn client分配的ip  
  6. /etc/ppp/chap-secrets  
  7. # grep -v "#" /etc/ppp/options.pptpd  
  8. name pptpd  
  9. refuse-pap  
  10. refuse-chap  
  11. refuse-mschap  
  12. require-mschap-v2  
  13. require-mppe-128  
  14. proxyarp  
  15. lock  
  16. nobsdcomp  
  17. novj  
  18. novjccomp  
  19. nologfd  
  20. ms-dns 8.8.8.8  
  21. ms-dns 8.8.4.4  
  22. # cat /etc/ppp/chap-secrets(注意这里格式比较严格,尤其是密码之后的*,密码之后只有一个tab或者空格,否则会导致windows连不上的报错609的报错,但是mac链接这个vpn都是好的)  
  23. # Secrets for authentication using CHAP  
  24. # client        server  secret                  IP addresses  
  25. user     pptpd   passwd      *  

1.3启动和维护

service pptpd restart

service pptpd reload

1.4如果VPN server开了防火墙,请加上

  1. -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT  
  2. -A INPUT -m state --state NEW -m tcp -p tcp --dport 1723 -j ACCEPT  
  3. -A INPUT -p tcp -m state --state NEW -m tcp --dport 47 -j ACCEPT  
  4. -A INPUT -p gre -j ACCEPT  

(2)、#####办公网络一台linux服务器当pptp client的client,ip是192.168.1.252####

1、安装及配置

yum -y install pptp-setup

实际安装

  1. (libpcap-1.4.0-1.20130826git2dbcaa1.el6.x86_64.rpm    
  2. ppp-2.4.5-5.el6.x86_64.rpm  
  3. pptp-1.7.2-8.1.el6.x86_64.rpm  
  4. pptp-setup-1.7.2-8.1.el6.x86_64.rpm)  

初始化拨号

  1. pptpsetup -create idcvpn -server vpn公网ip -username 用户名 -password 密码 -encrypt -start  
  2. route add -net 10.1.0.0/16 dev ppp0#添加路由,否则不通,因为服务器的网段是10.1.0.0/16  
  3. cp /usr/share/doc/ppp-2.4.5/scripts/pon /usr/sbin/  
  4. cp /usr/share/doc/ppp-2.4.5/scripts/poff /usr/sbin/  
  5. chmod +x /usr/sbin/pon /usr/sbin/poff  
  6. pon idcvpn#开启VPN  
  7. route add -net 10.1.0.0/16 dev ppp0  
  8. poff idcvpn#关闭VPN  

2、防火墙配置,做SNAT

  1. cat /etc/sysconfig/iptables  
  2. *nat  
  3. :PREROUTING ACCEPT [0:0]  
  4. :POSTROUTING ACCEPT [1:92]  
  5. :OUTPUT ACCEPT [1:92]  
  6. -A POSTROUTING -d 10.1.0.0/16 -o ppp0 -j MASQUERADE  
  7. COMMIT  
  8. *filter  
  9. :INPUT ACCEPT [0:0]  
  10. :FORWARD ACCEPT [0:0]  
  11. :OUTPUT ACCEPT [0:0]  
  12. COMMIT  

机器拨号好之后之后是这样的

(3)、#####办公网络的路由器配置#####

本地网络是192.168.1.0/24,IDC的网络是10.1.0.0/16具体看下图

(4)VPN client守护工具

具体可以参考这个脚本,本脚本已经经过实践检测

  1. crontab里面*/1 * * * * /scripts/vpn_monitor.sh >> /home/logs/vpn_monitor.log  
  2. #!/bin/bash  
  3. # vpn_monitor  
  4. # by H2O  
  5. # V1.0_2014.07.23  
  6. source /etc/profile  
  7. function JudgeVpn(){#判断VPN是否存活,为了判断准确定,需要判断多次  
  8.         FLAG=1  
  9.         ping -c 1 10.1.1.1 -w 1  > /dev/null  2>&1 && FLAG=0  
  10.         ping -c 1 10.1.1.2  -w 1 > /dev/null  2>&1 && FLAG=0  
  11.         ping -c 1 10.1.1.103 -w 1> /dev/null  2>&1 && FLAG=0  
  12.         return "$FLAG"  
  13. }  
  14. function Run_Vpn(){  
  15.         Now_Time=`date "+%F_%T"`  
  16.         echo "$Now_Time,vpn is not running"  
  17.         poff idcvpn ||poff idcvpn || poff idcvpn#可能失败,多尝试几次  
  18.         pon idcvpn || pon idcvpn || pon idcvpn#可能失败,多尝试几次  
  19.         sleep 5#拨号之后,需要有一定时间才能出现设备ppp0,这里等5s,可以自己实践  
  20.         route add -net 10.1.0.0/16 dev ppp0 || route add -net 10.1.0.0/16 dev ppp0 || route add -net 10.1.0.0/16 dev ppp0#路由可能添加失败,多尝试几次  
  21.         route add -net 10.1.0.0/16 dev ppp0  
  22.         echo "$Now_Time,vpn runned"  
  23. }  
  24. JudgeVpn  
  25. Status=$?  
  26. if [ "$Status" -eq 1 ];then  
  27.         Run_Vpn  
  28. #run vpn 之后,不一定能马上ping通  
  29.         sleep 5  
  30.         JudgeVpn  
  31.         Status=$?  
  32.         if [ "$Status" -eq 1 ];then  
  33.                 Run_Vpn  
  34.         else  
  35.                 Now_Time=`date "+%F_%T"`  
  36.                 echo "$Now_Time,vpn is running"  
  37.                 exit 0  
  38.         fi  
  39. else  
  40.         Now_Time=`date "+%F_%T"`   
  41.         echo "$Now_Time,vpn is running"  
  42.         exit 0  
  43. fi  
标签:

给我留言