1. 程式人生 > >用iptables 實現本地埠轉發

用iptables 實現本地埠轉發

場景

假如你在用 resin 除錯一個 Web 程式,需要頻繁地重啟 resin。這個 Web 程式需要開在 80 埠上,而 Linux 限制 1024 以下的埠必須有 root 許可權才能開啟。但是你又不願意在調程式的時候總是開著一個 root 終端。在這種情況下,你可以把 resin 開在預設的 8080 埠上,然後使用 iptables 來實現和真的把服務開在 80 埠上一樣的效果。

方法

將與 80 埠的 TCP 連線轉接到本地的 8080 埠上。使用 DNAT (Destination Network Address Translation) 技術可以滿足這一要求。因為 iptables 在處理本地連線和遠端連線的方法不同,所以需要分開處理。下面假設本機的 IP 是 192.168.4.177

遠端連線

遠端連線指的是由另外一臺機器連線到這臺機器上。這種連線的資料包在 iptables 會首先經過 PREROUTING 鏈,所以只需在 PREROUTING 鏈中作 DNAT。# iptables -t nat -A PREROUTING -p tcp -i eth0 -d 192.168.4.177 --dport 80 -j DNAT --to 192.168.4.177:8080

本地連線

本地連線指的是在本機上,用 127.0.0.1 或者本機 IP 來訪問本機的埠。本地連線的資料包不會通過網絡卡,而是由核心處理後直接發給本地程序。這種資料包在 iptables 中只經過 OUTPUT 鏈,而不會經過 PREROUTING 鏈。所以需要在 OUTPUT 鏈中進行 DNAT。除了對 127.0.0.1

 之外,對本機 IP (即 192.168.4.177) 的訪問也屬於本地連線。# iptables -t nat -A OUTPUT -p tcp -d 127.0.0.1 --dport 80 -j DNAT --to 127.0.0.1:8080 # iptables -t nat -A OUTPUT -p tcp -d 192.168.4.177 --dport 80 -j DNAT --to 127.0.0.1:8080

注意事項

你也許需要通過以下命令開啟 IP 轉發:# echo 1 > /proc/sys/net/ipv4/ip_forward 在進行試驗時,如果要重新設定 iptables,需要首先清空 nat 表:# iptables -F -t nat