爲何不能將客戶端的鏈接請求跳轉或轉發到本機lo迴環接口上?

1、爲何不能將本機的請求跳轉/轉發到迴環接口上?

  如上圖同樣,服務器對外只開放了一個80端口,可是web服務監聽在了lo 接口上8080端口上,如今要實現外網經過訪問服務器的80端口,來提供web服務。(有人可能會說這樣作沒有意義啊!你直接把web服務的監聽ip和端口改爲外網ip和80端口上就得了)。有意義無心義,我也不清楚,只是想從技術上考慮可否實現?
像日常同樣,作個DNAT轉發,將訪問 192.168.30.177(公網)端口80的請求轉發/跳轉到 127.0.0.1的8080 端口上。使用下面兩條命令就行:html

# iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 127.0.0.1:8080
# iptables -I INPUT 5 -p tcp --dport 80 -j ACCEPT

檢查服務監聽地址:linux

# netstat -ulntp|grep :8080
tcp        0      0 127.0.0.1:8080              0.0.0.0:*                   LISTEN      3667/nginx 

可是在測試80端口鏈接時,出現了鏈接失敗的提示,以下圖:
nginx

正常我以爲是能夠通的啊,畢竟用dnat轉發到其它主機時是沒有問題的。並且我用了REDIRECT 動做,也是不行。web

2、算不上分析的分析(其實就是查資料😅)

  根據維基百科上針對Loopback獲得相關loopback 接口的定義:在同一臺機器上執行時的網絡應用程序能夠進行通訊。它徹底在操做系統的網絡軟件中實現,而且不將任何數據包傳遞給任何網絡接口控制器計算機程序發送到環回IP地址的任何流量都將被簡單地當即傳回網絡軟件堆棧,就像從另外一個設備接收到的同樣。安全

  另外,源地址或目標地址設置爲環回地址的任何IP 數據報都不得出如今計算機系統以外(通俗就是說網絡上不容許出現源或目的爲127.0.0.1的包),也不得由任何路由設備進行路由。必須刪除在網絡接口上收到具備環回目的地址的報文。這樣的分組有時被稱爲火星分組。與其餘虛假數據包同樣,它們多是惡意的,能夠經過應用bogon過濾來避免任何可能致使的問題。服務器

看過定義以後才知道原來這個包文是直接被刪除了。根據這個帖子所說,能夠修改內核的參數,將eth0(即本例中的外網卡)設置爲不刪除環回目的地址的報文。網絡

默認是禁止的。內核參數以下:tcp

route_localnet - BOOLEAN
    Do not consider loopback addresses as martian source or destination
    while routing. This enables the use of 127/8 for local routing purposes.
    default FALSE

備註:大體意思是不要未來自或發送到 環回接口上的數據包視爲火星報文(這裏稱這個包爲火星報文),既不丟棄它,啓用用於127.0.0.1的本地路由。ide

飛走不可oop

使用如下命令(針對eth0)進行修改該內核參數的值爲TRUE:

# sysctl -w net.ipv4.conf.eth0.route_localnet=1
net.ipv4.conf.eth0.route_localnet = 1

永久保存該設置

# echo "net.ipv4.conf.eth0.route_localnet=1" >> /etc/sysctl.conf
# sysctl -p

防火牆的nat設置無需改變,按照第一步的命令便可。

3、驗證以上的配置

測試訪問80端口:

按照預期同樣,能夠成功訪問。原本在訪問期間,是想用tcpdump 抓lo接口上的包來看看的。結果很失望,沒抓到。。。。不太清楚爲何,難道是tcpdump在nat表的後面麼?抓不到PREROUTING的包?

不過,另闢蹊徑,用了iptables 自帶的計數器,查看到了當訪問站點時,確實通過了nat表的PREROUTING鏈,以下圖:

 

總結下:

  系統上的lo 環回接口爲了防止攻擊(火星報文),因此內核默認禁止了全部網卡的路由本地網絡功能,即丟棄源或目標爲127.0.0.1的數據包。但在有些時候能夠在不重啓或改變應用程序配置的時候,咱們能夠開啓該功能即 route_localnet,來訪問監聽在127.0.0.1上的端口。如kvm 虛擬機默認的vnc端口設置。另外爲了安全考慮,在設置DNAT規則時,能夠限定訪問來源。

  小擴展:若是隻是本機內的端口跳轉可使用 -j REDIRECT --to-ports port-number. 

 

 

該文屬於原創,若有轉載,請備註原文連接:飛走不可(會不按期修改文章)謝謝。其中有些內容來源於互聯網,並已在最下方標註參考連接,

 

 

參考連接:

https://unix.stackexchange.com/questions/111433/iptables-redirect-outside-requests-to-127-0-0-1

https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt

http://linux-ip.net/html/nat-dnat.html

http://blog.csdn.net/dog250/article/details/7664055

https://en.wikipedia.org/wiki/Loopback

https://www.howtogeek.com/126304/why-is-the-localhost-ip-127.0.0.1/

http://www.tech-faq.com/127-0-0-1.html

相關文章
相關標籤/搜索