实例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中的规则:
$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访问该端口等。