本着“干中学”的精神,看完资料,还是用VMWare来练习一下使用NAT,好加深认识。
实验涉及:NAT,iptables,
实验目标
这次我要用iptables实现NAT功能(SNAT和DNAT)。
先上拓扑图(可能有点不规范):
如图分别有4台机子:A、B在内网,但在不同的网段中,C做网关,控制网段间的访问。D在外网。
要达到:
A、B能通信(内网不同网段的互访)
A、B能通过C与外网通信
D能通过C访问到A、B的服务
环境
用VMWare虚拟出这4台机子,VMWare的版本为8.0
每台机子都跑CentOS 6.0
VMWare环境配置
安装4个虚拟机,都装上CentOS,主机名分别定为hostA、hostB、hostC、hostD,对应A、B、C、D。
VMWare新建几张网卡(菜单栏【edit】-【Virtual Network Editor】),要求一张为Bridged(NAT应该也行),两张为Host-only。
设置A、B网卡分别为VMnet1和VMnet2,这是为了使它们原始都不能互访。
外网的D网卡设为VMnet0
C则有三张网卡VMnet0、VMnet1、VMnet2,这样C原始都能访问到A、B、D。
然后进入每个虚拟机,为了方便,我都设置为静态ip(网段跟上图对应):
A:192.168.149.128
B:192.168.214.128
C:192.168.4.233(eth0),192.168.149.130(eth1),192.168.214.130(eth2)
D:192.168.4.234
CentOS里面配置网卡方法就是修改/etc/sysconfig/network-scripts/ifcfg-eth*,没有则自己创建一个。
关键项就是ONBOOT,IPADDR,NETMASK,GATEWAY,DNS1,DNS2,PEERDNS
要注意的是,有PEERDNS项,当它值为yes,则会把DNS1和DNS2覆盖地写入/etc/resolv.conf。
这对于多网卡的C,如果ifcfg-eth0、ifcfg-eth1、ifcfg-eth2都设了PEERDNS,由于开机是按名字的顺序执行,则会把ifcfg-eth2的DNS写入/etc/resolv.conf,前两个文件的DNS会无效了的。所以我只在ifcfg-eth0配置PEERDNS=“yes“。
好,初步网络环境配置完成。
现在情况是:
ABD都不能互访,因为在不同的网段
C则都能跟它们三个互访
配置网关C的iptables,实现NAT
到关键也是好玩的地方了。
接下来配置网关C的iptables,实现不同网络间地址的转换(NAT)。
iptables内容比较多,详细可以参考:http://www.frozentux.net/iptables-tutorial/cn/iptables-tutorial-cn-1.1.19.html
1.A、B通过C实现通信
这个比较简单,没用到iptables,把A的网关设为C的对应网卡的ip(192.168.149.130),B的网关设为C对应网卡的ip(192.168.214.130)。
然后打开C的ip转发,在C中执行:
$ echo 1 > /proc/sys/net/ipv4/ip_forward
这就把C作为了A、B的网关。A、B间通信的数据包会发到C,靠C的网卡间转发来完成通信。AB就可以相互ping通了。
2.A、B通过C与外网通信(SNAT)
现在A、B都不能跟D通信,因为现在A、B发到D的数据包源地址(192.168.149.128,192.168.214.128),D是无法知道的(D在C的同一个网络,网关设为相同的ip)。则包可以发到D,但D回复不了,因为它的网关不知道A、B。
现在就通过SNAT把A、B发送的包在经过C时,把源地址改为C的外网ip(192.168.4.233),这个D是知道的,也就可以顺利回复了。
具体在C中执行:
$ iptables –t nat –A POSTROUTING –o eth0 –j SNAT --to-source 192.168.4.233
这样A、B就能ping通了。
SNAT可以看看我的博文。 嘻嘻……
3.D通过C访问A、B的服务(DNAT)
现在A、B可以跟D通信,但D不能主动访问A、B。还是因为D只知道C,不知道A、B。
假如现在A开了19991口的sshd:
在A的/etc/ssh/sshd_config中添加:
ListenAddress 0.0.0.0:19991
重启sshd
$ service sshd restart
在A中让iptables允许对19991口的访问
$ iptables –I INPUT -p tcp --dport 19991 -j ACCEPT
现在D想ssh到A的19991,则可以在C中执行以下命令,实现DNAT:
$ iptables -t nat -A PREROUTING -p tcp --dport 19991 -j DNAT --to-destination 192.168.149.128
现在D可以通过ssh到C的19991口来ssh到A了。
小结
整个实验搞完,对iptables,NAT的原理还是深刻了不少。
然后,就是VMWare是个好东西。