环境配置如下:
目标:希望在外机A上使用192.168.182.132地址访问虚拟机C的MySQL数据库,就如同MySQL数据库直接安装在虚拟机B上的一样。
1、先在虚拟机C上创建用户’root’@’192.168.110.%’。
Create user ’root’@’192.168.110.%’ identified with mysql_native_password; Change password for ’root’@’192.168.110.%’=PASSWORD(‘123456’); GRANT ALL PRIVILEGES ON *.* to ’root’@’192.168.110.%’ with options; Flush privileges;
2、测试数据库账号是否正确配置
登录虚拟B:执行mysql –h 192.168.110.4 –uroot –p
测试是否能远程访问虚拟机C上的MySQL数据库,如果yes,请继续。如果no,可以尝试以下的检查:
1)B能否ping通C。
2)C的iptalbes是否允许3306端口通过。
3)C的selinux是否开启,如果开启请将其关闭。
3、配置虚拟机B的iptables。
注意:如果你是远程登录虚拟机B,请确认ssh使用的22端口总是可用的,如果你仅仅是想实践一下NAT的配置,那么可以将各个chain的默认policy都设置为ACCEPT.
1) 检查iptable_nat模块是否加载了,lsmod |grep iptable_nat。如果没有,执行modprobe iptable_nat。
2) 启用IP地址的FORWARD功能。
echo 1 > /proc/sys/net/ipv4/ip_forward
3) 配置iptables。
可以手动编辑/etc/sysconfig/iptables文件或者使用iptables命令。本示例使用iptables命令,为了在配错后快速的修改,所以我讲这些命令写入脚本(myiptables.sh)文件:
#!/bin/bash iptables -F iptables -A INPUT -p tcp --dport 22 -j ACCEPT iptables -A INPUT -i lo -j ACCEPT iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -P INPUT ACCEPT iptables -P FORWARD ACCEPT iptables -P OUTPUT ACCEPT ## manipulate nat iptables -t nat -F iptables -t nat -A PREROUTING -m tcp -p tcp --dport 3306 -j DNAT --to 192.168.110.4:3306 iptables -t nat -A POSTROUTING -o eth3 -j MASQUERADE iptables -t nat -P PREROUTING ACCEPT iptables -t nat -P OUTPUT ACCEPT iptables -t nat -P POSTROUTING ACCEPT service iptables save service iptables restart;
为了简单,我将每个table (filter,nat)的各个chain的默认策略(policy)都设置为ACCEPT,防止数据包被莫名地丢弃。’ iptables -P’ 就是设置默认策略(policy)的,’ iptables -t nat -F’清除对应table的原有规则。最重要的两个配置为:
I): iptables -t nat -A PREROUTING -m tcp -p tcp --dport 3306 -j DNAT --to 192.168.110.4:3306
。在nat 表的PREROUTING链中添加一个规则,将协议为tcp且端口为3306报文的目的ip改为192.168.110.4,端口改为3306。注意‘192.168.110.4’是C的IP。
II) iptables -t nat -A POSTROUTING -o eth3 -j MASQUERADE
所有从eth3发送出去的报文的源IP改为本机IP(192.168.110.2)。
4、测试:
在A上输入‘mysql –h192.168.182.132 –uroot -p
’,如果能正常操作,那么恭喜你,配置正确,如果不正确,请反复检查上面的步骤。
后续工作:发现iptables可以使用LOG模块来诊断报文的转换过程,但是POSTROUTING一旦匹配了某个规则,该报文就移出了iptables的处理流程了,目前没找到方法来跟踪POSTROUTING改变后的报文的源地址和目的地址。如果有知道的请让我知道。
感谢serverfault.com上的热心人:求助地址为:
http://serverfault.com/questions/625269/use-iptabless-nat-to-proxy-mysql
参考文档:
http://www.netfilter.org/documentation/HOWTO//NAT-HOWTO.html
http://wiki.centos.org/HowTos/Network/IPTables
http://www.centos.org/docs/5/html/Deployment_Guide-en-US/ch-iptables.html
http://www.revsys.com/writings/quicktips/nat.html
Posted in: Linux | Tags: DNAT, iptables, MASQUERADE, NAT
Comments are closed.