NAT:Network Address Transfer,网络地址转换,将其中一块网卡所连接网络中主机的地址转换为另外一个网络中主机的地址。路由也可以实现将一个网络中的报文转换到另一个网络中去
应用场景为:
SNAT:源地址转换,转换IP报文中的源IP地址
DNAT:目标地址转换,转换IP报文中的目标IP地址
下面介绍一下通过路由来实现各主机之间如何实现报文转发的
clip_p_w_picpath002
 
实例剖析:
准备三台虚拟机,其中一台主机假设为C主机(路由),有两块网卡,第一块网卡设置为桥接,第二块设置为host-only
其中一台主机假设为A主机,网卡设置为桥接,另一台主机假设为B主机,网卡设置为host-only
C主机两块网卡的IP分别为:172.16.50.10;192.168.10.1
B主机IP为:172.16.50.5 网关:172.16.50.10
A主机IP为:192.168.10.2 网关:192.168.10.1
1、首先在B主机上能ping通自己的网关192.168.10.1
clip_p_w_picpath004
2、打开C主机的数据转发功能(修改配置文件,可以永久有效)
[root@localhost ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
[root@localhost ~]# sysctl -p 直接生效
现在A主机可以ping通B主机
clip_p_w_picpath006
B主机可以ping通A主机
clip_p_w_picpath008
3、此时我们可以发现即使没用到地址转换也可以实现数据转发,下面我们用图来分析一下
clip_p_w_picpath010
4、源地址转换SNAT--》(应该在路由之后实现,也即是上图上进入2号端口之前)如果A主机不通过路由就可以和B主机通信,该如何实现
可以通过抓包来验证源Ip(用A主机pingB主机)
# tcpdump -i eth0 -nn -X icmp
clip_p_w_picpath012
因为没有做地址转换,由A主机出发又返回给了A
需要在C主机上配置NAT条目,实现源地址转换(SNAT)
# iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT --to-source 172.16.50.10
clip_p_w_picpath014
用A主机pingB主机,查看源地址(会发现源地址是50.10)
clip_p_w_picpath016
此时会发现B主机即使没有设置网关也能与A主机通信
删除B主机的网关
clip_p_w_picpath018
用B主机pingA主机,并在B主机上抓包
clip_p_w_picpath020
这就是源地址转换(注意此时B主机是不能pingA主机的,因为他没有网关,只能发不能收)
5、对于C主机而言,如果他不允许A主机pingB主机,但可以进行其他通信
添加模块:切记
# vim /etc/sysconfig/iptables-config
IPTABLES_MODULES="ip_nat_ftp ip_conntrack_ftp"
在C主机上添加如下规则
# iptables -P FORWARD DROP(先添加FORWARD默认规则为DROP)
# iptables -A FORWARD -m state --state ESTABLISHED -j ACCEPT(放行已建立的链接)
# iptables -A FORWARD -s 192.168.10.0/24 -p tcp --dport 80 -m state --state NEW -j ACCEPT(放行80端口的新连接)
# iptables -A FORWARD -s 192.168.10.0/24 -p icmp -j REJECT
A主机pingB主机
clip_p_w_picpath022
但并不影响其他功能的实现(web、ftp等功能)
首先需要在B主机上安装httpd包和vsftpd包
[root@localhost ~]# yum install -y httpd vsftpd
[root@localhost ~]# echo hello uaser > /var/www/html/index.html(主页面)
[root@localhost ~]# service httpd start(启动服务)
在A主机上访问B主机的web服务器
clip_p_w_picpath024
6、如果放行ping功能
在C主机添加如下规则
# iptables -A FORWARD -s 192.168.10.0/24 -p icmp --icmp-type 8 -m state --state NEW -j ACCEPT(只允许内网的新请求)
A主机pingB主机
clip_p_w_picpath026
内网可以请求别人,外网可以回复别人,但外网不能请求进来(防火墙不允许外网访问内网)
如果给A添加网关,看能否ping通B主机
# route add default gw 172.16.50.10(添加网关)
clip_p_w_picpath028
# service vsftpd start 启动ftp服务器
在C主机上添加规则:
# iptables -A FORWARD -s 192.168.10.0/24 -p tcp --dport 21 -m state --state NEW -j ACCEPT(放行21号端口
修改FORWARD默认规则为:
# iptables -R FORWARD 1 -m state --state ESTABLISHED,RELATED -j ACCEPT
B主机访问A主机的ftp服务
clip_p_w_picpath030
7、DNAT目标地址转换,应该在路由之前转换,即过程2的时候就要转换
DNAT地址转换图
clip_p_w_picpath032
现在我们将A主机与B主机做一下调整
把A主机的设置为桥接,B主机的设置为host-only
A主机的IP是172.16.50.5 网关172.16.50.10
B主机的Ip地址是192.168.10.2 网关:192.168.10.1
7.1、将源地址转换删除并清空
# iptables -t nat -F
# iptables -F
# iptables -P FORWARD ACCEPT
7.2、AB主机互ping能否成功
A ping B
clip_p_w_picpath034
B ping A
clip_p_w_picpath036
7.3、A主机访问B主机的web服务器
http://192.168.10.2
clip_p_w_picpath038
访问ftp
clip_p_w_picpath040
7.4、如果B主机没有指定网关,就不能访问A主机,需要在C主机上定义规则
# iptables -t nat -A PREROUTING -d 172.16.50.10 -p tcp --dport 80 -j DNAT --to-destination 192.168.10.2
7.5、如果我们的虚拟主机监听的是8080端口,也可以修改为8080端口
PNAT:端口映射Port NAT
# iptables -t nat -R PREROUTING 1 -d 172.16.50.10 -p tcp --dport 80 -j DNAT --to-destination 192.168.10.2:8080
8、过滤功能
在C主机上添加规则(FORWARD链上添加)
假设不能访问h7n9的字符串
# echo h7n9 hello > /var/www/html/index.html 新建网页
# iptables -A FORWARD -m string --algo kmp --string "h7n9" -j DROP
此时在访问http://172.16.50.10,就不能访问了
clip_p_w_picpath042