Linux使用iptables端口轉發 實現內外網的端口映射


此篇轉自: http://hi.ktsee.com/635.html

原文很棒,之所以轉過來當輪子是因為想改成自己看的習慣的方式,方便以后查看.

其實很在之前已經寫了一篇關於內網轉發服務的文章,只是那次是使用shell反向主動連接,保持轉發。這次因為有了一個新的需求,有兩台服務器,其中一台有公網ip,另一台沒有公網ip,只提供redis服務,供前面那台服務器內網訪問,而現在有時候需要通過公網直接訪問內網服務器上的redis服務測試用,這時候更好的解決辦法是端口轉發,即將公網ip的服務器轉發到內網,實現直接訪問內網服務器上的服務。

這個有點相當於路由器設置頁面里的NAT端口轉發,只是這里是用iptables命令來實現,因此做一下記錄,也為有和我同樣需求的同學提供一些參考。

需求概述

假設我們有兩台Linux服務器,分別是Server A跟Server B,它們在統一內網中,其中A有公網ip,而B沒有:

  • Server A: 內網192.168.0.1,公網123.123.123.123
  • Server B: 內網192.168.0.2,公網IP無,端口6543為Redis服務端口

生產環境中,Server A提供外網服務,同時通過192.168.0.2:6543內部直接訪問Redis服務。

那么問題是,我們本地測試無法直接連接192.168.0.2:6543,這時候,只能通過端口轉發,通過連接Server A的公網IP來訪問Redis服務,假設我們的轉發端口是3456,那么我們希望的Redis連接地址應該是123.123.123.123:3456

這里就需要做一個將123.123.123.123:3456轉發到192.168.0.2:6543的配置

開始設置

開啟Linux轉發功能

首先需要開啟Linux內核的轉發功能,編輯/etc/sysctl.conf,添加:

  1. net.ipv4.ip_forward=1

保存退出后,執行以下命令使修改生效

  1. sysctl -p

完成后查看/proc/sys/net/ipv4/ip_forward的內容,如果是1表示設置成功生效。

添加iptables轉發規則

開始添加轉發規則到iptables規則表中,首先將Server A公網中3456的請求轉發到Server B的6543端口,即123.123.123.123:3456=>192.168.0.2:6543,執行:

  1. iptables -t nat -A PREROUTING -p tcp --dport 3456 -j DNAT --to-destination 192.168.0.2:6543

接着還需要為轉發請求指明請求來源

  1. iptables -t nat -A POSTROUTING -p tcp -d 192.168.0.2 -j SNAT --to-source 192.168.0.1

這里其實偷懶漏沒有寫端口,意思是所有轉發到Server B的請求都是來源於Server A,如果需要指定只有轉發到Server B的6543端口的請求的來源才是Server A,那么需要改為:

  1. iptables -t nat -A POSTROUTING -p tcp -d 192.168.0.2 --dport 6543 -j SNAT --to-source 192.168.0.1

保存設置並重啟服務

最后保存路由規則並重啟iptables服務,使得上面的配置生效

  1. service iptables save
  2. service iptables restart

結束

這樣就完成了內網服務轉發到公網IP的設置。iptables的功能十分強大,這里只是其中的一個非常簡單的部分,如果有時間可以閱讀這篇文章詳細了解。

值得注意的是,這樣相當於對外網公開了本來處於內網中的服務,因帶來了安全隱患,建議對這方面的安全問題也做一些處理,例如限制指定IP訪問該端口等。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM