登录 |  注册 |  繁體中文


细说Linux iptables防火墙--实例 地址转发(5)

分类: 服务器相关 颜色:橙色 默认  字号: 阅读(845) | 评论(0)

实例1

应用场景:

假设有A、B、C三台设备,A<==>B可以互相访问,B<==>C可以互相访问,A和C不能直接访问,在C上安装了Oracle数据库,如何实现A可以访问C的数据库呢?

基本思路:

第一反应是在B上搭建个代理,A配置访问代理后,可以通过B跳转访问C,但是平时连接Oracle用的客户端是PLSQL,从我抓包的情况看,PLSQL和数据库通信通过tcp和tns两个协议,tcp协议的代理好解决,而tns协议的代理就不是那么简单实现了。既然这条路不通,只能换一角度寻找解决办法,那就是iptables地址转发,

 

具体环境:

  • A(192.168.8.2)、window 
  • B(192.168.8.3)、linux CentOS 5.5
  • C(192.168.8.4 )、linux Redhat AS4、Oracle(SID:ora9i、端口:1521)

操作步骤:

1. B(192.168.8.3)允许IP包转发,修改配置文件/etc/sysctl.conf 中 net.ipv4.ip_forward = 1 (1:允许转发,默认:0)

2. B(192.168.8.3)修改iptables中的规则:

shell脚本
	$iptables -t nat -A PREROUTING -p tcp -m tcp --dport 1521 -j DNAT --to-destination 192.168.8.4:1521	
	$iptables -t nat -A POSTROUTING -p tcp -m tcp --dport 1521 -j SNAT --to-source 192.168.8.3
	这语句是告诉系统把即将要流出本机的数据的source ip address修改成为192.168.8.3。这样,数据包在达到目的机器以后,目的机器会将包返回到192.168.8.3也就是本机

	$service iptables save
	$service iptables restart

 

--------------------------------------------------------------------------------------------------------------------------

--------------------------------------------------------------------------------------------------------------------------

--------------------------------------------------------------------------------------------------------------------------

实例2

需求概述

假设我们有两台Linux服务器,分别是Server A跟Server B,它们在统一内网中,其中A有公网ip,而B没有:

  • Server A: 内网192.168.0.1,公网123.123.123.123
  • Server B: 内网192.168.0.2,公网IP无,端口6543为Redis服务端口

生产环境中,Server A提供外网服务,同时通过192.168.0.2:6543内部直接访问Redis服务。

那么问题是,我们本地测试无法直接连接192.168.0.2:6543,这时候,只能通过端口转发,通过连接Server A的公网IP来访问Redis服务,假设我们的转发端口是3456,那么我们希望的Redis连接地址应该是123.123.123.123:3456

这里就需要做一个将123.123.123.123:3456转发到192.168.0.2:6543的配置

开始设置 开启Linux转发功能

首先需要开启Linux内核的转发功能,编辑/etc/sysctl.conf,添加:

net.ipv4.ip_forward=1

保存退出后,执行以下命令使修改生效

sysctl -p

完成后查看/proc/sys/net/ipv4/ip_forward的内容,如果是1表示设置成功生效。

添加iptables转发规则

开始添加转发规则到iptables规则表中,首先将Server A公网中3456的请求转发到Server B的6543端口,即123.123.123.123:3456=>192.168.0.3:6543,执行:

iptables -t nat -A PREROUTING -p tcp --dport 3456 -j DNAT --to-destination 192.168.0.2:6543

接着还需要为转发请求指明请求来源

iptables -t nat -A POSTROUTING -p tcp -d 192.168.0.2 -j SNAT --to-source 192.168.0.1

这里其实偷懒漏没有写端口,意思是所有转发到Server B的请求都是来源于Server A,如果需要指定只有转发到Server B的6543端口的请求的来源才是Server A,那么需要改为:

iptables -t nat -A POSTROUTING -p tcp -d 192.168.0.2 --dport 6543 -j SNAT --to-source 192.168.0.1

如果转的ip是变化的,也可以使用以下命令

iptables -t nat -A POSTROUTING -p tcp --dport 6543 -j MASQUERADE

『 MASQUERADE 』!这个设定值就是『IP伪装成为封包出去(-o)的那块装置上的IP』!不管现在eth0的出口获得了怎样的动态ip,MASQUERADE会自动读取eth0现在的ip地址然后做SNAT出去,这样就实现了很好的动态SNAT地址转换。

结束

值得注意的是,这样相当于对外网公开了本来处于内网中的服务,因带来了安全隐患,建议对这方面的安全问题也做一些处理,例如限制指定IP访问该端口等。




姓 名: *
邮 箱:
内 容: *
验证码: 点击刷新 *   

回到顶部