好的,這是我的問題。請原諒我,因爲它有點複雜。我幾乎100%肯定它是由MacOS 10.6內核錯誤引起的,但由於我們無法指望修復的錯誤,因此我需要一種解決方法。MacOS上的net.inet.ip.scopedroute = 0導致破壞的ARP條目是否有解決方法?
我learned earlier說:「ipfw的...... FWD」規則不正確地在Mac OS 10.6(它適用於10.5),除非你先做
sysctl -w net.inet.ip.scopedroute=0
然而工作,事實證明,這種解決方案ISN」完美無缺;在進行此更改後大約10到15分鐘,我的Mac基本上停止與Internet通話。 ping我的本地網絡之外的任何東西開始說「沒有路由到主機」,儘管我絕對有一條有效的默認路由。我已將問題追溯到不正確的ARP條目。我運行上面的命令之前,我的ARP表是這樣的:
# arp -a
router (192.168.42.1) at 0:1c:10:b0:d4:79 on en1 ifscope [ethernet]
運行上面的sysctl,然後做ping google.com
後,它看起來像這樣:
# arp -a
dd-wrt (192.168.42.1) at 0:1c:10:b0:d4:79 on en1 [ethernet]
dd-wrt (192.168.42.1) at 0:1c:10:b0:d4:79 on en1 ifscope [ethernet]
到目前爲止,一切都無害。但是一段時間後,原始的arp條目超時了,我們剩下的全部是新的。 MacOS試圖刷新舊的條目,但它永遠不會回來。 tcpdump顯示來自我的Mac的重複ARP請求,並從路由器返回正確的ARP響應,但答案永遠不會放入ARP表中。我懷疑答案只是更新其他 ARP條目,因爲它們在某種類型的散列表中都具有相同的密鑰。
運行「ARP -a -d」(或任何變異體「ARP -d」我試過)沒有成功刪除這兩個ARP表項 - 只是其中之一。顯然,不是正確的。
以下任何變通辦法使問題消失,但不良:中
- ,而不是在運行時,編輯sysctl.conf的和重啓改變的sysctl。
- 更改sysctl後,關閉界面並重新啓動它。
- 改變的sysctl後,刪除通過該接口(與
route
命令)所有路線,並重新創建它們。
但是,這些選項中的每一個都會使系統暫時處於數據包不可路由的狀態。而且,因爲我實際上並不知道這個sysctl是幹什麼的(有人能指出我的文檔是否適合它),我真的很希望我的程序能夠在退出時將其恢復正常。但是如果我這樣做了,那麼下次我的程序開始時它就會被再次破壞。
我想我真的需要做的只是清除ARP表,但也許我失去了明顯的東西。有沒有簡單的方法來解決這個問題,還是我不得不訴諸醜陋的東西?
(順便說一句,我正在開發的程序是開源的,名爲sshuttle。如果您在新的Mac上使用默認值爲1的sysctl嘗試它,您應該能夠輕鬆地複製該問題。)
感謝您的任何建議。
你有沒有試過在serverfault.com和apple.stackexchange.com上問這個問題?另外,你有沒有向蘋果提交過雷達? – 2011-04-16 11:00:15