iptables NAT原理

112053429.png

112053359.jpg


数据流向

入站:PREROUTINGàINPUT

出站:OUTPUTàPOSTROUTING

转发:PREROUTINGàFORWARDàPOSTROUTING


路由是这样的, 判断ip是否在同一网段 如果是 就不走路由,如果不是就需要根据网关出去。


第一种情况:入站数据流向

从外界到达防火墙的数据包,先被PREROUTING规则链处理(是否修改数据包地址等),之后会进行路由选择(判断该数据包应该发往何处),如果数据包的目标主机是防火墙本机(比如说Internet用户访问防火墙主机中的web服务器的数据包),那么内核将其传给INPUT链进行处理(决定是否允许通过等),通过以后再交给系统上层的应用程序(比如Apache服务器)进行响应。

第二冲情况:转发数据流向

来自外界的数据包到达防火墙后,首先被PREROUTING规则链处理,之后会进行路由选择,如果数据包的目标地址是其它外部地址(比如局域网用户通过网关访问QQ站点的数据包),则内核将其传递给FORWARD链进行处理(是否转发或拦截),然后再交给POSTROUTING规则链(是否修改数据包的地址等)进行处理。

第三种情况:出站数据流向
防火墙本机向外部地址发送的数据包(比如在防火墙主机中测试公网DNS服务器时),首先被OUTPUT规则链处理,之后进行路由选择,然后传递给POSTROUTING规则链(是否修改数据包的地址等)进行处理。


NAT转换主要是对路由外网网关地址进行的转换,

SNAT:为什么在POSTROUTING链进行转换,因为防火墙在内网,所以一个来源的数据包访问的可能是防火墙的地址,也可能是一个外网的地址,如果在路由转发前就更改了源地址,那么如果此包是去防火墙本身的,就会被丢弃掉

DNAT:为什么在PREROUTING链进行转换,因为外网主机的目标地址就是局域网内的一台主机,而它也不知道防火墙的ip地址是多少,所以根本不用考虑数据包是去防火墙的

以下方式也是一种理解:

一.SNAT源地址转换(内访外),将内网地址转换为外网网关地址

092753430.png

163213382.png

# iptables  -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0  -j SNAT --to-source 218.29.30.31

分析:这个语句就是告诉系统把从eth0即将要流出本机的数据的源地址修改成为外网网关地址218.29.30.31。这样,数据包在达到目的机器以后,目的机器会将包返回到218.29.30.31也就是本机。如果改成在PREROUTING链做处理,prerouting 后面必须是 -i,也就是流入本机的网口eth1,源地址将被修改为了内网网关地址192.168.1.1,当数据包走到eth0端口时因为找不到去外网的路,就会被丢弃,局域网的数据包不知道218.29.30.31在哪,所以无法进行路由转发,因此也无法访问到外网。


防火墙prerouting 后面必须是 -i (进站),

             postrouting 后面必须是 -o (出站)



二.DNAT目标地址转换(外访内),外网网关地址转换为内网地址

093920387.png

163245964.png

# iptables  -t nat -A PREROUTING -d 218.29.30.29 -i eth0 -ptcp --dport 80 -j DNAT --to-destination 192.168.1.6

分析:这个语句就是告诉系统把从eht0即将要流入本机的数据的目的地址修改成为外网网关地址218.29.30.31。这样,数据包在达到目的机器以后,目的机器会将包返回到218.29.30.31也就是本机。如果改成在POSTROUTING链做处理,postrouting 后面必须是 -o,也就是从本机流出的网口eth1,目的地址将被修改为了内网网关地址192.168.1.1,当数据包走到eth0端口时,因为目标地址的转换,所有无法通过此端口,数据包就会被丢弃,外网的数据包不知道192.168.1.1在哪,所以无法进行路由转发,因此数据包也访问不到内网主机




你可能感兴趣的:(iptables,NAT原理)