【背景】
辦公網絡使用ADSL上網,無固定IP。IDC機房有固定的IP。爲了安全,服務器的公網ip只開放了應用的端口,基於這種情況,要訪問機房,使用***是一個較好方案。
但是給公司每個員工分一個IDC的***帳號是一個苦逼的活兒,因爲每個客戶機會遇到各種問題,***本來就不是一個非常穩定的東西。
那麼就想到,只要哥哥使用一臺linux服務器撥號,之後用這個機器做網關,做snat那麼就能讓辦公網絡訪問線上服務器了^_^
這個方案已經做出來,實際運行一段時間了,經歷了檢驗,今天成文,和大家分享。
【具體方案】
【各模塊功能介紹】
1、IDC一臺linux服務器當pptp ***的SERVER
2、一臺linux服務充當pptp client,同時作爲訪問IDC機房的網關
3、辦公網絡一臺路由器(員工電腦的默認網關)
4、***守護腳工具(因爲網絡原因,***就不是很穩定,意味着經常掛,那麼需要一個監控工具,守護***的狀態,一旦***掛了,就要再次啓動)
網絡結構如下
注意:實施環境爲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
機器撥號好之後之後是這樣的
第三、#####辦公網絡的路由器配置#####
本地網絡是192.168.1.0/24,IDC的網絡是10.1.0.0/16具體看下圖
第四、*** 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