Linux(Ubuntu)如何用iptables實現端口映射java
首先,必須開啓linux的數據轉發功能,具體開啓步驟以下:linux
1 vi /etc/sysctl.confweb
2 將net.ipv4.ip_forward=0更改成net.ipv4.ip_forward=1 ,並取消掉前面的注視符「#」ubuntu
3 sysctl -p(這條命令是使數據轉發功能生效)app
如今就能夠更改iptables了,使之實現nat映射功能:eclipse
例如:你要將外網訪問本地IP(192.168.75.5)的80端口轉換爲訪問192.168.75.3的8000端口,你能夠用以下命令:maven
(1)iptables -t nat -A PREROUTING -d 192.168.75.5 -p tcp --dport 80 -j DNAT --to-destination 192.168.75.3:8000tcp
(2)iptables -t nat -A POSTROUTING -d 192.168.75.3 -p tcp --dport 8000 -j SNAT 192.168.75.5 (我執行這句時有錯誤!!沒有用到該部分).net
我執行的語句只有:sudo iptables -t nat -A PREROUTING -d *.*.*.* -p tcp --dport 80 -j DNAT --to-destination *.*.*.*:9000插件
由於,我是要將80端口轉發到9000端口,由於80端口被電信封掉了,外部沒法訪問,所以就使用9000端口。這樣經過域名就能夠直接訪問內部9000端口提供的WEB服務了。
可使用命令:iptables -t nat --list檢查nat列表信息:
結果以下圖所示
Nat列表信息刪除:
iptables -t nat -D PREROUTING 1 //序號從1 開始,後邊以此+1.
由於要在本地跑一個web application,使用eclipse的HSF Jetty插件綁定80端口不成功,8080端口則沒有問題:
2012-09-17 11:36:43.470:WARN::failed SelectChannelConnector@0.0.0.0:80: java.net.SocketException: 權限不夠
2012-09-17 11:36:43.473:WARN::failed Server@327ac9a7: java.net.SocketException: 權限不夠
java.net.SocketException: 權限不夠
1. 猜測有其餘進程已經佔用了80端口
$ sudo netstat -anpt | grep LISTEN
結果80端口是available的
2. Linux的問題?
好吧,想起來了,Linux下只有root用戶才能綁定使用1024如下的端口。嘗試用sudo eclipse啓動IDE,而後編譯,發現maven的本地庫有些問題,偷個懶把原用戶的本地庫複製一份後正常
$cd /home/ningoo/.m2 $cp -r * /root/.m2
3. iptables神器
雖然sudo大法有效,感受仍是不太爽。因而神器iptables出場,設置將80端口轉發到8080端口,這樣eclipse中的jetty插件仍是能夠綁定在8080端口,/etc/hosts綁定本地到平常的域名也能夠經過80端口自動轉發,方便。
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080 iptables -t nat -A OUTPUT -p tcp -d 127.0.0.1 --dport 80 -j REDIRECT --to-ports 8080
若是不須要轉發了,經過如下命令清除設置
iptables -t nat -F PREROUTING iptables -t nat -F OUTPUT
若是要保存iptables設置以便重啓後生效,能夠參考這裏