[文章作者:張宴 本文版本: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