[文章作者:张宴 本文版本:v1.0 最后修改:2007.08.21 转载请注明出处:http://blog.s135.com]

  我这两天在工作中遇到了一些问题,在今天下午全部解决,于是决定写一篇文章,将实现方法记录下来:

  一、背景环境:
  1、都是Linux服务器;
  2、“服务器A”与“服务器C”不在同一网络,两者之间是不通的;
  3、“服务器A”、“服务器C”分别与“服务器B”相通。

  二、要实现的需求:
  1、让“服务器A”上的PHP程序能够连接“服务器C”上的MySQL数据库(IP:10.10.1.4,端口:3306);
  2、不允许在“服务器A”上的PHP程序中更改MySQL地址(10.10.1.4)和MySQL端口(3306)。

  三、实现原理:
  理论上从“服务器A”是无法直接连接“服务器C”的IP地址(10.10.1.4)及其3306端口的【图中的虚线】,但通过“IP别名+TCP转发+端口映射”,我在“服务器A”上的PHP程序无须作任何修改的情况下实现了这项功能【图中的实线】。
  访问路线:“服务器A”上的PHP程序─→虚拟10.10.1.4:3306─→192.168.1.3:8520─→真实10.10.1.4:3306

  点击在新窗口中浏览此图片

  四、实现方法:
  1、修改“服务器A”上的Apache配置文件httpd.conf(以下仅列出要修改的部分,其余部分用......表示):
引用
................
Listen 192.168.1.2:80
................
NameVirtualHost 192.168.1.2:80
<VirtualHost 192.168.1.2:80>
................

  然后重启Apache:
  /usr/local/apache/bin/httpd -k restart

  2、在“服务器A”上创建本地回环设备lo(即127.0.0.1)的IP别名10.10.1.4,即虚拟IP:
  『图中的①』
  /sbin/ifconfig lo:0 10.10.1.4 broadcast 10.10.1.4 netmask 255.255.255.255 up
  /sbin/route add -host 10.10.1.4 dev lo:0


  3、在“服务器A”上编译安装TCP转发软件rinetd(官方网站:http://www.boutell.com/rinetd/),将对10.10.1.4:80的TCP请求重定向到192.168.1.3:8520上:
  『图中的②』
  wget http://www.boutell.com/rinetd/http/rinetd.tar.gz
  tar zxvf rinetd.tar.gz
  cd rinetd
  make && make install
  vi /etc/rinetd.conf

  输入以下内容(格式:源地址 源端口 目标地址 目标端口):
引用
10.10.1.4 80 192.168.1.3 8520

  启动rinetd守护进程
  /usr/sbin/rinetd -c /etc/rinetd.conf

  4、在“服务器B”上利用iptables配置端口映射,将自身的8520端口映射到10.10.1.4的3306端口上:
  『图中的③』
  echo "1"> /proc/sys/net/ipv4/ip_forward
  /sbin/iptables -t nat -A PREROUTING -p tcp -s 192.168.1.0/24 -d
192.168.1.3 --dport 8520 -j DNAT --to-destination 10.10.1.4:3306
  /sbin/iptables -t nat -A POSTROUTING -p tcp -s 192.168.1.0/24 -d 10.10.1.4 --dport 3306 -j SNAT --to-source 10.10.1.3

  为了防止服务器重启导致TCP转发失效,请:
  vi /etc/rc.local
  增加一行:
引用
echo "1"> /proc/sys/net/ipv4/ip_forward


  或者:
  vi /etc/sysctl.conf
  增加一行:
引用
net.ipv4.ip_forward = 1

  /sbin/sysctl -p


Tags: , ,
技术大类 » 其他Unix技术 | 评论(3) | 引用(0) | 阅读(13361)
xiaobao
2007-8-28 22:54
如果是比较大的并发访问,这种方法应该会影响到程序执行时间的吧
秋水晓寒 Email
2007-9-12 14:29
你还不如直接说:A通过B去映射C
redeyes Email Homepage
2008-6-3 14:49
rnatd + iptables 哎,为什么不用 ssh tcp forward 呢?
嘿嘿,我知道sina的 sshd 都禁止了ssh 转发。。
分页: 1/1 第一页 1 最后页
发表评论
表情
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
打开HTML
打开UBB
打开表情
隐藏
记住我
昵称   密码   游客无需密码
网址   电邮   [注册]