概念简介

名称

Netfilter/iptables模块有两部分组成:

Netfilter框架以及iptables,iptables又分为iptables(内核空间)和iptables命令行工具(用户空间);

Netfilter/iptables模块 在一般使用者眼里简称为iptables,但其实在相关开发者眼里更倾向于叫作Netfilter,从项目官网地址也看得出来: https://netfilter.org/

作用

用于数据包处理,比如:报文的转发、过滤、修改,网络地址转换等功能,是一种软件防火墙。

iptables基本原理

基本工作流程

基本工作流程图



​ 数据包沿着链传输,iptables有5个链:PREROUTING, INPUT, FORWORD, OUTPUT, POSTROUTING,可以想象成5个关卡,每个关卡都有很多规则,也可能没有规则。

工作流程流程如下:

1、当一个数据包进入网卡后,它会先进入PREROUTING,然后根据目的地址进行路由决策,如果目的地址是本机,则走INPUT,不是本机则走FORWARD,然后再走POSTROUTING转出去。

2、进入INPUT的数据包会转给本地进程,进程处理后,会发送新的数据包,走OUTPUT,然后经过POSTROUTING转出去。

3、当然上面的过程每经过一个链,都要按照链中的规则顺序来匹配链中的规则,只要遇到一个匹配的规则就按照这个规则进行处理,后面的规则对这个数据就不再起作用。

单的规则添加

​ 只有本地socket是用户态,其余都是内核处理。平时我们加iptables规则,就是加到各个链中的,我们创建一个容器进行测试,容器中我已经安装好了iptables,直接使用iptables命令即可:

#首先启动一个容器
[root@kube-master ~]# docker run -itd --name "cos8_test" --cap-add=NET_ADMIN centos:base /bin/bash
bd0c29186387b01ae64514050b3b4b804babc988f3dbc52c0cfe6eeac115d1b2

注:要修改容器网络,容器启动时需加上 --cap-add=NET_ADMIN,不然容器中执行iptables命令会报错:

(nf_tables): Could not fetch rule set generation id: Permission denied (you must be root)

查看iptables规则,可以看到当前没有任何策略

[root@kube-master ~]# docker ps | grep cos8
bd0c29186387 centos:base "/bin/bash" 21 hours ago Up 21 hours cos8_test
[root@kube-master ~]# docker exec -it bd0 bash
[root@bd0c29186387 /]#
[root@bd0c29186387 /]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination Chain FORWARD (policy ACCEPT)
target prot opt source destination Chain OUTPUT (policy ACCEPT)
target prot opt source destination

创建一个规则:拒绝所有访问本机80端口的tcp数据包。

[root@bd0c29186387 /]# iptables -A INPUT -p tcp --dport 80 -j DROP
[root@bd0c29186387 /]#
[root@bd0c29186387 /]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 Chain FORWARD (policy ACCEPT)
target prot opt source destination
DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 Chain OUTPUT (policy ACCEPT)
target prot opt source destination
DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80

这里有个小插曲:可以看到我只在INPUT链中添加了规则,但是怎么FORWARD和OUTPUT链中也有这条规则,随后我手动删了INPUT链中的规则,然后FORWARD和OUTPUT链中的规则也随之消失了,此容器的OS版本和内核信息如下

[root@bd0c29186387 /]# cat /etc/redhat-release
CentOS Linux release 8.2.2004 (Core)
[root@bd0c29186387 /]#
[root@bd0c29186387 /]# uname -a
Linux bd0c29186387 3.10.0-1127.13.1.el7.x86_64 #1 SMP Tue Jun 23 15:46:38 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

之前没用过centos8,考虑到可能是OS更新了netfilter模块,于是换成了一个centos7.8.2003的容器测试了一下,发现添加规则是符合预期的,如下

[root@kube-master /]# docker run -itd --name "cos7" --cap-add=NET_ADMIN centos7:base /bin/bash
c951c0a9d34d8e43a56e43872294ab5ab6a1504b365721238178de134e8d3bde
[root@kube-master /]#
[root@kube-master /]# docker exec -it cos7 bash
[root@c951c0a9d34d /]#
[root@c951c0a9d34d /]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination Chain FORWARD (policy ACCEPT)
target prot opt source destination Chain OUTPUT (policy ACCEPT)
target prot opt source destination
[root@c951c0a9d34d /]#
[root@c951c0a9d34d /]# iptables -A INPUT -p tcp --dport 80 -j DROP
[root@c951c0a9d34d /]#
[root@c951c0a9d34d /]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 Chain FORWARD (policy ACCEPT)
target prot opt source destination Chain OUTPUT (policy ACCEPT)
target prot opt source destination

拒绝可以使用DROP,也可以使用REJECT关键字,DROP不会给客户端返回任何信息,所以客户端看到的情况就是连接超时,很难判断是防火墙原因还是网络设备故障等原因。

而REJECT则明确返回给客户端一个拒绝的信息,客户端会知道我是被防火墙拒绝了。

可根据场景使用,REJECT更适合调试,DROP抗攻击上面更安全些。

后面使用centos7的容器作为测试,先不管centos8更新了啥。

四表五链

上面我添加的规则命令如下:

iptables -A INPUT -p tcp --dport 80 -j DROP

但这只是简写后的,稍微写全些如下,其实还可以更全些,暂不说明。

iptables -t filter -A INPUT -s 0.0.0.0/0 -p tcp -d 0.0.0.0/0 --dport 80 -j DROP

-t : 指定表,这里是filter表,规则会添加到filter表中。

-s : 指定源地址,0.0.0.0/0是指所有IP。

-d : 指定目的地址。

--dport : 指定目的端口。

-j : 指定处理动作,这里是DROP,也就是丢弃。

表的概念

上面提到了filter表,那什么是表呢?

​ 我们加规则,加到每个链中,每个链中的规则有很多,有一部分规则是相似的,比如,有一部分都是端口的过滤,有一部分都是报文的修改,根据这些规则的类型,把相似的规则放在一起,这些放在一起的规则的集合称为表。

​ 那不同的规则的集合就放在了不同的表中,总共有4种表,也就是4种规则:

filter表:负责过滤功能;

nat表:network address translation,网络地址转换功能;

mangle表:拆解、修改、并重新封装报文;

raw表:关闭nat表上启用的连接追踪机制;

因为每个链中都有不同规则,所以表存在于每一个链中,但不是每个链都有这4种表,

PREROUTING 的规则可以存在于:raw表,mangle表,nat表。

INPUT 的规则可以存在于:mangle表,filter表,nat表(centos7中有nat表,centos6中没有)。

FORWARD 的规则可以存在于:mangle表,filter表。

OUTPUT 的规则可以存在于:raw表mangle表,nat表,filter表。

POSTROUTING 的规则可以存在于:mangle表,nat表。

表的处理优先级如下:

raw --> mangle --> nat --> filter

所以我们一开始iptables的基本工作流程图可以更详细些



其实还可以再详细些,我们单独拿一个链出来,比如PREROUTING链,大概是如下情况,这些规则组和在了一起便成了一条链。



​ 所以,我们上面加的禁止访问本机80端口的规则是存放在filter表中的,我们来查看下filter表中的规则,可以看到我们添加的规则,netfilter默认把80端口绑定为http。

[root@c951c0a9d34d /]# iptables -L -t filter
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP tcp -- anywhere anywhere tcp dpt:http Chain FORWARD (policy ACCEPT)
target prot opt source destination Chain OUTPUT (policy ACCEPT)
target prot opt source destination

iptables常用命令举例

查看规则

按表查看: iptables -L -t table
按照链查看: iptables -nL

设置链的默认规则

#INPUT链默认拒绝所有数据包
iptables -P INPUT DROP
#OUTPUT默认允许所有数据包出去
iptables -P INPUT ACCEPT

清空表中的规则

#清空nat表中PREROUTING链的规则
iptables -t nat -F PREROUTING
#清空filter表中所有链的规则
iptables -t filter -F
#清空使用者自定义的表规则
iptables -X

删除某一条规则

#可以通过编号来删除
#--line-number在规则前面显示了编号
[root@c951c0a9d34d /]# iptables -nL --line-number
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 Chain FORWARD (policy ACCEPT)
num target prot opt source destination Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
[root@c951c0a9d34d /]#
[root@c951c0a9d34d /]# iptables -D INPUT 1 #也可以直接删除规则
#下面命令中,-D后面的全是匹配条件,凡是某条规则中全部匹配这些的就删除
[root@c951c0a9d34d /]# iptables -D INPUT -p tcp --dport 80 -j DROP

禁ping

#禁止别人ping自己,但是自己可以ping别人
#type 8: 表示ping包请求流量
#type 0: 表示ping包响应流量
iptables -A INPUT -p icmp --icmp-type 0 -j DROP
iptables -A OUTPUT -p icmp --icmp-type 8 -j DROP #禁止别人ping自己,也禁止自己ping别人
iptables -A INPUT -p icmp -m icmp --icmp-type any -j DROP #也可以改参数实现禁ping
echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_all

转发

#开启转发功能
echo 1 > /proc/sys/net/ipv4/ip_forward #对于外部访问自己80端口的流量全部转到172.17.0.4的80端口,
#xxx.xxx.xxx.xx代表本机的IP
iptables -t nat -I PREROUTING -d xxx.xxx.xxx.xx -p tcp --dport 80 -j DNAT --to-destination 172.17.0.4:80 #对于从本机出去的流量,源ip全部转换为172.17.0.4
iptables -t nat -A POSTROUTING -p tcp -j SNAT --to-source 172.17.0.4

针对链接状态作规则

#NEW 用户发起一个全新的请求
#ESTABLISHED 对一个全新的请求进行回应
#RELATED 两个完整连接之间的相互关系,一个完整的连接,需要依赖于另一个完整的连接。
#INVALID 无法识别的状态。
iptables -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT

先这些吧。

iptables基础原理和使用简介的更多相关文章

  1. 【docker】docker基础原理,核心技术简介

    关于docker的核心技术,就是以下的三大技术: 1.namespaces [命名空间] 使用linux的命名空间实现的进程间隔离.Docker 容器内部的任意进程都对宿主机器的进程一无所知. 除了进 ...

  2. APPcrawler基础原理解析及使用

    一.背景 一年前,我们一直在用monkey进行Android 的稳定性测试 ,主要目的就是为了测试app 是否会产生Crash,是否会有ANR,页面错误等问题,在monkey测试过程中,实现了脱离Ca ...

  3. iptables (1) 原理

    网上看到这个配置讲解得还比较易懂,就转过来了,大家一起看下,希望对您工作能有所帮助. iptables简介 netfilter/iptables(简称为iptables)组成Linux平台下的包过滤防 ...

  4. Spring Boot 基础,理论,简介

    Spring Boot 基础,理论,简介 1.SpringBoot自动装配 1.1 Spring装配方式 1.2 Spring @Enable 模块驱动 1.3 Spring 条件装配 2.自动装配正 ...

  5. J2EE基础之Web服务简介

    J2EE基础之Web服务简介 1.什么是Web服务? 在人们的日常生活中,经常会查询网页上某城市的天气信息,这些信息都是动态的.实时的,它是专业的气象站提供的一种服务.例如,在网上购物时,通常采用网上 ...

  6. I2C 基础原理详解

    今天来学习下I2C通信~ I2C(Inter-Intergrated Circuit)指的是 IC(Intergrated Circuit)之间的(Inter) 通信方式.如上图所以有很多的周边设备都 ...

  7. C#基础原理拾遗——引用类型的值传递和引用传递

    C#基础原理拾遗——引用类型的值传递和引用传递 以前写博客不深动,只搭个架子,像做笔记,没有自己的思考,也没什么人来看.这个毛病得改,就从这一篇开始… 最近准备面试,深感基础之重要,奈何我不是计算机科 ...

  8. OpenStack的基础原理

    OpenStack的基础原理 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.   OpenStack既是一个社区,也是一个项目和一个开源软件,它提供了一个部署云的操作平台或工具集.其 ...

  9. DNS服务基础原理介绍

    FQDN 全称域名 localhost(主机名或者是别名).localdomain(域名)    FQDN=主机名.域名 根域               . 顶级域名       .com   .n ...

随机推荐

  1. MySQL的8小时连接超时时间,导致系统过夜即崩溃,报错Could not roll back Hibernate transaction

    2014年3月开始给单位开发<机关规范化管理网络平台>,10月底成功上线运行,但是存在一个bug: 部署环境: apache tomcat 6.0.41 + mysql5.5 + jbpm ...

  2. C++实现串口通信问题(与Arduino)

    参考1(已验证稍加修改可与Arduino通信):https://blog.csdn.net/qq_36106219/article/details/81701368 参考2(比较全,main函数需要自 ...

  3. shell-变量的字串应用技术

    1. 变量子串的常用操作 常用操作如下表: 依次举例说明: 定义aa变量,内容为"I am scajy" [root@1-241 script]# aa="I am sc ...

  4. 原生JS实现下拉列表

    1 <div class="list"> 2 <ul> 3 <li> 4 <a href="#">Web部< ...

  5. day48 Pyhton 数据库Mysql 05

    一内容回顾 insert insert into 表名 (字段名)  values (值) insert into 表名 values (有多少个字段写多少个值) insert into 表名 val ...

  6. 加密sqlite3数据库文件

    目录 EncryptSqlite3 实现原理 使用方法 不足之处 GitHub地址 EncryptSqlite3 加密sqlite3数据库,产生的数据库文件别人打不开. 实现原理 在写入文件前对每个字 ...

  7. 不要以为Bug写的好就是好程序员,其实这只占不到15%!

      最近和一位从事多年架构工作的技术哥们见面,聊到了近期面试程序员的一些经历,谈到了"如何判断程序员水平高低"这个话题,颇有些感触,觉得有价值,因此花了些时间整理.分享给大家. 正 ...

  8. 这里有40条提升编程技能小妙招!还有TIOBE 7月份的编程语言排行榜

    如何提高编程技能?恐怕很多开发者思考过这个问题.最近,拥有将近 15 年开发经验的软件工程师 Kesk -*- 写了一篇博客,列举了 40 条对其职业生涯有所帮助的事项.   或许,通过以下 40 个 ...

  9. linux(centos8):安装Jenkins持续集成工具(java 14 / jenkins 2.257)

    一,什么是Jenkins? 1,jenkins是什么? Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具, 用于监控持续重复的工作,旨在提供一个开放易用的软件平台, 使软件的持续 ...

  10. spring boot:使用spring cache+caffeine做进程内缓存(本地缓存)(spring boot 2.3.1)

    一,为什么要使用caffeine做本地缓存? 1,spring boot默认集成的进程内缓存在1.x时代是guava cache 在2.x时代更新成了caffeine, 功能上差别不大,但后者在性能上 ...