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