开发者社区> 余二五> 正文

iptables 端口映射

简介:
+关注继续查看

保存iptables防火墙规则的方法如下:

解决方法:

iptables命令建立的规则临时保存在内存中。如果系统在永久保存这些规则之前重启,所有设置的规则都将丢失。如果要想使iptables设置的规则在下次重启系统之后仍然生效则需要永久保存这些规则,以root身份执行:

/sbin/service iptables save

该操作将执行iptables初始化脚本,该脚本会运行/sbin/iptables-save程序并更新当前的iptables配置文件/etc/sysconfig/iptables。

而原来的配置文件将保存为iptables.save。

下次系统系统启动时,iptables初始化脚本将使用/sbin/iptables-restore命令重新读取/etc/sysconfig/iptables文件的内容。

因此比较好的方法是在将一条新的iptables规则提交到/etc/sysconfig/iptables文件之前先检查该规则。并且也可以将其他版本系统中的iptables配置文件应用于这里。这样就有助于分发该配置文件到多台Linux主机上。

注意:如果把/etc/sysconfig/iptables文件进行分发之后,每台系统都要执行/sbin/service iptables restart命令来使规则生效

经过测试:/etc/rc.d/init.d/iptables save  也可以更新并保存/etc/sysconfig/iptables


iptables 端口映射 实现步骤如下:

一、环境和要实现功能

PC1的网络设置如下:

eth0 192.168.0.29 内网

eth1 219.239.11.22 外网

PC2的网络设置则为:192.168.0.21 内网

我们要实现的功能就是将PC1的8080端口映射到PC2的80端口,也即访问

http://219.239.11.22:8080

即可访问到PC2上的WEB服务。

  二、实现步骤

1、 首先应该做的是/etc/sysctl.conf配置文件的 net.ipv4.ip_forward = 1 默认是0

这样允许iptalbes FORWARD。

2、 在/etc/rc.d/init.d目录下有iptables 文件,使用格式如下

Usage: ./iptables {start|stop|restart|condrestart|status|panic|save}

相当与service iptables {….}

把iptables 服务停止,清除以前的规则,存盘

到/etc/rc.d/init.d目录下,运行

./iptables stop

iptalbes -F

iptalbes -X

iptalbes -Z

./iptables save

3、 重新配置规则

iptables -t nat -A PREROUTING -d 219.239.11.22 -p tcp -m tcp --dport 8080 -j DNAT --to-destination 192.168.0.21:80

iptables -t nat -A POSTROUTING -d 192.168.0.21 -p tcp -m tcp --dport 80 -j SNAT --to-source 192.168.0.29

iptables -A FORWARD -o eth0 -d 192.168.0.21 -p tcp –dport 80 -j ACCEPT

iptables -A FORWARD -i eth0 -s 192.168.0.21 -p tcp –sport 80 -j ACCEPT

DNAT SNAT 的请参考帮助,这里不再陈述。

4、 新的规则存盘

./iptables save

规则存盘后在/etc/sysconfig/iptables这个文件里面,若你对这个文件很熟悉

直接修改这里的内容也等于命令行方式输入规则。

5、 启动iptables 服务

./iptables start

在/proc/net/ip_conntrack文件里有包的流向,如下面

tcp 6 53 TIME_WAIT src=../../221.122.59.2 dst=219.239.11.22 sport=7958 dport=8080 packets=9 bytes=1753

src=../../172.18.10.205 dst=172.18.10.212 sport=80 dport=7958 packets=9 bytes=5777 [ASSURED] use=1


项目上线,有两台服务器,A在公网。linux rhel5.4,运行php开发的一个打折购物网:尚品折扣,数据库部署到内网中,每次导入数据都要ssh到公网,然后再转到内网。一次采集了一些服装品牌的数据,比如,艾格的服装资讯,优衣库的打折,朵以的产品介绍

下面是实现过程:

允许数据包转发:

#echo 1 > /proc/sys/net/ipv4/ip_forward   

转发TCP 8081到xx.xx.xx.xx:

#iptables -t nat -I PREROUTING -p tcp –dport 80 -j DNAT –to xx.xx.xx.xx   

使转发数据包实现“双向通路”,给数据包设置一个正确的返回通道:

#iptables -t nat -I POSTROUTING -p tcp –dport 8080 -j MASQUERADE   

表示将规则保存到/etc/sysconfig/iptables文件

#service iptables save   

重启iptables使刚才添加的规则生效

#service iptables restart   

如果执行上述命令,依然不能转发,可能由于iptables服务没有停止,命令无法写入iptables文件,应先执行service iptables stop,再执行上述命令,最后service iptables start再启动服务

由于Linux防火墙默认是关闭3306端口。因此,若要能够访问3306端口,可以用两种方式,一个是关闭防火墙,另一个就是让防火墙开放3306端口。

开放3306端口的解决步骤如下:

1、修改/etc/sysconfig/iptables文件,增加如下一行:

-A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 3306 -j ACCEPT

2、重启防火墙,这里有两种方式重启防火墙

a) 重启后生效

开启: chkconfig iptables on

关闭: chkconfig iptables off

b) 即时生效,重启后失效

开启: service iptables start

关闭: service iptables stop

数据库映射成功。


iptables 端口映射设置如下:

设我们有一台计算机,有两块网卡,

eth0连外网,ip为1.2.3.4;

eth1连内网,ip为192.168.0.1.

现在需要把发往地址1.2.3.4的81端口的ip包转发到ip地址192.168.0.2的8180端口,设置如下:

1. iptables -t nat -A PREROUTING -d 1.2.3.4 -p tcp -m tcp --dport 81 -j DNAT --to-destination192.168.0.2:8180

2. iptables -t nat -A POSTROUTING -s 192.168.0.0/255.255.0.0 -d 192.168.0.2 -p tcp -m tcp --dport 8180 -j SNAT --to-source 192.168.0.1

真实的传输过程如下所示:

假设某客户机的ip地址为6.7.8.9,它使用本机的1080端口连接1.2.3.4的81端口,发出的ip包源地址为6.7.8.9,源端口为1080,目的地址为1.2.3.4,目的端口为81.

主机1.2.3.4接收到这个包后,根据nat表的第一条规则,将该ip包的目的地址更该为192.168.0.2,目的端口更该为8180,同时在连接跟踪表中创建一个条目,(可从/proc/net/ip_conntrack文件中看到),然后发送到路由模块,通过查路由表,确定该ip包应发送到eth1接口.在向eth1接口发送该ip包之前,根据nat表的第二条规则,如果该ip包来自同一子网,则将该ip包的源地址更该为192.168.0.1,同时更新该连接跟踪表中的相应条目,然后送到eth1接口发出.

此时连接跟踪表中有一项:

连接进入: src=6.7.8.9 dst=1.2.3.4 sport=1080 dport=81

连接返回: src=192.168.0.2 dst=6.7.8.9 sport=8180 dport=1080

是否使用: use=1

而从192.168.0.2发回的ip包,源端口为8180,目的地址为6.7.8.9,目的端口为1080,主机1.2.3.4的TCP/IP栈接收到该ip包后,由核心查找连接跟踪表中的连接返回栏目中是否有同样源和目的地址和端口的匹配项,找到后,根据条目中的记录将ip包的源地址由192.168.0.2更该为1.2.3.4, 源端口由8180更该为81,保持目的端口号1080不变.这样服务器的返回包就可以正确的返回发起连接的客户机,通讯就这样开始.

还有一点, 在filter表中还应该允许从eth0连接192.168.0.2地址的8180端口:

iptables -A INPUT -d 192.168.0.2 -p tcp -m tcp --dport 8180 -i eth0 -j ACCEPT










本文转自 chengxuyonghu 51CTO博客,原文链接:http://blog.51cto.com/6226001001/1559797,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
linux下如何修改iptables开启80端口
linux下如何修改iptables开启80端口   最近在做本地服务器的环境,发现网站localhost能正常访问,用ip访问就访问不了,经常使用CentOS的朋友,可能会遇到和我一样的问题。开启了防火墙导致80端口无法访问,刚开始学习centos的朋友可以参考下。
1300 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
28477 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
20359 0
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
23546 0
+关注
20378
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载