此篇轉自: 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
,添加:
net.ipv4.ip_forward=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
,執行:
iptables -t nat -A PREROUTING -p tcp --dport 3456 -j DNAT --to-destination 192.168.0.2:6543
接着還需要為轉發請求指明請求來源
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,那么需要改為:
iptables -t nat -A POSTROUTING -p tcp -d 192.168.0.2 --dport 6543 -j SNAT --to-source 192.168.0.1
保存設置並重啟服務
最后保存路由規則並重啟iptables服務,使得上面的配置生效
service iptables save
service iptables restart
結束
這樣就完成了內網服務轉發到公網IP的設置。iptables的功能十分強大,這里只是其中的一個非常簡單的部分,如果有時間可以閱讀這篇文章詳細了解。
值得注意的是,這樣相當於對外網公開了本來處於內網中的服務,因帶來了安全隱患,建議對這方面的安全問題也做一些處理,例如限制指定IP訪問該端口等。