Skip to main content

 路由器网 > 新闻资讯 >

创业公司办公网络安全访问机房网络方案

2014-07-26 16:55 浏览:

【背景】

办公网络使用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挂了,就要再次启动)

网络结构如下

wKioL1PRHyqjRRYcAADQ71jbbOY655.jpg

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

 

【各模块具体安装配置说明】

第一、#####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
 

第二、#####办公网络一台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
 
 

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

wKiom1PRHl7zmcWVAASSJfJsfGI911.jpg

第三、#####办公网络的路由器配置#####

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

wKioL1PRGt2jOUYaAAIdwAHZAD8634.jpg

第四、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