iptables防火墙(一)
iptables防火墙和firewalld防火墙本质上是一样的
操作系统有一个内核部分。内核驱动硬件,其次是一些外围程序。接下来是用户Linux防火墙,它是基于内核的防火墙机制。它的名称是netfilter,但用户最终配置它。设置防火墙策略时,让内核中真正的防火墙工作。它需要外围工具来配置策略。
我今天使用的工具是iptables。它有自己的相关语法。我们根据语法编写策略。写完之后,我们最终通过内核模块来控制它。
firewalld也有自己的语法策略,
使用的时候,不管你用iptables还是firewalld,最终的内核函数都是一样的,只是敲命令的时候语法描述不一样。
iptables防火墙的语法比较简单,但是逻辑性比较强。
firewalld防火墙适合英语水平较好的人,按照自然语言的语法规范进行描述。
iptables
标准防火墙声明:iptablesnefilter架构
或nefilteriptables 架构
firewalldnefilter建筑
iptables防火墙
防火墙类似于之前提到的ACL包过滤。防火墙的工作量最大。它还具有一些其他功能。主要处理数据包。
从封装上来说,主要主要是基于包过滤的针对结构,网络层是封装的网络层。
所以我在下面画防火墙的时候,是把防火墙画在网络层的。它在以及的工作是处理之上的数据包。其实结构是可以过滤的,但最重要的是主要!
下图(使用网络层
使用左侧一台主机模拟网络,右侧主机模拟网络,然后将另一台主机插上两块网卡,将两个网络连接起来。该主机恰好处于网关位置。这张图的目的是可以看到不同网段之间的通信,包括和网关本身的通信,还可以看到更多相关的功能。
如果我只是对主机本身进行防火的话,那么直接拆掉一块网卡就可以了。
当iptables 实现时,它指定了五个可以设置策略的位置,称为链。规则链
所谓规则链就是存储这些规则的位置或空间。只要在数据包中添加了策略,当到达这个位置时,就会检查数据包是否与里面的相关策略相匹配。
这个链条中有五个规则
他们是
上面下面呼入
网络层外拨
TCP/IP五层结构划分的:物理层、数据链路层、网络层、传输层、应用层):转发链
路由前INPUT
路由后OUTPUT
如果无论使用哪个网卡都想访问机器,就必须走这条路线。
FORWARD
PREROUTING
POSTROUTING
如果是左侧主机访问中间这个主机 也是这条路
如果您使用此路径从中间主机访问右侧主机,则您也将通过此路径访问左侧主机。
出来的时候总是这样
如果您要从一个网段转到另一个网段
回来的时候也是一样。回来的时候还是从这里进入
因为这是平面图,所以只能这样画,就是通过PREROUTING进入的时候,通过POSTROUTING退出的时候,然后再去找各自的网卡。
在相应的位置添加策略就可以达到这种防火墙的效果。
这是五个链条
PREROUTINGROUTING 表示路由PREROUTING 表示路由之前
右侧主机访问 中间主机 也是走这条路
就和小区一样那个们只能进那个们只能出 进的时候只能同特定的门进入
PREROUTINGINFUT
这个代表中间这台主机上有路由表 应该怎么去 怎么判断 他就开始根据目标进行转发 如果一看目标地址是奔着自己去的他就走
路由表是用于路由选择的地图。
POSTROUTING路由后,无论最终时间如何选择,路由判断后从这里出去。
其实正常情况下,应该有一个路由表。
当上层数据进来时,首先看一下应该从哪个网卡出去。这是路由的后面。后面的路由选择称为后面的路由。
PREROUTINGINPUT从一个网段转发到另一个网段需要经过路由判断后转发。这称为转发链。
这条线上去了如果是目标地址可能是另外一个网段的他可能走的时候走到机器本身就被称为PREROUTINGFORWARDPOSTROUTING
FORWARD调用INPUT 退出本机
有时候,当一段流量去往任何一个地方时,它可能会经过多个链路到达本地机器。
预布线输入
这就是你出门时的走路方式
输出后布线
如果转发时说他要离开
预布线转发后布线
根据上图,有时需要将策略设置在哪个位置最好。
在五条链中,防火墙功能可以实现四种功能,专业术语称为四张规则表。
入站
OUTPUT
出站
raw表:确定是否对该数据包进行状态跟踪
四个规则表分别指四个功能
mangle表:为数据包设置标记
nat表:修改数据包中的源、目标IP地址或端口做地址转换(常用)我们很少用
filter表:确定是否放行该数据包(过滤)包过滤(经常用)
第一个功能raw表:有很多主机 有流量过来的时候经过我,然后不管去哪里那我是否对该数据包 做状态的跟踪把他的状态记录下来后续再有数据包 过来的时候 看一下 是否相应匹配 状态跟踪 就和跟踪一个人 一样 当他从家门出来的时候 跟踪一个人最好第一时间就跟踪他在防火墙中 如果跟踪的话 如果他的路线是下图 可以在PREROUTING设置策略 来自另外一个主机的 经过我本机 或者说 访问我本机的时候想做状态跟踪设置 我们设置策略 可以在这设置PREROUTING
当我路过并外出时,当前数据可能占用较多带宽,设备繁忙。什么样的流量会优先转发,什么样的流量会延迟转发。当它经过时我们可以标记它然后出去。
添加标签时,可以在如果说 从本机出去的时候 可以从OUTPUT设置策略处添加标签,并根据标签进行后续处理。这后面可能有防火墙,然后再经过防火墙进行处理。我们很少使用它。
第二个功能manle表
左侧网络中 可能有很多主机经过我转发的时候发把中间主机想象成路由器
任何地方
第三个功能 nat表
比如说 左面是私有网络右面是公有网络两边有对应的桥节点 或者交换机中间是路由器在这做nat设置 路由器就是一台特殊的主机每个接口就是一个网卡拿一台电脑插两块网卡 充当 路由器 是没有任何问题的
私网访问 公网的时候 需要换地址私网地址换成公网地址然后去访问外部网络
在做nat转换的时候数据包 是这样走的
PREROUTINGFORWARDPOSTROUTING
上图中,当外部主机要访问私有服务器时,例如右侧为200.0.0.1。当外部主机只能访问路由器的公网部分时,无法访问私网部分。其距离为
在POSTROUTING设置 策略最合适
做源地址转换在POSTROUTING里面加策略 出去以后把源地址换成公有地址
POSTROUTING是源地址转换的地方
PREROUTINGFORWARDPOSTROUTING
如果再 PREROUTING这个链中没有加入 目标地址转换因为公网访问私网是目标转换
他访问 200.0.1的 某个端口 的时候 他可以访问到内部主机 如果在这个地方没有做策略设置的时候当数据包 访问到200.0.0.1 的时候 假设说PREROUTING没有做策略接下来 就到了 路由表判断 了路由表是根据目标地址做处理的他一看 目标地址 没有做变化是200.0.0.1 他就给送上去了 去访问本机了但是本机没有这个服务 最终就访问不到如果想做 目标地址转换给他改变方向 一定要是 路由判断之前 所以说做目标地址转换一定要在 PREROUTING里面做
在这做地址转换 做完以后 当目标访问200.0.0.1的时候他给转换为1.2了 这时候 路由表一判断 就给送过去了 做nat的时候 目标地址转换 一定是要在PREROUTING实现的
当然也可能在别的地方实现 但是我们再说的时候 就记住就行了 源地址转换一般在POSTRONGTING里面做 目标地址转换 一般在PREROUTING里面做
filter表第四个功能包过滤
允许不允许的意思
一共三条路 一个是访问本机的 一个是出本机的 一个是转发的
包过滤就是 拒绝 或者允许先看到本机的流量 他会先经过 PREROUTING再经过 INPUT比如我要设置 拒绝某一个主机 访问本机在INPUT设策略 最合适
因为去本机的流量一定会经过 INPUT如果再PREROUTING设置策略了 对某一个流量进行拒绝这里面 会有 一些 是转发的 在这个地方 也要挨个去检查
就比如 在大马路上抓一个坏人不好抓 客流量太大 去他的必经的小路上抓好抓
在防火墙中
)_网络层_17" /> 规则链之间的顺序 入站:PREROUTINGà à INPUT 出站:OUTPUT ààPOSTROUTING 转发:PREROUTING ààFORWARD ààPOSTROUTING 规则链内的匹配顺序 按顺序依次检查,匹配即停止 若找不到相匹配的规则,则按该链的默认策略处理 当我们在链中设置策略的时候,如果有多条策略, 他是按照顺序来依次检查 如果有一个匹配了 那么后面就不看了 逮一个人 设置了10道岗 第三道岗就逮住了 那后面就不用了 若找不到相匹配的规则,则按该链的默认策略处理 默认策略可以更改的! iptables -t filter -I IbashNPUT -p icmp -j REJECT向filter 表中 NPUT链里 插入一条策略 匹配icmp协议的流量 将被 REJECT 拒绝 -t 代表 tab表名 filter 表可以省掉的 -l 插入第一行 INPUT 向这个链中加策略 -p 协议 icmp 阻止ping 测试 -j 控制类型 REJECT 拒绝并告知 不指定表名时 默认filter 表 选项、链名、控制类型使用大写字母,其余均为小写 数据包的常见控制类型 ACCEPT:允许通过 DROP:直接丢弃,不给出任何回应 REJECT:拒绝通过,必要时会给出提示 LOG:记录日志信息,然后传给下一条规则继续匹配,有人出去我记录下来 但是不阻止 添加新的规则 -A:在链的末尾追加一条规则 -I:在链的开头(或指定序号)插入一条规则 iptables -t filter -A INPUT -p tcp -j ACCEPT追加 iptables -I INPUT -p udp -j ACCEPT插入到第一行 iptables -I INPUT 2 -p icmp -j ACCEPT插入到第二行 通过这个来调整他们相关的顺序,,因为排在前面的先看 查看规则列表 -L:列出所有的规则条目 -n:以数字形式显示地址、端口等信息 -v:以更详细的方式显示规则信息 --line-numbers:查看规则时,显示规则的序号 删除、清空规则 -D:删除链内指定序号(或内容)的一条规则 -F:清空所有的规则 某一个链中的所有规则 清空 做测试之前先把默认的firewalld防火墙关掉 准备两台电脑 iptables -t filter -L查看 filter表 里的 所有规则条目 这个包过滤里面 包含着 INPUT 没有策略 FORWARD 里面没有策略 OUTPUT 里面 没有策略 (policy ACCEPT) policy策略 ACCEPT允许通过 代表默认策略允许通过 比如添加一个拒绝192.168.254.130 的访问 不写表 默认是filter表 iptables -t filter -A INPUT -s 192.168.254.130 -j DROPiptables -A INPUT -s 192.168.254.130 -j DROP删除条目 iptables -t filter -D INPUT -s 192.168.254.130 -j DROP或 iptables -D INPUT -s 192.168.254.130 -j DROP这时候130 主机就ping不通了 这是再去看 iptables -t filter -L 就有设置的策略条目了 设置默认策略 -P:为指定的链设置默认规则 p策略 iptables -t filter -P FORWARD DROP iptables -t filter -P INPUT ACCEPT iptables -t filter -P OUTPUT ACCEPT 默认策略只能是 ACCEPT 或 DROP 注意! 如果不写表的话 默认就是 filter 表 iptables -t filter -nL以数字形式显示 类别 选项 用途 添加新的规则 -A 在链的末尾追加一条规则 -l 在链的开头(或指定序号)插入一条规则 -L 列出所有的规则条目 -n 以数字形式显示地址、端口等信息 查看规则列表 -v 以更详细的方式显示规则信息 --line-numbers 查看规则时,显示规则的序号 -D 删除链内指定序号(或内容)的一条规则 删除、清空规则 -F 清空所有的规则 设置默认策略 -P 为指定的链设置默认规则 -F 清空所有规则 不包括默认策略 iptables -t filter -F 通用匹配 和隐含匹配:防火墙过滤的时候可以识别很多的条件,在识别这些条件的时候,会使用不同的模块程序 我们程序有很多模块构成的,你想使用那个模块来识别什么条件,你可以去指定,但是有一些条件是不需要指定模块。因为经常用,他会自动去识别,如果能自动去识别不需要指名模块的条件称为隐含匹配,就是隐含了指明模块这样一个动作 显示匹配:有些不怎么常用,所以在选择模块的时候 就需要指明这个模块,用那个模块来识别某个条件 这个称为显示匹配 明确的制定出来了。 显示匹配: 常用的显式匹配条件 多端口匹配:-m multiport --sports 源端口列表 -m multiport --dports 目的端口列表 IP范围匹配:-m iprange --src-range IP范围 MAC地址匹配:-m mac --mac-source MAC地址 状态匹配:-m state --state 连接状态 iptables -A INPUT -p tcp -m multiport–dpot 25,80,,110,143 -j ACCEPT 端口号 端口号可以设置一个范围 比如1-10 1-1026 5-20 如果不连续的 对多个端口进行做处理 当识别的是 这种语法规范 需要调用模块 这个模块是multiprt mult多 port端口 端口的话一定配合tcp或udp协议来用 向INPUT 中添加一条规则 目标端口是 tcp 25 80 110 143 端口的 允许ACCEPT iptables -A FORWARD -p tcp -m iprange–src-range 192.168.4.21-192.168.4.28 -j ACCEPT向 FORWARD 链中添加一个条目-p 协议 匹配tcp协议的-m 模块iprange ip范围 这个模块是来识别这个语法的192.168.4.21-192.168.4.28 -j ACCEPT 允许 iptables -A INPUT -m mac–mac-source 00:0c:29:C0:55:3f -j DROP在INPUT 中加入一条 拒绝 来源 这个mac 地址的 策略 来自这个mac地址的 流量 拒绝 防火墙主要工作于网络层针对ip包处理的,但是对于mac动作相对比较少,那就要求指明用什么模块来识别这样的信息 -m m就是mod 模块的意思 也就是通过mac这个模块 来识别这个mac地址 –mac-source 源mac地址 通过mac这个模块 识别 源 mac地址 匹配这个条件的 就DROP 通用匹配:属于最常用的东西了 不需要指定模块 包括网络协议、IP地址、网络接口等条件 隐含匹配 比通用匹配 涉及的更细一点 但也是最常用的 也需要指定相关的模块 统统称为隐含匹配 常见的通用匹配条件 协议匹配: -p 协议名 (后面跟上协议) 地址匹配: -s 源地址(source来源的意思 后面跟源地址) -d 目的地址(destination目标的意思 后面跟目标地址) 接口匹配: -i 入站网卡(in进代表从那个网卡进) -o 出站网卡(out出 代表从那个网卡出) iptables -l INPUT -p icmp -j DROP向INPUT链中 -l 插入一个条目 匹配icmp 协议的流量 将被DROP拒绝 iptables -A FORWARD ! -p icmp -j ACCEPT向 FORWARD 链中 追加一个条目 !的意识是反转 除了 icmp 协议的流量 都是ACCEPT 允许的 iptables -A FORWARD -s 192.168.1.11 -j REJECT向 FORWARD 链中追加一个条目 -s 来源192.168.1.11 ip 的流量 将被REJECT 拒绝并告知 iptables -l INPUT -s 10.20.30.0/24 -j DROP向INPUT 链中 插入一个条目 -s 来自10.20.30.0/24网段中的流量将被DROP 拒绝 iptables -A INPUT -I eth1 -s 192.168.0.0/16 -j DROP iptables -A INPUT -l eth1 -s 10.0.0.0/8 -j DROP iptables -A INPUT -l eth1 -s 172.16.0.0/12 -j DROP 来自192.168.0.0/16 网段的 并且从 eth1 网卡进来的 将被DROP 拒绝 来自10.0.0.0/8 网段的 并且从 eth1 网卡进来的 将被DROP 拒绝 来自172.16.0.0/12 网段的 并且从 eth1 网卡进来的 将被DROP 拒绝 常见的隐含匹配条件 端口匹配:--sport 源端口、--dport 目的端口 TCP标记匹配:--tcp-flags 检查范围 被设置的标记 ICMP类型匹配:--icmp-type ICMP类型 iptables -A FORWARD -s 192.168.4.0/24 -p udp --dport 53 -j ACCEPT向 FORWARD 链中 追加一个条目 来自192.168.4.0/24 网段的 并且目标端口是udp 53的 将被ACCEPT 允许 iptables -A INPUT -p tcp --dport 20:21 -j ACCEPT向 INPUT 链中 追加一个条目 目标端口是tcp 20到21 的将被ACCEPT 允许 如果是连续的 就不用加模块了-m 冒号: 是连续的意思 比如1:100 1号端口到100号端口 如果中间加逗号,的话 就不能正常识别 需要加模块-m 比如1,50,80,21,22,23, 协议的话 一共有五层 应用层 传输层 网络层 数据链路层 物理层 传输层协议有tcp和udp 网络层协议有 icmp ip arp arp 一般不用管他 ip协议 不用写 直接写源ip和目标ip就可以了 tcp udp 一般情况配合端口使用 icmp 分很多类型 其中ping请求 过去的报文 ping响应 回来的报文 这两个是有区分的 如果我要识别ping的请求 对应编号是8 ping响应 对应的编号是0 还有不可达的 不可达 就是我现在去访问人家的时候 我发了去访问目标那个主机 结果到这个路由器的时候 路由不到了 或者主机访问不到了 这个路由器 就返回一个消息 回来 给源主机说不可达 这个消息 对我们来讲往往 是有用的 接受不接受这个消息 和icmp的响应包 是一样做处理的 一般都会接受 iptables -A INPUT -p icmp --icmp-type 8 -j DROP8代表请求 iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT0代表响应 iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT3代表不可达 iptables -A INPUT -p icmp -j DROP的 iptables -A INPUT -p tcp -m state --state ESTABLISHED -j ACCEPTESTABLISHED 已建立连接的或响应报文:两个主机之间首先通信之前tcp的三次握手,发请求出去,对方给我响应包,ESTABLISHE 就包括响应包 在建立建立完后 后面是通信过程 因为已经建立连接了 通信过程就是被允许的了 ESTABLISHE 代表已建立连接的或响应报文(不包括请求报文) 将设置的保存到 某个目录 iptables-save > /opt/iptsave 储存 上图红圈内的-m icmp -m tcp 他们也是模块 常用协议 所有不用写 这属于隐藏模块 想改的话 可以直接在里面更改 增删改查 都可以 想让他生效 iptables-restore < /opt/iptrestore 恢复 systemctl disable firewalld禁用防火墙 disable 禁用 使丧失能力,使伤残;使无效,使不能运转;使无资格 设置开机启动iptables防火墙 先禁用 systemctl disable firewalld保存 已经设置的iptables 防火墙 iptables vaes > /opt/ipt vim /etc/rz.d/rc.local添加一条 iptables-restore < /opt/ipt保存退出 chmod +x /etc/rc.d/rc.local vim /etc/rz.d/rc.local #这个文件是个脚本