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设置以便重启后生效,可以参考这里
原文链接:https://blog.csdn.net/weixin_34191845/article/details/92114869