1. 程式人生 > >Centos伺服器的埠對映

Centos伺服器的埠對映

一個合作單位給我建立了十幾臺虛擬伺服器做支撐。但是隻給負載均衡綁定了公網IP。
由於這個支撐的服務需要測試和調優,經常要往伺服器上傳class或者修改資料庫。
為了方便操作,我打算在負載均衡伺服器上做埠對映,把不同的伺服器對映在埠上。
這樣團隊成員只要連結唯一公網IP的不同埠就可以在對應的不同伺服器上進行操作了。


首先選定的工具是iptables,也沒有什麼特別理由,就是因為以前用過類似的功能。


首先肯定是執行:echo 1 >/proc/sys/net/ipv4/ip_forward 開啟linux的轉發功能。


然後就在網上查,別人是怎麼實現的。看到有朋友是這樣寫的:
iptables -t nat -A PREROUTING -d 【公網地址】 -p tcp -m tcp --dport 【公網埠】 -j DNAT --to-destination 【內網IP】:【內網埠】
我嘗試了幾次,沒有實現轉發功能,原因不明。類似的方式找了很多,都沒有成功。
最後只好找合作單位的網管問問,網管兄弟聽了我描述的情況後,一句話就說清楚了。
原來他們虛擬的伺服器全都沒有繫結公網IP的網絡卡,所有通過公網的訪問全都是由防火牆對映到繫結內網IP的網絡卡上的。我不瞭解IDC搭建,所以在這個過程中耽誤了很多時間。
這下就明白了,填寫公網IP肯定在轉發時無法識別。趕緊改一下,不再指定公網IP了。
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 【公網埠】 -j DNAT --to-destination 【內網IP】


這樣執行後仍然沒有實現對映。繼續在網上查,直到看了這篇文章:http://blog.csdn.net/yu_xiang/article/details/9212543
原來要用資料包發起方的IP地址(就是發起連線使用者的IP)當作SNAT來使用,這樣目標【內網IP】伺服器回包的時候,才會路由到資料包發起方的IP上。
所以要先執行: iptables -t nat -A POSTROUTING -j MASQUERADE 設定SNAT(其中使用MASQUERADE是因為在我的這個需求中資料包發起方的IP是不確定的)。
然後再執行: iptables -t nat -A PREROUTING -p tcp -m tcp --dport 【公網埠】 -j DNAT --to-destination 【內網IP】 指定埠映象策略。


本以為這樣就ok了,試了一下沒想到還是不能實現轉發。繼續查原因,
經過漫長的查詢,終於發現原來iptables安裝後,預設在INPUT表和FORWARD表中拒絕所有其他不符合配置檔案中規則的資料包。
知道原因就好辦了,開啟/etc/sysconfig/iptables 在最下面果然有這麼兩句:
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
趕緊把 -A FORWARD -j REJECT --reject-with icmp-host-prohibited 註釋掉,然後重啟iptables
再執行上面幾項配置:


echo 1 >/proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -j MASQUERADE
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 8001 -j DNAT --to-destination 172.31.2.51:22
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 8002 -j DNAT --to-destination 172.31.2.52:22
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 8003 -j DNAT --to-destination 172.31.2.55:8161
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 8004 -j DNAT --to-destination 172.31.2.56:8161
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 8005 -j DNAT --to-destination 172.31.2.57:8161
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 8006 -j DNAT --to-destination 172.31.2.58:22
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 8007 -j DNAT --to-destination 172.31.2.53:22
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 8008 -j DNAT --to-destination 172.31.2.59:1521
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 8009 -j DNAT --to-destination 172.31.2.60:1521
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 8010 -j DNAT --to-destination 172.31.2.61:22


大功告成。
如果想要把配置儲存起來,可以執行 service iptables save 
這樣就不會每次重啟 iptables 的時候配置就失效了。
這個一定要注意啊,如果不儲存,重啟iptables之後配置就失效了,要重新進行配置。
昨天就吃了這個虧,生效後重新修改了配置檔案,重啟後所有配置都失效了。我還以為是iptables出了問題,結果浪費了很多時間。


最後再說兩句題外話,工程師的知識面廣一些,真的很有好處,如果我懂點IDC搭建的知識,就不會在前面浪費那麼多時間了。
所以說,工程師的肚是雜貨鋪,這話一點錯都沒有。