有個路由問題想請教高手一下,我的網路架構圖如下:
http://picasaweb.google.com.tw/lh/photo/PUawBIA8W6Fq_FahkMluQw

2台Switch都只是單純的L2 Switch
我想要透過CISCO 1800把192.168.100.X/24及192.168.1.X/24的網段route到CISCO 1800的另一邊
於是我直接route 192.168.X.X/16
理論上應該是可以過得去的
但是卻變成只有192.168.1.X及192.168.100.2才過得去

而且從192.168.100.3這台Server上面,可以Ping得到192.168.1X任一機器
但是就是Ping不到192.168.1.254

最後是分別route 192.168.100.X/24和192.168.1.X/24才都ok

我想請益一下怎麼會發生這種狀況,怎麼想都想不透
文章關鍵字









carye6917 wrote:
2台Switch都只是單純的L2 Switch
透過CISCO 1800把192.168.100.X/24及192.168.1.X/24的網段route到CISCO 1800的另一邊
於是我直接route 192.168.X.X/16
理論上應該是可以過得去的
但是卻變成只有192.168.1.X及192.168.100.2才過得去
而且從192.168.100.3這台Server上面,可以Ping得到192.168.1.X任一機器
但是就是Ping不到192.168.1.254
最後是分別route 192.168.100.X/24和192.168.1.X/24才都ok...(恕刪)



我有幾個疑問
1. 一般來說有做NAT,不知道你是做哪種NAT ???
(一對一、一對多、多對多)

2. 不過看到你這句 "最後是分別route 192.168.100.X/24和192.168.1.X/24才都ok" , 我猜想代表你那台Linux Server沒有做NAT的動作... 應該你頂多做個 IP_Forward 的動作吧!

以上是我的假設...

OK...

問題還不難... 因為你沒有做NAT,所以封包的傳輸表頭依然保留原先的IP表頭並沒有被置換掉...

所以這樣的情況就是你不能直接設計 192.168.X.X/16 的方式來做routing...

而是分別需要個別的寫入 192.168.X.X/24 的方式...

假設封包都可以經過Linux Server抵達(假設都由 192.168.100.3發出) 192.168.1.0/24 的網段當中,但是唯獨 192.168.1.254 卻無法回應...

這道理很簡單,因為你將 fa0/0 的 interface 設定為 192.168.0.0/16 換句話說就是 192.168.0.0/16 這個Class B 的網段都屬於 fa0/0 這個 interface , 既然屬於這個interface的話,那就是屬於我這個 fa0/0 所在的LAN當中,既然在我的LAN當中,1800 Router就會直接往 fa0/0 的介面回應;但是... 在 192.168.1.0/24 的LAN 裡面沒有 192.168.100.3 這個IP阿! 於是這個封包就會被丟掉!!! 那你會問說... 為什麼不是 Linux Server 的 eth1 接受之後,再經過路由呢??? 道理很簡單... 因為你給 1800 Router 的介面設定就是判定 192.168.0.0/16 都屬於 fa0/0 , 也就是說 fa0/0 這個區域的LAN 包含有 192.168.0.0/16 的網段IP , 也就是整個Class B 都是屬於這個fa0/0 這個LAN底下的區域, 既然是這個區域,自然而然封包就不用再往其他的介面來傳送,但是 192.168.1.254 回應的封包是給 192.168.1.3 , 而 192.168.1.3 中途當中還有一個 Linux Server 隔開, 既然路由沒有寫定要往 Linux Server 的 eth1 傳送, 而是在 fa0/0 這個介面所屬的LAN當中尋找是否有 192.168.100.3 這個IP,當然 由圖片可以得知192.168.100.3 這個IP 並不屬於 fa0/0 底下的 LAN 當中,而是透過 Linux Server 來界接路由, 所以當沒有這個IP回應的時候,這個封包自然就會被捨棄! 也就造成192.168.100.3沒有接收到ICMP的回應封包! 這樣說你了解嗎?

解決方案:
除非你將 1800 的 routing table 加上一條 static route 指定 192.168.100.0/24 的封包要往 Linux Server eth1 的介面來傳送... 這樣封包就可以經由Linux Server的路由來回應到 192.168.100.3 的這台機器當中... 不過設定這樣,那不如將介面裡面的Route律訂比較清楚,哪個網段就使用哪個NetID,這樣會debug會比較方便又清晰!!

不知道這樣說你是否了解????

本文章同步發表MML網站

還有一些解決方案

啟用PAT的方式... (192.168.1.1 對 192.168.100.0/24) 利用 Linux Server 的 NAT 來搞

這樣你的 1800 Router 就可以加這條 192.168.0.0/16 的方式了...

因為封包從 192.168.100.3 發出, 則 Linux Server 的 NAT 會將 封包的IP表頭置換為 192.168.1.1 ...


那要從192.168.1.1 這個介面往 192.168.100.3 來做連線呢???

很簡單,只要設定 Port-Mapping 早期我寫的 Port Mapping 的 大概的解說


指定好連線的埠號之後,就可以一一的對應...



或者 啟用 一對一 的NAT (192.168.1.0/24 對 192.168.100.0/24) 也是使用 Linux Server 來搞

這樣也是可以解決...相信方法還有很多...

只是我笨...稍微就想了這樣...


本文章同步發表MML網站
先感謝鴨大回覆


1. 一般來說有做NAT,不知道你是做哪種NAT ???
(一對一、一對多、多對多)

2. 不過看到你這句 "最後是分別route 192.168.100.X/24和192.168.1.X/24才都ok" , 我猜想代表你那台Linux Server沒有做NAT的動作... 應該你頂多做個 IP_Forward 的動作吧!


小弟這邊做的是1對多NAT
iptables下的命令如下:
#iptables -t nat -A POSTROUTING -s 192.168.1.0/255.255.255.0 -o eth1 -j MASQUERADE

一開始1800上面192.168.0.0/16的靜態路由是設到192.168.1.1
原本是想說這樣子的話,1800接收到要往192.168.0.0/16的封包應該都會先往192.168.1.1來送
再由linux 上面的路由去判斷該往那個介面送出去
結果是在1800上面只能ping到192.168.100.2,ping不到其他192.168.100.X的IP

詢問負責我們公司VPN的ISP工程師,他是說是因為MAC的關係
但是因為沒有說的很清楚,所以才想上來問

鴨大的回覆小弟大約知道了,不過可能要再去找相關的資料來看,感謝~~~~
carye6917 wrote:
iptables下的命令如下:
#iptables -t nat -A POSTROUTING -s 192.168.1.0/255.255.255.0 -o eth1 -j MASQUERADE

一開始1800上面192.168.0.0/16的靜態路由是設到192.168.1.1
原本是想說這樣子的話,1800接收到要往192.168.0.0/16的封包應該都會先往192.168.1.1來送
再由linux 上面的路由去判斷該往那個介面送出去
結果是在1800上面只能ping到192.168.100.2,ping不到其他192.168.100.X的IP

詢問負責我們公司VPN的ISP工程師,他是說是因為MAC的關係...(恕刪)



MAC ??? 應該不是這個問題吧...

至於你說的 1800 Router 要寫入 兩個 Subnet , 這部分應該就是判定的原因...也就是問題的所在...

通常判定封包是不是屬於LAN的區域當中,則是將傳輸封包的目的IP與自己的sub-mask來做比對...

當然 1800 Router 的fa0/0 的interface 上面已經設定為 192.168.0.0/16 ,也就是封包屬於 fa0/0 當中,判定屬於LAN當中的封包,所以並不會將封包往Linux Server送,而是尋找相處於fa0/0同一個LAN當中的192.168.100.3... 這就是問題所在...

換句話說...應該是你NAT沒有設定OK... 才會造成這樣的狀況...

因為看這樣的狀況,又經過你的實驗之下... 要設定兩個 192.168.1.0/24 與 192.168.100.0/24 這兩條routing rule 才有辦法傳送到對方,這已經代表你的Linux Server的NAT並沒有發揮到作用... 也就是你的Linux Server iptables的nat沒有正常... 換句話說,也就是只有啟用到 Linux Server 的 IP_FORWARD 的功能...

判定應該是NAT的問題...

假設 192.168.1.x/24 NAT到 192.168.100.0/24

應該是

iptables -t nat -A POSTROUTING -o eth1 -s 192.168.1.0/24 -j SNAT --to 192.168.100.2


由於你的 eth1 應該是有成功將封包的標頭置換為 目標IP , 所以你的 192.168.1.0/24 裡頭的所屬IP應該都會藉由 192.168.100.2 這個介面的IP來做NAT出去來連線到 192.168.100.3 or 192.168.100.1 ... 將介面的規則律訂清楚會比較好...

但是若是你從 192.168.100.3 要來連線到 192.168.1.0/24 的部份,應該是經由 IP Forward 的方式,並沒有透過NAT的連線! 因為你的 Linux Server 並不會將 192.168.100.0/24 的封包來置換為 192.168.1.1 的IP表頭,所以從 192.168.100.0/24 連線到 192.168.1.0/24 的IP 還是為 192.168.100.0/24 而不是 192.168.1.1 這個IP做NAT出去...

所以若你還要使用Linux Server的NAT機制從 192.168.100.0/24 往 192.168.1.1 這個介面做NAT出去,勢必你還要多加一條 iptables rule 才對...

iptables -t nat -A POSTROUTING -o eth0 -s 192.168.100.0/24 -j SNAT --to 192.168.1.1

不過相信你的 192.168.100.3 的Server有提供服務,那要如何提供服務到 192.168.1.0/24 的網段呢?

其實只要做好 NAPT 就可以了! 假設 192.168.100.3 對 192.168.1.0/24 這個區塊作 web service

iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j DNAT --to 192.168.100.3:80
iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j DNAT --to 192.168.100.3:443

若192.168.1.0/24或者 1800 Router 要連線到 192.168.100.3 的 Web Service

就可以直接連線到 192.168.1.1 的 80 Port 了...

你可以在 Linux Server 加上上面我建議的兩條 rules (web service是個範例...紅色標明的才是你要加上去的)
就愛亂塗鴨 wrote:
MAC ??? 應該...(恕刪)


感謝鴨大~~~
真是一語驚醒夢中人呀
因為在試的時候一直沒想到會是NAT的關係
馬上來試試看......
文章分享
評分
評分
複製連結

今日熱門文章 網友點擊推薦!