乐趣区

关于linux: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 种规定:

  1. filter 表:负责过滤性能;
  2. nat 表:network address translation,网络地址转换性能;
  3. mangle 表:拆解、批改、并从新封装报文;
  4. 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

设置链的默认规定

#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

很久以前写的了,最近从新启用这个博客,因而先顺手转过来。

原文作者:蓝色瞳仁
版权申明:转载请注明作者和链接。

退出移动版