2010-02-17 67 views
3

我有一個ipv4服務器,只接受本地主機上的連接(使用INADDR_LOOPBACK)。我想將此服務器轉換爲雙棧ipv6/ipv4。但是,使用in6addr_loopback只接受連接到::1本地主機上的雙棧ipv6/ipv4

我發現我可以同時使用in6addr_any同時接受ipv4和ipv6連接,但由於這也允許來自任何地方的連接對我的特殊情況無用。

是否可以同時綁定到ipv6 localhost(::1)和ipv4 localhost(127.0.0.1)?

+1

這需要去serverfault –

+3

據我所知,ServerFault是一個IT/SysAdmin類型的網站。這是一個編程(套接字API)問題。 – paleozogt

回答

3

AFAIK,這是不可能的。

你需要做的是創建兩個套接字,一個綁定到INADDR_LOOPBACK,一個綁定到in6addr_loopback。然後,您可以同時使用您選擇的多路複用器(輪詢,選擇,epoll等)來等待它們兩者。

更新

就想出了你可能要考慮一些變通。在這兩種解決方法中,您都綁定到in6addr_any

  1. 建立連接時,請檢查遠程地址,如果它不是127.0.0.1或:: 1,請關閉它。儘管在IP地址上連接的行爲並不理想(連接建立/立即關閉而不是被拒絕),但這可以純粹在您的應用程序中完成。
  2. 調整操作系統IP堆棧的設置,拒絕來自非環回IP的端口連接。這在Linux上是絕對可行的iptables。儘管行爲更爲理想,但它需要在應用程序外部進行配置。
+0

這就是我的想法,但我想確保。謝謝。 – paleozogt

+0

有些人可能會從127.1.0.1連接,這仍然是本地始發的流量 – akostadinov

-3

僅僅因爲你的服務器是雙棧,你的本地主機應用程序真的需要嗎?你可以隨便挑一個嗎?