iptables 網絡管理器

   前些日子,組長要我實現一個功能,將告警郵件中的不能訪問的生產機器ip+端口轉化爲辦公環境可以訪問的域名(已經通過端口映射配置)。報警程序是用go語言編寫的,如果直接將go語言配置文件中的ip+端口變成域名的話,程序就不能正常運行了,可linux的hosts文件不支持直接將域名解析到端口映射的級別(順便說一句windows好像可以,即hostname可以在windows的hosts文件中解析爲1.2.3.4:1234這種形式)。

   於是大概想的這種策略:

    1.將linux機器上的/etc/hosts中添加域名到ipA的配置;

    2.想辦法將ipA對80端口的訪問重新定向到ipA的指定端口(比如520)。

   第一步好做,但是第二步呢?用Apache端口映射功能?還要在裝個apache web server;於是想到了linux自帶的iptables。

   很多搭建過rac、dg、hadoop這類需要多臺機器協同工作的程序的朋友應該都接觸過iptables,而且通常都是iptables -F,清空管理規則,達到關閉防火牆的效果。其實防火牆只能說是iptables的一部分功能,感覺更準確的說iptables是一個網絡管理工具,不僅能夠將機器接收到的網絡數據丟棄或者接受,還可以進行其他操作比如轉發、記錄日誌等等。

   iptables的大體結構就像下面這的圖展示的(圖片來自互聯網)

    wKiom1iEn4uilkUVAAUbpQ0-8G8723.jpg-wh_50

   主要這麼看這張圖:

    1.iptables的規則可以在五個地方(這裏專業叫法叫做鏈)起作用:路由規則之前(prerouting)、轉發過程中(forward)、路由規則之後(postrouting)、程序處理之前(input)、程序處理之後(output);

    2.iptables主要有這三種功能(這裏可以叫做三張表,畢竟規則就像數據庫中的記錄記錄在數據表一樣記錄在這):地址轉化(nat)、包過濾(filter)、修改包(mangle)(raw用的不多,不是很懂,在網上看了一下好像是優先級高,可以避免nat等規則匹配提高效率)。

   以perrouting爲例,在這裏可以通過iptables的一系列規則匹配,對發送過來的數據包進行修改或者地址轉化;以forward爲例,在經過路由表匹配發現目標機器不是這臺機器的時候,可以對數據包修改或者過濾其他的就不重複說明了。

   下面說說iptables的語法(圖片來自互聯網)

    wKiom1iEpAriuv5MAABsvVPw7LE600.jpg-wh_50

    大體語法是這樣的

    iptables -t 指明哪張表 -(A追加,I插入等等) 鏈名 匹配規則 特定操作(redirect、drop、accept等等)

   以上面的需求來看,現在我想在訪問80端口的時候,將訪問重新定向到520端口。那麼就可以在prerouting的時候,將訪問本機80端口的數據包變成訪問本機520端口的數據包

   於是以root用戶執行如下命令

    iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRET --to-port 520

   這樣就達到想要的效果,即在go語言中配置域名,但是仍然能夠訪問正確的ip+端口。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章