IP别名+TCP转发+端口映射实现跨网络访问

一、背景环境:

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]-IP别名+TCP转发+端口映射实现跨网络访问-百科资源

四、实现方法:

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

© 版权声明
THE END
喜欢就支持一下吧
点赞11赞赏 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容