公司办公网络单向直接访问机房网络方案实践
【背景】
办公网络使用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安装一下组件
- ppp-2.4.5-5.el6.x86_64
- pptpd-1.4.0-3.el6.x86_64
- kernel-devel
1.2配置文件
- # grep -v "#" /etc/pptpd.conf
- option /etc/ppp/options.pptpd
- logwtmp
- localip 10.1.1.101 #VPN server的起始ip,注意不是VPN server的真实的ip
- remoteip 10.1.253.1-254,10.1.0.254 #vpn client分配的ip
- /etc/ppp/chap-secrets
- # grep -v "#" /etc/ppp/options.pptpd
- name pptpd
- refuse-pap
- refuse-chap
- refuse-mschap
- require-mschap-v2
- require-mppe-128
- proxyarp
- lock
- nobsdcomp
- novj
- novjccomp
- nologfd
- ms-dns 8.8.8.8
- ms-dns 8.8.4.4
- # cat /etc/ppp/chap-secrets(注意这里格式比较严格,尤其是密码之后的*,密码之后只有一个tab或者空格,否则会导致windows连不上的报错609的报错,但是mac链接这个vpn都是好的)
- # Secrets for authentication using CHAP
- # client server secret IP addresses
- user pptpd passwd *
1.3启动和维护
service pptpd restart
service pptpd reload
1.4如果VPN server开了防火墙,请加上
- -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
- -A INPUT -m state --state NEW -m tcp -p tcp --dport 1723 -j ACCEPT
- -A INPUT -p tcp -m state --state NEW -m tcp --dport 47 -j ACCEPT
- -A INPUT -p gre -j ACCEPT
(2)、#####办公网络一台linux服务器当pptp client的client,ip是192.168.1.252####
1、安装及配置
yum -y install pptp-setup
实际安装
- (libpcap-1.4.0-1.20130826git2dbcaa1.el6.x86_64.rpm
- ppp-2.4.5-5.el6.x86_64.rpm
- pptp-1.7.2-8.1.el6.x86_64.rpm
- pptp-setup-1.7.2-8.1.el6.x86_64.rpm)
初始化拨号
- pptpsetup -create idcvpn -server vpn公网ip -username 用户名 -password 密码 -encrypt -start
- route add -net 10.1.0.0/16 dev ppp0#添加路由,否则不通,因为服务器的网段是10.1.0.0/16
- cp /usr/share/doc/ppp-2.4.5/scripts/pon /usr/sbin/
- cp /usr/share/doc/ppp-2.4.5/scripts/poff /usr/sbin/
- chmod +x /usr/sbin/pon /usr/sbin/poff
- pon idcvpn#开启VPN
- route add -net 10.1.0.0/16 dev ppp0
- poff idcvpn#关闭VPN
2、防火墙配置,做SNAT
- cat /etc/sysconfig/iptables
- *nat
- :PREROUTING ACCEPT [0:0]
- :POSTROUTING ACCEPT [1:92]
- :OUTPUT ACCEPT [1:92]
- -A POSTROUTING -d 10.1.0.0/16 -o ppp0 -j MASQUERADE
- COMMIT
- *filter
- :INPUT ACCEPT [0:0]
- :FORWARD ACCEPT [0:0]
- :OUTPUT ACCEPT [0:0]
- COMMIT
机器拨号好之后之后是这样的
(3)、#####办公网络的路由器配置#####
本地网络是192.168.1.0/24,IDC的网络是10.1.0.0/16具体看下图
(4)VPN client守护工具
具体可以参考这个脚本,本脚本已经经过实践检测
- crontab里面*/1 * * * * /scripts/vpn_monitor.sh >> /home/logs/vpn_monitor.log
- #!/bin/bash
- # vpn_monitor
- # by H2O
- # V1.0_2014.07.23
- source /etc/profile
- function JudgeVpn(){#判断VPN是否存活,为了判断准确定,需要判断多次
- FLAG=1
- ping -c 1 10.1.1.1 -w 1 > /dev/null 2>&1 && FLAG=0
- ping -c 1 10.1.1.2 -w 1 > /dev/null 2>&1 && FLAG=0
- ping -c 1 10.1.1.103 -w 1> /dev/null 2>&1 && FLAG=0
- return "$FLAG"
- }
- function Run_Vpn(){
- Now_Time=`date "+%F_%T"`
- echo "$Now_Time,vpn is not running"
- poff idcvpn ||poff idcvpn || poff idcvpn#可能失败,多尝试几次
- pon idcvpn || pon idcvpn || pon idcvpn#可能失败,多尝试几次
- sleep 5#拨号之后,需要有一定时间才能出现设备ppp0,这里等5s,可以自己实践
- 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#路由可能添加失败,多尝试几次
- route add -net 10.1.0.0/16 dev ppp0
- echo "$Now_Time,vpn runned"
- }
- JudgeVpn
- Status=$?
- if [ "$Status" -eq 1 ];then
- Run_Vpn
- #run vpn 之后,不一定能马上ping通
- sleep 5
- JudgeVpn
- Status=$?
- if [ "$Status" -eq 1 ];then
- Run_Vpn
- else
- Now_Time=`date "+%F_%T"`
- echo "$Now_Time,vpn is running"
- exit 0
- fi
- else
- Now_Time=`date "+%F_%T"`
- echo "$Now_Time,vpn is running"
- exit 0
- fi