iptables实现端口映射

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iptables实现端口映射相关的知识,希望对你有一定的参考价值。

参考技术A 有主机A,eth0的IP为内网IP:192.168.56.101,eth1为公网IP:120.77.36.222。
有主机B,eth0的IP为内网IP:192.168.56.102。

可以通过外网访问主机A,主机B和主机A在同一个局域网。

想要访问外网访问主机B的Web服务,怎么办?答:使用端口映射。

sudo echo 1 > /proc/sys/net/ipv4/ip_forward
如果报错:-bash: /proc/sys/net/ipv4/ip_forward: Permission denied
那就切换到root用户:
sudo -i
echo 1 > /proc/sys/net/ipv4/ip_forward

要想永久有效,还要把/etc/sysctl.conf文件里边的net.ipv4.ip_forward的值改为1。

参考 linux下用用iptables做端口映射的shell 和 Ubuntu 14.04 端口映射 ,具体配置如下:

1、新建portmap.sh,内容如下:

2、添加执行权限
sudo chmod a+x portmap.sh

3、执行脚本
sudo ./portmap.sh

4、测试访问
curl 192.168.56.102 ,正常。
curl 192.168.56.101:3480 ,报错curl: (7) Failed to connect to 192.168.56.103 port 3480: Connection refused。
啊嘞,没有配置成功吗?莫非时因为端口没有打开?测试下3480端口:
telnet 192.168.56.101 3480 ,报错telnet: Unable to connect to remote host: Connection refused。
打开端口试试?
sudo iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 3480 -j ACCEPT
然而,并没有什么用!

直接用浏览器访问 http://192.168.56.101:3480 ,访问正常。。。心中万马奔腾。。。curl有坑啊!

直接用浏览器访问 http://120.77.36.222:3480 ,访问正常。

5、如果不需要端口映射了,可以删除添加的规则
sudo iptables -t nat -vnL PREROUTING --line-number

sudo iptables -t nat -nL --line-number

sudo iptables -t nat -D PREROUTING 1

sudo iptables -t nat -D POSTROUTING 1

6、设置重启后依然有效
参考 《Linux配置SNAT上网》 。

有主机A,eth0的IP为内网IP:192.168.56.101,eth1为公网IP:120.77.36.222。

访问 http://192.168.56.101 正常,访问 http://120.77.36.222 失败。这是因为,电信会封锁80端口和8080端口。为了使外网也可以访问80端口的服务,可以把10180端口映射为80端口。

sudo iptables -t nat -A PREROUTING -p tcp --dport 10180 -j REDIRECT --to-ports 80

然后,就可以通过 http://120.77.36.222:10180 来访问80端口的服务。

以上是关于iptables实现端口映射的主要内容,如果未能解决你的问题,请参考以下文章

iptables实现端口映射

kvm虚拟机端口映射

iptables 允许端口,端口映射,删除iptables

创建容器后手动映射端口

LINUX服务器的端口映射

使用iptables配置端口映射方法