如何理解IP地址和端口?
防火墙用来对流进节点或从节点流出的数据包进行过滤。
二层防火墙可以针对MAC地址进行过滤;三层防火墙可以针对IP地址和协议进行过滤;四层防火墙可以针对端口和TCP的控制标记进行过滤。
在Linux中,真正具有防火墙功能的是netfilter,netfilter可以过滤数据包,可以进行网络地址转换,也可以修改数据包。netfilter的工作原理是:向内核模块注册钩子函数(HOOK) ,当内核模块执行到HOOK点时,就会执行其上注册的钩子函数。
iptables(CentOS6)和firewalld(CentOS7)并不具备防火墙功能,它们只是用来在用户空间维护和管理规则的工具,这些规则会被内核的netfilter模块使用,所以,它们本质上都是基于netfilter的。
netfilter工作在网络层,它在数据包必经的五个位置(也就是,防火墙四表五链中的五链)上注册了钩子函数。钩子函数会抓取数据包,并将数据包的信息和链上的规则进行匹配,匹配之后进行相应的处理,比如ACCEPT、DROP等。
五链如下图所示:
.
当一个数据包进入到网络接口时,它首先会进入到prerouting链,然后内核根据目的IP进行判断:
本机的程序发送的数据包,会经过output链,进入到postrouting链
在iptables中,有五张表,每张表都提供了不同的功能:
因为在每个链上都可以执行多种功能,所以一个链的规则会被放到多个表中。并且,一个表会为多个链保存规则。
关于iptables的使用详情,可以参考:这篇文档。
下面看一个DNAT的例子:
有两台虚拟机 192.168.10.101、192.168.10.102。其中,102上启动了一个UDP服务器,它会持续地从8082端口上接收数据报。在101上,通过iptables将所有发向192.168.10.103:8082的UDP封包的目的地址都转换成192.168.10.102:8082。这样,在101上,向103的8082端口发送UDP封包时,数据都会被发送到102的8082端口。
sudo iptables -t nat -I OUTPUT -d 192.168.10.103 -p udp --dport 8082 -j DNAT --to-destination 192.168.10.102:8082