如上圖同樣,服務器對外只開放了一個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
根據維基百科上針對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設置無需改變,按照第一步的命令便可。
測試訪問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