淘先锋技术网

首页 1 2 3 4 5 6 7

Linux(Ubuntu)如何用iptables实现端口映射

首先,必须开启linux的数据转发功能,具体开启步骤如下:

1 vi /etc/sysctl.conf

2 将net.ipv4.ip_forward=0更改为net.ipv4.ip_forward=1 ,并取消掉前面的注视符“#”

3 sysctl -p(这条命令是使数据转发功能生效)

现在就可以更改iptables了,使之实现nat映射功能:

例如:你要将外网访问本地IP(192.168.75.5)的80端口转换为访问192.168.75.3的8000端口,你可以用如下命令:

(1)iptables -t nat -A PREROUTING -d 192.168.75.5 -p tcp --dport 80 -j DNAT --to-destination 192.168.75.3:8000

(2)iptables -t nat -A POSTROUTING -d 192.168.75.3 -p tcp --dport 8000 -j SNAT 192.168.75.5 (我执行这句时有错误!!没有用到该部分)

我执行的语句只有: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 S[email protected]: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设置以便重启后生效,可以参考这里