【背景】

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

但是给公司每个员工分一个IDC的***帐号是一个苦逼的活儿,因为每个客户机会遇到各种问题,***本来就不是一个非常稳定的东西。

那么就想到,只要哥哥使用一台linux服务器拨号,之后用这个机器做网关,做snat那么就能让办公网络访问线上服务器了^_^

这个方案已经做出来,实际运行一段时间了,经历了检验,今天成文,和大家分享。

【具体方案】

【各模块功能介绍】

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

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

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

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

网络结构如下

wKioL1PRHyqjRRYcAADQ71jbbOY655.jpg

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

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

第一、#####IDC一台linux服务器当pptp ***的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 #××× server的起始ip,注意不是××× server的真实的ip
remoteip 10.1.253.1-254,10.1.0.254 #*** 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链接这个***都是好的)

# Secrets for authentication using CHAP
# client        server  secret                  IP addresses
user     pptpd   passwd      *

1.3启动和维护

service pptpd restart
service pptpd reload

1.4如果××× 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 idc*** -server ***公网ip -username 用户名 -password 密码 -encrypt -start
pptpsetup -create idc***114 -server ***公网ip -username 用户名 -password 密码 -encrypt -start#这里,可以多搭建一条备份链路idc***114,万一其中一条不行,可以做切换
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 idc***#开启×××
route add -net 10.1.0.0/16 dev ppp0
poff idc***#关闭×××

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

第四、××× client守护工具

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

crontab里面

*/1 * * * * /scripts/***_monitor.sh >> /home/logs/***_monitor.log
#!/bin/bash
# ***_monitor
# by H2O
# V1.0_2014.07.23
source /etc/profile

function Judge***(){#判断×××是否存活,为了判断准确定,需要判断多次
        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_***(){
        Now_Time=`date "+%F_%T"`
        echo "$Now_Time,*** is not running"
        poff idc*** ||poff idc*** || poff idc***#可能失败,多尝试几次
        pon idc*** || pon idc*** || pon idc***#可能失败,多尝试几次
        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,*** runned"
}

function Run_***114(){
        Now_Time=`date "+%F_%T"`
        echo "$Now_Time,*** is not running"
        poff idc*** ||poff idc*** || poff idc***
        poff idc***114 ||poff idc***114 || poff idc***114
        pon idc***114 || pon idc***114 || pon idc***114
        sleep 6
        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,***114 runned"
}

Judge***
Status=$?

if [ "$Status" -eq 1 ];then
        Run_***
#run *** 之后,不一定能马上ping通
        sleep 6
        Judge***
        Status=$?
        if [ "$Status" -eq 1 ];then
                Run_***114#第二次拨号就拨号114了
        else
                Now_Time=`date "+%F_%T"`
                echo "$Now_Time,*** is running"
                exit 0
        fi
else
        Now_Time=`date "+%F_%T"`
        echo "$Now_Time,*** is running"
        exit 0
fi