使用虚拟机实践iptables的nat功能配置

8月 31, 2014 |

环境配置如下:

iptables目标:希望在外机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://serverfault.com/questions/268864/cannot-access-lan-virtual-ip-from-wan-using-iptables-nat?rq=1

http://www.revsys.com/writings/quicktips/nat.html

Posted in: Linux | Tags: , , ,

Comments are closed.