【第一、需求描述】
辦公網和IDC兩個局域網(or,任意兩個不同局域網),相互隔離。但是在日常運維、研發過程中,需要在辦公網訪問IDC網絡。如果都通過公網ip繞,既不方便,也不安全。如果拉專線,是最穩定可靠的辦法。但是作爲技術屌絲,想爲公司省點錢(這也可以看作是技術價值的一部分),所以打算使用其他方案(當然是免費的方案,或者這樣說,使用已有資源的方案。服務器當然也需要花錢的,但是你可以使用已有服務器來完成這個方案)解決這個需求。
【第二、背景介紹】
辦公網有lan192.168.1.0/24,並通過固定的公網IP上網;
IDC有lan10.1.1.0/24,並有多個公網ip,兩者通過公網ip互聯
這就遇到問題:辦公網怎樣能直接訪問IDC的內網,至少普通用戶看起來是可以直接訪問機房的內網的。你讓每個用戶都撥***?很悲催,還不好管理。
這裏有介紹兩個方案:
1、 點到端的***方案(架設成功之後,你可以設置爲端到端的方案),之前寫過一篇文章,具體可以看《創業公司辦公網絡安全穩定訪問機房網絡方案1:by***》http://h2ofly.blog.51cto.com/6834926/1529888
2、GRE方案。如果公司有多餘的固定的公網ip或者路由器本身支持GRE,建議使用本方案。why?不解釋,哈哈。你可以對比、再使用兩個方案之後就有感覺了。
【第三、方案實施】
說了這麼多,實際操作下印象就更深了
辦公網路由器(linux服務器實現):局域網ip:192.168.1.254,公網ip180.1.1.1 配置
cat /usr/local/admin/gre.sh#並把改腳本加入開機啓動
#!/bin/bash modprobe ip_gre#加載gre模塊 ip tunnel add office mode gre remote 110.2.2.2 local 180.1.1.1 ttl 255#建立tunnel名字叫office的device(可自定義),使用gre mode。指定遠端的ip是110.2.2.2,本地ip是180.1.1.1。這裏爲了提升安全性,你可以配置iptables,公網ip只接收來自110.2.2.2的包,其他的都drop掉。 ip link set office up#啓動device office ip link set office up mtu 1500#設置mtu爲1500 ip addr add 192.192.192.2/24 dev office #爲office添加ip192.192.192.2 echo 1 > /proc/sys/net/ipv4/ip_forward #讓服務器支持轉發 ip route add 10.1.1.0/24 dev office #添加路由,含義是:到10.1.1.0/24的包,由office設備負責轉發 iptables -t nat -A POSTROUTING -d 10.1.1.0/24 -j SNAT --to 192.192.192.2#否則192.168.1.x等機器訪問10.1.1.x網段不通
IDC路由器(linux服務器實現):局域網ip:10.1.1.1,公網ip110.2.2.2配置
cat /usr/local/admin/gre.sh#並把改腳本加入開機啓動
#!/bin/bash modprobe ip_gre ip tunnel add office mode gre remote 180.1.1.1 local 110.2.2.2 ttl 255 ip link set office up ip link set office up mtu 1500 ip addr add 192.192.192.1/24 dev office#爲office添加ip192.192.192.1 echo 1 > /proc/sys/net/ipv4/ip_forward ip route add 192.168.1.0/24 dev office iptables -t nat -A POSTROUTING -s 192.192.192.2 -d 10.1.0.0/16 -j SNAT --to 10.1.1.1#否則192.168.1.X等機器訪問10.1.1.x網段不通 iptables -A FORWARD -s 192.192.192.2 -m state --state NEW -m tcp -p tcp --dport 3306 -j DROP #禁止直接訪問線上的3306,防止內網被破
注:爲了預防偶然因數gre turnel斷掉,你可以自己研究監控腳本。在檢測到網絡不同的時候,再運行這個腳本(運行之間請注意device office是否已存在等),這裏就不詳細介紹了。請自己動手。
【第四、測試效果】
【第五、深入理解GRE】
操作之後,需要對背景和理論更加熟悉才能在遇到異常的時候才能處理的遊刃有餘。
GRE(通用路由協議封裝)協議,由Cisco和Net-smiths等公司於1994年提交給IETF,它對部分網絡層協議(ip)的數據報進行封裝。它規定了如何用一種網絡協議去封裝另一種網絡協議,很多網絡設備都支持該協議。說得直白點,就是gre將普通的包(如ip包)封裝了,又安裝普通的ip包的路由方式進行路由,相當於ip包外面再封裝一層gre包。在本例子中,在gre包外圍實際上又有一層公網的ip包。
GRE使用tunnel(隧道)技術,數據報在tunnel的兩端封裝,並在這個通路上傳輸,到另外一端的時候解封裝。你可以認爲tunnel是一個虛擬的點對點的連接。(實際PointToPoint連接之後,加上路由協議及nat技術,就可以把兩個隔絕的局域網連接在一起,就實現了NetToNet的互聯。)
一般gre turnel是在多個網絡設備(一般爲路由器)之間建立。因爲linux服務具備路由轉發功能,所以當您缺少專業的路由設備的時候,可使用linux服務器實現gre turnel的建立,這也說明linux的強大啊(實際上巨大多數網絡設備都使用unix或linux系統)
我對gre的理解如下:
(0)gre的turnel的打通
1、 這個過程就是雙方建立turnel的過程。
(1)局域網路由過程
1、主機A發送一個源爲192.168.1.2,目的爲10.1.1.2的包
(2)封裝過程
1、根據內網路由,可能是你的默認路由網關將之路由至192.168.1.254
2、192.168.1.254第一次封裝包,增加增加gre包頭,說明包的目的地址192.192.192.1和源地址192.192.192.2。
3、192.168.1.254第2次封裝包,增加公網的包頭(否則在公網上無法路由),說明包的目的地址110.2.2.2和源地址180.1.1.1。
4、192.168.1.254把所有到10.1.1.0/24的包,都地址轉換爲從192.192.192.2出(snat)
(3)公網路由過程
1、經過n個路由設備,該包最終路由到110.2.2.2
(4)拆包過程
1、B端的路由器檢測到是到達自己的ip,就開始拆包
2、拆包之後發現有GRE協議,就進一步拆包
3、拆包之後發現目的地不是自己的內網ip、發現自己本地做了snat,就將至源ip替換爲10.1.1.1
(5)局域網路由
1、實際上從10.1.1.1出發的,到達目的地爲10.1.1.2的包,無需路由,直接在局域網內廣播。10.1.1.2的機器確定是發送給自己的包,就接收。然後進一步處理了。