iptables基础原理和使用简介
概念简介
名称
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基础原理和使用简介的更多相关文章
- 【docker】docker基础原理,核心技术简介
关于docker的核心技术,就是以下的三大技术: 1.namespaces [命名空间] 使用linux的命名空间实现的进程间隔离.Docker 容器内部的任意进程都对宿主机器的进程一无所知. 除了进 ...
- APPcrawler基础原理解析及使用
一.背景 一年前,我们一直在用monkey进行Android 的稳定性测试 ,主要目的就是为了测试app 是否会产生Crash,是否会有ANR,页面错误等问题,在monkey测试过程中,实现了脱离Ca ...
- iptables (1) 原理
网上看到这个配置讲解得还比较易懂,就转过来了,大家一起看下,希望对您工作能有所帮助. iptables简介 netfilter/iptables(简称为iptables)组成Linux平台下的包过滤防 ...
- Spring Boot 基础,理论,简介
Spring Boot 基础,理论,简介 1.SpringBoot自动装配 1.1 Spring装配方式 1.2 Spring @Enable 模块驱动 1.3 Spring 条件装配 2.自动装配正 ...
- J2EE基础之Web服务简介
J2EE基础之Web服务简介 1.什么是Web服务? 在人们的日常生活中,经常会查询网页上某城市的天气信息,这些信息都是动态的.实时的,它是专业的气象站提供的一种服务.例如,在网上购物时,通常采用网上 ...
- I2C 基础原理详解
今天来学习下I2C通信~ I2C(Inter-Intergrated Circuit)指的是 IC(Intergrated Circuit)之间的(Inter) 通信方式.如上图所以有很多的周边设备都 ...
- C#基础原理拾遗——引用类型的值传递和引用传递
C#基础原理拾遗——引用类型的值传递和引用传递 以前写博客不深动,只搭个架子,像做笔记,没有自己的思考,也没什么人来看.这个毛病得改,就从这一篇开始… 最近准备面试,深感基础之重要,奈何我不是计算机科 ...
- OpenStack的基础原理
OpenStack的基础原理 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. OpenStack既是一个社区,也是一个项目和一个开源软件,它提供了一个部署云的操作平台或工具集.其 ...
- DNS服务基础原理介绍
FQDN 全称域名 localhost(主机名或者是别名).localdomain(域名) FQDN=主机名.域名 根域 . 顶级域名 .com .n ...
随机推荐
- 第三周:java面向对象部分总结(2)
<!--此处接上周--> 3.相关接口 对对象的排序,可以通过以下两种方法: 1.实现Comparable接口,重写compareTo方法: 2.Comparator<>比较器 ...
- 大话Python函数底层逻辑
函数 叫 子过程或子程序 描叙的更为贴近实际应用场景 这和数学中的函数实现上不同但语义上相识,如 f(x) = expressiom, 给定一个确定的输入必然返回一个确定的输出 数学中函数的关系是通过 ...
- nessus 家庭版安装教程(windows)
1.根据系统选择安装包:https://www.tenable.com/products/nessus/select-your-operating-system 2.申请激活码,在我们安装的时候差不多 ...
- C++派生类与基类的关系
派生类与基类有这些关系: 1.公有派生类从基类继承所有成员和成员函数 2.公有派生类无法直接访问从基类继承的私有成员,但可以通过继承的公共接口访问. 3.公有派生类无法继承基类的友元函数. 4.基类先 ...
- 《C++primerplus》第12章“队列模拟”程序
这个程序刚开始学有很多难点,个人认为主要有以下三项: 1.链表的概念 2.如何表示顾客随机到达的过程 3.程序执行时两类之间的关系,即执行逻辑 关于第一点,书上的图解释得比较清楚了,把"空指 ...
- 高性能HTTP加速器Varnish--基础知识
一.Varnish 概述 Varnish 是一款高性能且开源的反向代理服务器和HTTP加速器,它的开发者 Poul-Henning Kamp 是 FreeBSD 核心的开发人员之一. 与传统的 Squ ...
- Jenkins从节点上构建自动化测试项目时报错:java.io.IOException: Unexpected termination of the channel
在mac电脑上配置了Jenkins从节点,在该从节点上构建app UI 自动化测试项目,运行一些用例后报如下错误: java.io.EOFException at java.io.ObjectInpu ...
- DM9000时序设置
想了解一下DM9000的移植修改原理,所以分析了一下时序图和引脚连接 首先看一下DM9000的引脚和MINI2440的引脚连接 DM9000 MINI2440 功能描述 SD0 DA ...
- 如何让矢量瓦片配图神器maputnik支持 geoserver
关键词:maputnik.geoserver.矢量地图.矢量瓦片.mapbox.mapboxgl.地图配图.地图配色 一直想搞一个类似百度.高德地图那样的矢量地图配图工具 百度个性化地图配图工具: 高 ...
- 数据结构&算法的引言&时间复杂度
什么是计算机科学? 首先明确的一点就是计算机科学不仅仅是对计算机的研究,虽然计算机在科学发展的过程中发挥了重大的作用,但是它只是一个工具,一个没有灵魂的工具而已.所谓的计算机科学实际上是对问题.解决问 ...