Linux 网络数据包处理流程
iptables 用法
- 注意事项
iptables 设置是有顺序的,如果数据包满足前面制定的规则,那么后面的规则将不被采用,所以对于舍弃的数据包尽可能的放在接收数据包的前面,这样可以避免本来要舍弃的数据被接收。 - 表
- filter
内建三个链,INPUT 、OUTPUT 、FORWARD;对数据包进行DROP、ACCEPT、LOG、REJECT等操作。 - nat
仅用于NAT,用来转换源或者目的地址,用来解决ipv4地址空间不够问题,搭建局域网等,只有NAT主机具有公网ip地址,局域网内的其他主机通过重定向源或目的地址来实现外网的访问,当然也提高可内网主机的安全性,可通过防火墙禁止外网主机主动联机内网主机。
- filter
注意事项:
属于一个流的数据包只经过nat表一次。如果第一个包被允许做NAT或者Masqueraded, 那么余下的数据包会自动得做相同的操作。这也是为什么不推荐在nat表中做过滤的原因。
DNAT
改变目的地址,以使包能重路由到某台主机。SNAT
改变包的源地址,可以用来复用ipv4地址。-
MASQUERADE
ip地址是动态的,类似于DHCP,与DNAT和SNAT固定的ip地址不同。- mangle
可以使用mangle匹配改变包的TOS 等特性,注意事项:不要在这个表中做任何过滤。mangle 表仅有的操作:
- mangle
TOS
TTL
可以让所有数据包只有一个特殊的TTL。 某些ISP可能会通过TTL来判断计算机是否共享网络,可以用来欺骗ISP-
MARK
- raw
链
- INPUT
网络数据包的目的地是本地Linux主机。 - OUTPUT
网络数据包的原是本地Linux 主机。 - FORWARD
由一个本地Linux 主机的一个网卡接收到的数据发到另一个网卡。 - PREROUTING
路由前 - POSTROUTING
路由后 - 自定义链
-
状态机制
状态机制只是一种连接状态跟踪机制,能提供更严密的安全机制。NEW
INVAILD
不能识别属于哪个 连接或者没有任何状态的数据包,通常的措施是DROP。
ESTABLISHED
只要发送的数据有应答,即标记为ESTABLISHED状态,无论是发往防火墙还是由防火墙转发。ICMP等数据包也看作是,只有所发出的数据包有应答信息。
RELATED
前提是已经有一个端口实现ESTABLISHED状态,然后这个ESTABLISHED再建立另外一个连接,这个新的连接就是RELATED。 典型的是FTP协议,一个控制端口和一个数据端口。
所有状态的改变和计算都是在nat表中的PREROUTING链和OUTPUT链里完成的: 如果本地发送一个数据包,那么会在OUTPUT链里标记状态为NEW,当本地接收到回应的包时,会在PREROUTING中标记为ESTABLISHED状态。
- 常用命令
-
观察规则
iptables [-t tables] -L [-nv]
-t : 省略此项,默认是filter; 还可使nat、 filter
-L : 列出当前tables的规则
-n : 不进行IP 和 HOSTNAME 的 反查,显示速度比较快
-v : 显示详细信息
--line-numbers 查看规则时显示相应的序号
删除规则
其中的filter可以换成其他表。
iptables -t filter -F #删除所有已定的规则
iptables -t filter -X #除掉所有用户“自定义”的链(tables)
iptables -t filter -Z #所有链的计数与流量统计清零
-D 删除链内指定序号或内容的规则-
默认策略
iptables [-t nat] -P [INPUT, OUTPUT, FORWARD] [DROP, ACCEPT]
-P : 定义策略policy
DROP :偷偷丢弃数据包
ACCEPT: 接收数据包
当数据包不在制定的规则中,则采用默认策略。 一般严格设置的话,将输入的数据包全部丢弃,输出的数据包和转发的数据包全部接收。iptables -P INPUT DROP iptables -P OUTPUT ACCEPT iptables -P FORWARD ACCEPT
-
TCP连接
UDP
-
ICMP
ICMP包有很多类型,但只有四种类型有应答包,它们是回显请求和应答(Echo request and reply),时间戳请求和应答(Timestamp request and reply),信息请求和应答(Information request and reply),还有地址掩码请求和应答(Address mask request and reply),这些包有两种状态,NEW和ESTABLISHED 。
ICMP的另一个非常重要的作用是,告诉UDP、TCP连接或正在努力建立的连接发生了什么,这时ICMP应答被认为是RELATED的。主机不可达和网络不可达就是这样的例子。当试图连接某台机 子不成功时(可能那台机子被关上了),数据包所到达的最后一台路由器就会返回以上的ICMP信息,它们就 是RELATED的,如下图:
参考文献
鸟哥的Linux 私房菜 服务器架设篇
iptables 指南 1.1.19