Linux下双线双ip访问内网服务器之另类解决办法
一直被雙線訪問內(nèi)網(wǎng)服務(wù)器的路由問題困擾,也在網(wǎng)上找了不少資料,但有些方法比較復(fù)雜,對(duì)我這種懶人來說實(shí)在懶得去看去測試。最接近的方法是iptables+iproute2,但我比較杯具的木有測試成功。。。。。后來自己慢慢想,居然想出了這么個(gè)懶辦法。
環(huán)境
server 1 (Centos5)
雙網(wǎng)卡eth1和eth2,分別配置了電信和聯(lián)通的ip,還有一個(gè)內(nèi)網(wǎng)口eth0做為內(nèi)網(wǎng)網(wǎng)關(guān)。
TEL="eth1"
TEL_IP="電信ip"
TEL_GW="電信網(wǎng)關(guān)"
CNC="eth2"
CNC_IP="聯(lián)通ip"
CNC_GW="聯(lián)通網(wǎng)關(guān)"
這臺(tái)服務(wù)器上已經(jīng)用策略路由做了數(shù)據(jù)包原路返回,即從外部訪問電信ip則原路從電信ip返回,聯(lián)通ip也原路返回。
/sbin/ip route replace default via $TEL_GW dev $TEL
/sbin/ip route flush table TEL
/sbin/ip route add 192.168.1.0/24 dev eth0 src 192.168.1.1 table TEL
/sbin/ip route add default via $TEL_GW dev $TEL src $TEL_IP table TEL
/sbin/ip rule add from $TEL_IP table TEL
/sbin/ip route flush table CNC
/sbin/ip route add 192.168.1.0/24 dev eth0 src 192.168.1.1 table CNC
/sbin/ip route add default via $CNC_GW dev $CNC src $CNC_IP table CNC
/sbin/ip rule add from $CNC_IP table CNC
然后做了iptables的端口映射到server 2機(jī)器的21端口。
$IPTABLES -t nat -A PREROUTING -p tcp --dport 4376 -j DNAT --to-destination 192.168.1.2:21
server 2 (Centos6)
應(yīng)用服務(wù)器,只配置了一個(gè)內(nèi)網(wǎng)ip,上面開了ftp服務(wù)。
eth0=192.168.1.20
現(xiàn)在的問題是,如果從電信ip訪問則可以連接上ftp服務(wù)器,因?yàn)槟J(rèn)路由是從電信ip出,但從聯(lián)通ip訪問時(shí),從上面的策略路由可以看到,只對(duì)是eth1和eth2做了策略路由,ftp服務(wù)器返回的數(shù)據(jù)是從eth0口進(jìn)入,路由無法區(qū)分是從哪個(gè)外網(wǎng)ip訪問的,所以出口還是會(huì)走默認(rèn)的電信ip,最終被上層網(wǎng)關(guān)丟棄而無法正常訪問。
此時(shí)該如何做才可以做到兩個(gè)外網(wǎng)ip同時(shí)可以訪問到內(nèi)網(wǎng)ftp服務(wù)器呢
?
---------------------------------------------------
7月18日
幾個(gè)月了,我都沒找到一個(gè)能用的解決方案。
昨天在網(wǎng)上閑逛,看到有人提到這個(gè)問題,說是可以用特定ip做靜態(tài)路由。
這個(gè)說得有些含糊,我理解是在內(nèi)網(wǎng)ftp上再加一個(gè)ip,可以是同一段的內(nèi)網(wǎng)ip,也可以是不同段的內(nèi)網(wǎng)ip,然后在網(wǎng)關(guān)上做靜態(tài)路由指向聯(lián)通出口。這個(gè)方法理論上是可行的,但我還沒有配置到工作環(huán)境里去,等過幾天配置好再詳細(xì)整理有關(guān)配置。
?
-------------------------------------------------------------------------------------
7月26日
幾天前,我已經(jīng)驗(yàn)證了上面的想法,是完全可行的。下面就是完整解決方法。
根據(jù)以前的配置,只要在ftp服務(wù)器上多加一個(gè)內(nèi)網(wǎng)iip,這個(gè)內(nèi)網(wǎng)ip最好和現(xiàn)有的內(nèi)網(wǎng)同一段,當(dāng)然也可以用不同段的內(nèi)網(wǎng)ip。比如我就在server 2上加了一個(gè)。所以現(xiàn)在server2上就有兩個(gè)內(nèi)網(wǎng)ip了
eth0=192.168.1.20
eth1=192.168.1.25
對(duì)server2的改動(dòng)就這些,其他的什么都不用動(dòng)。
接下來再回到server1上
修改iptables的映射
$IPTABLES -t nat -A PREROUTING -p tcp -d 電信ip --dport 4376 -j DNAT --to-destination 192.168.1.20:21
$IPTABLES -t nat -A PREROUTING -p tcp -d 聯(lián)通ip --dport 4376 -j DNAT --to-destination 192.168.1.25:21
這樣就把從兩個(gè)外網(wǎng)ip訪問的流量分別映射到server2的兩個(gè)ip上。
然后再添加基于源地址的策略路由
ip rule add from 192.168.1.20 table TEL
ip rule add from 192.168.1.25 table CNC
這樣做的意思就是如果接收到源地址是192.168.1.20的數(shù)據(jù)包,就放到tel的路由表中,這樣它就會(huì)從tel的網(wǎng)關(guān)出去了。
同理接收到192.168.1.25為源地址的數(shù)據(jù)包,就放到cnc路由表中,就從cnc網(wǎng)關(guān)出去了。
注意在server1上要同時(shí)有
$IPTABLES -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth1 -j SNAT --to-source 電信ip
$IPTABLES -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth2 -j SNAT --to-source 聯(lián)通ip
到此,就解決了雙線訪問內(nèi)網(wǎng)的問題。
一些補(bǔ)充:
server2用的是centos6,在做多ip的時(shí)候跟centos5有區(qū)別,不能再用eth0.1 eth0.2這樣的了。只能bind。
本文是參考了http://bbs.chinaunix.net/thread-2042243-1-1.html寫出的,我也想把里面的iptables+iproute2的方法拿出來做個(gè)比較。以下是從該貼摘出來的。
-----------------------------------------------------------
內(nèi)核打補(bǔ)丁
?? 如果你希望外網(wǎng)用戶,不管通過哪個(gè)IP都可以訪問到服務(wù)器或映射后的內(nèi)網(wǎng)服務(wù)器,那么你就需要為內(nèi)核打上補(bǔ)丁,
?? 補(bǔ)丁在 http://www.ssi.bg/~ja/#routes 可以下載到,在 Static, Alternative Routes, Dead Gateway Detection, NAT 找和內(nèi)核對(duì)應(yīng)的 patch
?? 下載后為內(nèi)核打上,然后在
??? Networking? --->? Networking options? --->? IP: advanced router
??? 把 IP: equal cost multipath with caching support (EXPERIMENTAL) 前面的勾去掉
??? 如果你不想打補(bǔ)丁,或不想動(dòng)內(nèi)核,有個(gè)簡單的辦法來實(shí)現(xiàn),即寫一個(gè)腳本,每隔2秒鐘刷新一次route cache
??? while : ; do
??????? ip route flush cache
??????? sleep 2
??? done
?iptables打標(biāo)記+iproute2 fwmark
??? 1)使用 CONNMARK 對(duì)連接進(jìn)行標(biāo)記
??? 外網(wǎng)進(jìn)來數(shù)據(jù)
??? iptables -t mangle -A PREROUTING -i eth1 -m conntrack? --ctstate NEW? -j CONNMARK --set-mark 0x100
??? iptables -t mangle -A PREROUTING -i eth2 -m conntrack? --ctstate NEW? -j CONNMARK --set-mark 0x200
??? 轉(zhuǎn)發(fā)出去的數(shù)據(jù)
??? iptables -t mangle -A POSTROUTING -o eth1? -m conntrack? --ctstate NEW? -j CONNMARK --set-mark 0x100
??? iptables -t mangle -A POSTROUTING -o eth2? -m conntrack? --ctstate NEW? -j CONNMARK --set-mark 0x200
??? 局域網(wǎng)進(jìn)來數(shù)據(jù)
??? iptables -t mangle -A PREROUTING -i eth0 -m conntrack --ctstate ESTABLISHED,RELATED -j CONNMARK --restore-mark
??? 本地出去數(shù)據(jù)
??? iptables -t mangle -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j CONNMARK --restore-mark
?? 2)在 IPROUTE2 中做基于 fwmark 的策略路由
?? ip rule add fwmark 0x100 table ctc prio 40
?? ip rule add fwmark 0x200 table cnc prio 40
?? 3)添加原路返回路由
?? ip route add table ctc to $CTC_NET dev eth1? scope link
?? ip route add table ctc to $CNC_NET dev eth2? scope link
?? ip route add table ctc to 192.168.0.0/24 dev eth0? scope link
?? ip route add default via 電信網(wǎng)關(guān) dev eth1 table ctc
?? ip route add table cnc to $CTC_NET dev eth1 scope link
?? ip route add table cnc to $CNC_NET dev eth2? scope link
?? ip route add table cnc to 192.168.0.0/24 dev eth0? scope link
?? ip route add default via 網(wǎng)通網(wǎng)關(guān) dev eth2 table cnc
Iptables/NAT 規(guī)則
???? /sbin/iptables -t nat -A POSTROUTING -o eth1 -s 局域網(wǎng)網(wǎng)段 -j SNAT --to-source 電信外網(wǎng)IP
???? /sbin/iptables -t nat -A POSTROUTING -o eth2 -s 局域網(wǎng)網(wǎng)段 -j SNAT --to-source 網(wǎng)通外網(wǎng)IP
??? 如果外網(wǎng)IP是動(dòng)態(tài)的,可以用 MASQUERADE
???? /sbin/iptables -t nat -A POSTROUTING -o eth1 -s 局域網(wǎng)網(wǎng)段 -j MASQUERADE
???? /sbin/iptables -t nat -A POSTROUTING -o eth2 -s 局域網(wǎng)網(wǎng)段 -j MASQUERADE
端口映射
??? 端口映射可以分別針對(duì)兩條線做端口映射
??? 比如 LAN口的IP為 192.168.0.1,內(nèi)網(wǎng)服務(wù)器IP為 192.168.0.100,映射端口為 80
??? iptables -t nat -A PREROUTING -p tcp --dport 80 -d 電信IP -j DNAT --to-destination 192.168.0.100
??? iptables -t nat -A PREROUTING -p tcp --dport 80 -d 網(wǎng)通IP -j DNAT --to-destination 192.168.0.100
??? 端口回流(內(nèi)網(wǎng)可以通過外網(wǎng)IP訪問映射后的服務(wù)器)
??? iptables -t nat -A POSTROUTING -p tcp -s 192.168.0.0/24 --dport 80 -d 192.168.0.100 -j SNAT --to-source 192.168.0.1
??? [注]:上述規(guī)則應(yīng)放到 NAT 規(guī)則之前
--------------------------------------------------------------------------
其實(shí)這種方法我也已經(jīng)測試過了。在centos6上沒有測試成功,不知道哪里有問題,而且我也不清楚怎么去監(jiān)控一個(gè)打了標(biāo)記的連接。本人水平不高,請(qǐng)諒解,有興趣的同學(xué)可以把測試結(jié)果告訴我,謝謝了!
我的方法比較簡單,操作起來也不復(fù)雜。但并不是說就比iptables+iproute2的方法好。關(guān)鍵還是要看應(yīng)用的實(shí)際情況。無論是哪種方法,歸根結(jié)底就一個(gè)問題,如何區(qū)別從內(nèi)網(wǎng)服務(wù)器返回的數(shù)據(jù)到底是從哪個(gè)外網(wǎng)ip進(jìn)來的。無論是給連接打標(biāo)記還是給服務(wù)器加ip都是在解決這個(gè)問題。所以很多技術(shù)上的問題,關(guān)鍵是要有思路,解決辦法就不是那么重要了。
?
轉(zhuǎn)載于:https://blog.51cto.com/phenixjiang/831148
總結(jié)
以上是生活随笔為你收集整理的Linux下双线双ip访问内网服务器之另类解决办法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iphone网络交互json实现
- 下一篇: PHP程序员如何突破技术瓶颈