利用iptables目標重寫巧妙變更遺留系統配置

一個場景:

假設某組織的日常運營中有這樣一種應用場景,在一台機器(1.1.1.1)上,運行著一個很古老的應用程序(APP),這個APP一直運行良好,雖然其配置極複雜但在最初配置成功後就再也不用修改了。經過漫長歲月,組織中已經沒人知道該怎麼修改該APP的配置了,也沒人想修改它,因為不改的話它會一直正常運行,改的話萬一出錯了恢復不了怎麼辦。這樣的APP稱作「遺留系統」。

該APP會與另一台機器(2.2.2.2)通信,並為其提供某些服務。有一天,由於不可抗拒的原因,2.2.2.2的IP地址必須改變為3.3.3.3,那麼,從該APP提供的服務立即就失效了。組織中需要有人勇敢的站出來,修改1.1.1.1上該APP的配置,需要將其原來指向2.2.2.2的配置選項改為指向3.3.3.3。

但是,十分悲催的是,檢查發現該APP的配置選項中竟然沒有任何2.2.2.2的信息,進一步確認得知,原來2.2.2.2是寫死在APP的程序源代碼中的,不可配置!這可怎麼辦?

一個巧妙的方法:

幸運的是,該APP運行在一台LINUX系統中,而LINUX的iptables防火牆可以很容易地在該APP外部修改其發出的報文的目的地址。從而,在不改變APP配置、不修改APP程序源代碼的情況下,將該APP的流量從2.2.2.2改為指向3.3.3.3。具體的配置命令如下,執行即可生效:

iptables -t nat -A OUTPUT -d 2.2.2.2 -p tcp --dport 8888 -j DNAT --to-destination 3.3.3.3:8888n

1.1.1.1上的APP運行在LINUX系統的用戶態,它產生的流量通過SOCKET API經過LINUX內核態TCP/IP協議棧發出。iptables基於netfilter錶鏈機制實現,它可以指示系統在nat表的OUTPUT鏈中將從本機發出的IP報文的目的地址進行重寫修改。

iptables -t nat // 在nat表進行重寫n -A OUTPUT // 在OUTPUT鏈進行重寫n -d 2.2.2.2 // 2.2.2.2是重寫前的舊IP地址 n -p tcp n --dport 8888n -j DNAT n --to-destination 3.3.3.3:8888 // 重寫後目的地址改為3.3.3.3n

就這樣,IP地址重寫只是iptables的一個小小功能,掌握iptables的各種用法及原理並靈活運用,會讓生活充滿驚喜~

Reference:

0. 老宋的獨家號

1. The netfilter.org project

2. iptables(8) - Linux man page

註:本文為老宋原創文章,歡迎隨意轉載,有任何疑問前請至【知乎專欄-老宋的獨家號】評論區討論交流。

推薦閱讀:

淺談Windows 10中藏著的那個Linux
如果沒有Linux,IT業界會是怎樣的現狀?
遊戲伺服器運維疑惑?
關於固態硬碟的定址原理和定址速度的一個疑問?
作為一個機房運維維護人員,對linux的學習多深才算合格??

TAG:iptables | Linux | IT运维 |