防火墙好比一堵真的墙,能够隔绝些什么,保护些什么。
防火墙的本义是指古代构筑和使用木制结构房屋的时候,为防止火灾的发生和蔓延,人们将坚固的石块堆砌在房屋周围作为屏障,这种防护构筑物就被称之为“防火墙”。其实与防火墙一起起作用的就是“门”。
如果没有门,各房间的人如何沟通呢,这些房间的人又如何进去呢?当火灾发生时,这些人又如何逃离现场呢?
这个门就相当于我们这里所讲的防火墙的“安全策略”,所以在此我们所说的防火墙实际并不是一堵实心墙,而是带有一些小孔的墙。
这些小孔就是用来留给那些允许进行的通信,在这些小孔中安装了过滤机制,就是防火墙的过滤策略了。
防火墙具有很好的保护作用。入侵者必须首先穿越防火墙的安全防线,才能接触目标计算机。
防火墙对流经它的网络通信进行扫描,这样能够过滤掉一些攻击,以免其在目标计算机上被执行。防火墙还可以关闭不使用的端口。而且它还能禁止特定端口的流出通信。
最后,它可以禁止来自特殊站点的访问,从而防止来自不明入侵者的所有通信。
防火墙一般有硬件防火墙和软件防火墙
硬件防火墙:在硬件级别实现部分防火墙功能,另一部分功能基于软件实现,性能高,成本高。
软件防火墙:应用软件处理逻辑运行于通用硬件平台之上的防火墙,性能低,成本低。
Linux提供的软件防火墙,名为iptables
,它可以理解为是一个客户端代理,通过iptables
的代理,将用户配置的安全策略执行到对应的安全框架
中,这个安全框架称之为netfilter
。
iptables是一个命令行的工具,位于用户空间,我们用这个工具操作真正的框架,也就是netfilter
真正实现流量过滤的防火墙框架是netfilter
,位于内核空间,它俩共同组成了Linux的软件防火墙,一般用来代替昂贵的硬件防火墙,实现数据包过滤,网络地址转换等。
在Centos7发行版本下,firewalld防火墙又取代了iptables防火墙
iptables是将配置好的规则交给内核层的netfilter网络过滤器来处理 filrewalld服务是将配置好的防火墙规则交给内核层的nftables网络过滤器处理 这俩工具二选一即可,都只是命令行工具,
iptables就是按照规则办事的,(rules)规则就是运维事先定义好的规则。
[root@chaogelinux tmp]# iptables -L 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
iptables会从上至下的读取防火墙规则,找到匹配的规则后,就结束匹配工作,并且执行对应的动作。
如果读取所有的防火墙规则都没有符合的,就执行默认的规则。
规则一般两种:允许、拒绝。
规则就存储在内核空间的信息包过滤表中,这些规则定义了源地址信息、目的地址、传输的协议类型、服务类型等
当数据包符合规则条件时候,iptables就根据所定义的方法来处理这些数据包,放行accept、拒绝reject、丢弃drop
。
iptables服务吧用于处理或者过滤流量的策略称之为规则,多条规则就组成了一个规则链
,规则链根据数据包处理位置的不同进行分类。
具体5条链如下
正常情况下,服务器内网向外网发出的流量一般是良性可控的,主要处理的都是input链,从外网流入的流量,需要严格把控,能够很大程度防止恶意流量,造成服务器隐患。
防火墙的规则链,这在生活里很常见,例如外卖禁止入内
、禁止小贩入内
、共享单车禁止入内
、车辆进入要登记
等等。
这些校园、小区门口都有一些规则,用于控制外来的人员,这就好比服务器设置的防火墙规则,禁止哪些流量进入。
好比现在有一个人送外卖,直接第一条规则就禁止入内了,外卖小哥只能离开或是想其他办法
现在又来了一个骑着共享单车的想要进入校园,他不是送外卖的,第一条规则通过,但是第二条规则,给他拦下来了。
现在有一个学生要进去校园,两条规则都不符合,如果默认规则是放行,学生则可以直接进入校园。
校园大门口的保安,除了在门上贴上告示,定义一些规则链
以外,在学生进入后还得有一些动作,好比服务器流量进入后,防火墙还得有一些动作去处理流量。
/var/log/message
中记录日志,然后数据包传递给下一个规则,不做处理【drop和reject区别】
例如小明在家里,忽然有陌生人敲门,发现是自己的朋友来找自己出去玩,但是不想去,因此拒绝了他们(这就是reject)
如果小明透过猫眼发现门外是一个坏人敲门,小明闷不吭声,假装自己不在家(这就是drop)
语法 iptables(选项)(参数) 这些选项指定执行明确的动作:若指令行下没有其他规定,该行只能指定一个选项. 对于长格式的命令和选项名,所用字母长度只要保证iptables能从其他选项中区 分出该指令就行了。 -A -append 在所选择的链末添加一条或更多规则。当源(地址)或者/与 目的(地址)转换 为多于一个(多个)地址时,这条规则会加到所有可能的地址(组合)后面。 -D -delete 从所选链中删除一条或更多规则。这条命令可以有两种方法:可以把被删除规则 指定为链中的序号(第一条序号为1),或者指定为要匹配的规则。 -R -replace 从选中的链中取代一条规则。如果源(地址)或者/与 目的(地址)被转换为多地 址,该命令会失败。规则序号从1开始。 -I -insert 根据给出的规则序号向所选链中插入一条或更多规则。所以,如果规则序号为1, 规则会被插入链的头部。这也是不指定规则序号时的默认方式。 -L -list 显示所选链的所有规则。如果没有选择链,所有链将被显示。也可以和z选项一起 使用,这时链会被自动列出和归零。精确输出受其它所给参数影响。 -F -flush 清空所选链。这等于把所有规则一个个的删除。 --Z -zero 把所有链的包及字节的计数器清空。它可以和 -L配合使用,在清空前察看计数器,请参见前文。 -N -new-chain 根据给出的名称建立一个新的用户定义链。这必须保证没有同名的链存在。 -X -delete-chain 删除指定的用户自定义链。这个链必须没有被引用,如果被引用,在删除之前你必须删 除或者替换与之有关的规则。如果没有给出参数,这条命令将试着删除每个非 内建的链。 -P -policy 设置链的目标规则。 -E -rename-chain 根据用户给出的名字对指定链进行重命名,这仅仅是修饰,对整个表的结构没有影响。 TARGETS参数给出一个合法的目标。只有非用户自定义链可以使用规则,而且内建链和用 户自定义链都不能是规则的目标。 -h Help. 帮助。给出当前命令语法非常简短的说明。 p -protocal [!]protocol 规则或者包检查(待检查包)的协议。指定协议可以是tcp、udp、icmp中的一个或 者全部,也可以是数值,代表这些协议中的某一个。当然也可以使用在/etc/pro tocols中定义的协议名。在协议名前加上"!"表示相反的规则。数字0相当于所有 all。Protocol all会匹配所有协议,而且这是缺省时的选项。在和check命令结合 时,all可以不被使用。 -s -source [!] address[/mask] 指定源地址,可以是主机名、网络名和清楚的IP地址。mask说明可以是网络掩码 或清楚的数字,在网络掩码的左边指定网络掩码左边”1”的个数,因此,mask 值为24等于255.255.255.0。在指定地址前加上"!"说明指定了相反的地址段。标志 --src 是这个选项的简写。 -d --destination [!] address[/mask] 指定目标地址,要获取详细说明请参见 -s标志的说明。标志 --dst 是这个选项的简写。 -j --jump target (-j 目标跳转)指定规则的目标;也就是说,如果包匹配应当做什么。目标可以是用 户自定义链(不是这条规则所在的),某个会立即决定包的命运的专用内建目标, 或者一个扩展(参见下面的EXTENSIONS)。如果规则的这个选项被忽略,那么匹 配的过程不会对包产生影响,不过规则的计数器会增加。 -i -in-interface [!] [name] (i -进入的(网络)接口 [!][名称])这是包经由该接口接收的可选的入口名称,包通过 该接口接收(在链INPUT、FORWORD和PREROUTING中进入的包)。当在接口名 前使用"!"说明后,指的是相反的名称。如果接口名后面加上"+",则所有以此接口名 开头的接口都会被匹配。如果这个选项被忽略,会假设为"+",那么将匹配任意接口。 -o --out-interface [!][name] (-o --输出接口[名称])这是包经由该接口送出的可选的出口名称,包通过该口输出(在 链FORWARD、OUTPUT和POSTROUTING中送出的包)。当在接口名前使用"!"说明 后,指的是相反的名称。如果接口名后面加上"+",则所有以此接口名开头的接口都会 被匹配。如果这个选项被忽略,会假设为"+",那么将匹配所有任意接口。 --dport num 匹配目标端口号 --sport num 匹配来源端口号
iptables命令顺序
iptables -t 表名 <-A/I/D/R> 规则链名 [规则号] <-i/o 网卡名> -p 协议名 <-s 源IP/源子网> --sport 源端口 <-d 目标IP/目标子网> --dport 目标端口 -j 动作
表名包括:
规则链名包括:
动作包括:
1.禁止服务器被ping,服务器拒绝icmp的流量,给与响应
#给INPUT链添加规则,指定icmp协议,指定icmp类型 是8(回显请求), -s指定网段范围 -j 跳转的目标,即将做什么 iptables -A INPUT -p icmp --icmp-type 8 -s 0/0 -j REJECT #客户端机器 yumac: ~ yuchao$ping 123.206.16.61 PING 123.206.16.61 (123.206.16.61): 56 data bytes 92 bytes from pyyuc (123.206.16.61): Destination Port Unreachable Vr HL TOS Len ID Flg off TTL Pro cks Src Dst 4 5 00 5400 c4b6 0 0000 33 01 6b31 192.168.11.14 123.206.16.61
2.服务器禁ping,请求直接丢弃
[root@chaogelinux ~]# iptables -F [root@chaogelinux ~]# iptables -A INPUT -p icmp --icmp-type 8 -s 0/0 -j DROP yumac: ~ yuchao$ping 123.206.16.61 PING 123.206.16.61 (123.206.16.61): 56 data bytes Request timeout for icmp_seq 0 Request timeout for icmp_seq 1 Request timeout for icmp_seq 2
3.检查防火墙规则
[root@chaogelinux ~]# iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination DROP icmp -- anywhere anywhere icmp echo-request Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
4.清空所有防火墙规则链
[root@chaogelinux ~]# iptables -F [root@chaogelinux ~]# iptables -L 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
5.注意不要轻易在云服务器上设置,默认拒绝的规则,否则ssh流量进不去,直接断开远程连接了
6.删除第一条规则
[root@chaogelinux ~]# iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination DROP icmp -- anywhere anywhere icmp echo-request Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination [root@chaogelinux ~]# [root@chaogelinux ~]# iptables -D INPUT 1
7.禁止访问本机的80端口
#禁止流量进入,指定tcp类型,拒绝的端口是80,动作是拒绝 iptables -A INPUT -p tcp --dport 80 -j DROP #客户端访问 pythonav.cn
8.禁止服务器的FTP端口,也就是禁止21端口
yumac: ~ yuchao$ftp 123.206.16.61 Connected to 123.206.16.61. 220 (vsFTPd 3.0.2) Name (123.206.16.61:yuchao): chaoge 331 Please specify the password. Password: 230 Login successful. ftp> ls 200 PORT command successful. Consider using PASV. 150 Here comes the directory listing. -rw-r--r-- 1 0 0 0 Jan 08 02:49 haha drwx------ 2 2003 2003 4096 Jan 08 02:50 超哥到此一游 226 Directory send OK. ftp> #服务器禁止21端口流量 [root@chaogelinux ~]# iptables -A INPUT -p tcp --dport 21 -j DROP #此时已经无法连接ftp yumac: ~ yuchao$ftp 123.206.16.61
9.只允许指定的ip远程连接此服务器,拒绝其他主机22端口流量
#iptables自上而下匹配 iptables -A INPUT -s 222.35.242.139/24 -p tcp --dport 22 -j ACCEPT iptables -A INPUT -p tcp --dport 22 -j REJECT [root@chaogelinux ~]# iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT tcp -- 222.35.242.0/24 anywhere tcp dpt:ssh REJECT tcp -- anywhere anywhere tcp dpt:ssh reject-with icmp-port-unreachable Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination #换一台ip的机器,直接被拒绝 [root@web01 ~]# ssh root@123.206.16.61 ssh: connect to host 123.206.16.61 port 22: Connection refused #只要删除第二条拒绝的规则,即可 [root@chaogelinux ~]# iptables -D INPUT 2 #又可以连接了 [root@web01 ~]# ssh root@123.206.16.61
10.禁止指定的机器ip,访问本机的80端口策略,可以封禁某些恶意请求
#此时的防火墙规则 [root@chaogelinux ~]# iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT tcp -- 222.35.242.0/24 anywhere tcp dpt:ssh REJECT tcp -- anywhere anywhere tcp dpt:ssh reject-with icmp-port-unreachable Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination #在规则链开头,追加一个新规则,禁止某个ip地址,访问本机的80端口 [root@chaogelinux ~]# iptables -I INPUT -p tcp -s 222.35.242.139/24 --dport 80 -j REJECT [root@chaogelinux ~]# iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination REJECT tcp -- 222.35.242.0/24 anywhere tcp dpt:http reject-with icmp-port-unreachable ACCEPT tcp -- 222.35.242.0/24 anywhere tcp dpt:ssh REJECT tcp -- anywhere anywhere tcp dpt:ssh reject-with icmp-port-unreachable Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination [root@chaogelinux ~]# #此时已经无法访问 yumac: ~ yuchao$curl 123.206.16.61 curl: (7) Failed to connect to 123.206.16.61 port 80: Connection refused
11.禁止所有的主机网段,访问本机的8000~9000的端口
[root@chaogelinux ~]# iptables -A INPUT -p tcp -s 0/0 --dport 8000:9000 -j REJECT [root@chaogelinux ~]# [root@chaogelinux ~]# [root@chaogelinux ~]# iptables -A INPUT -p udp -s 0/0 --dport 8000:9000 -j REJECT
防火墙是 Linux 系统的主要的安全工具,可以提供基本的安全防护,在 Linux 历史上已经使用过的防火墙工具包括:ipfwadm、ipchains、iptables。在 Firewalld 中新引入了区域(Zones)这个概念。
firewalld通过将网络划分为不同的区域,制定出不同的区域之间访问控制策略。
例如公网环境是不可信任的区域,企业内网是高度信任的区域。
例如公共WIFI完全不受信任,家庭网一般完全可信。
firewalld 提供了支持网络 / 防火墙区域 (zone) 定义网络链接以及接口安全等级的动态防火墙管理工具
它支持 IPv4, IPv6 防火墙设置以及以太网桥接,并且拥有运行时配置和永久配置选项。
这个区域指的就是firewalld预先配置好的防火墙策略模板,用户根据不同的场景选择合适的策略模板。
例如我们一台机器可能会运行在不同的环境,公司中,咖啡馆,家庭。
免费的公共wifi就等同于你把你的车敞开车门停在停车场内,你可以想象下有多不安全。所以在公共场所使用免费wifi时不要使用网上银行,因为电脑黑客无处不在。
如果来回切换多个环境,我们就得反复修改规则,很是麻烦,因此firewalld提供了防火墙规则模板,我们只需要切换不同的区域,即可实现不同的防火墙规则,很是方便。
zone区域 | 策略 |
---|---|
drop(丢弃) | 任何接收的网络数据包都被丢弃,没有任何回复。仅能有发送出去的网络连接。 |
block(限制) | 任何接收的网络连接都被 IPv4 的 icmp-host-prohibited 信息和 IPv6 的 icmp6-adm-prohibited 信息所拒绝。 |
public(公共) | 在公共区域内使用,不能相信网络内的其他计算机不会对您的计算机造成危害,只能接收经过选取的连接。 |
external(外部) | 特别是为路由器启用了伪装功能的外部网。您不能信任来自网络的其他计算,不能相信它们不会对您的计算机造成危害,只能接收经过选择的连接。 |
dmz(非军事区) | 用于您的非军事区内的电脑,此区域内可公开访问,可以有限地进入您的内部网络,仅仅接收经过选择的连接。 |
work(工作) | 用于工作区。您可以基本相信网络内的其他电脑不会危害您的电脑。仅仅接收经过选择的连接。 |
home(家庭) | 用于家庭网络。您可以基本信任网络内的其他计算机不会危害您的计算机。仅仅接收经过选择的连接。 |
internal(内部) | 用于内部网络。同于home |
trusted(信任) | 可接受所有的网络连接。 |
说明:firewalld 的缺省区域是 public。 |
启动CentOS/RHEL 7后,防火墙规则设置由firewalld服务进程默认管理。
[root@chaogelinux ~]# systemctl status firewalld ● firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled) Active: inactive (dead) Docs: man:firewalld(1)
一个叫做firewall-cmd的命令行客户端支持和这个守护进程通信以永久修改防火墙规则。
# firewall-cmd --list-all-zones #查看所有的zone信息 # firewall-cmd --get-default-zone #查看默认zone是哪一个 # firewall-cmd --zone=internal --change-zone=p3p1 #临时修改接口p3p1所属的zone为internal # firewall-cmd --add-service=http #暂时开放http # firewall-cmd --permanent --add-service=http #永久开放http # firewall-cmd --zone=public --add-port=80/tcp --permanent #在public中永久开放80端口 # firewall-cmd --permanent --zone=public --remove-service=ssh #从public zone中移除服务 # firewall-cmd --reload #重新加载配置
有关firewalld-cmd命令可以这么查看
[root@chaogelinux ~]# firewall-cmd --help
需要注意的是,firewalld配置的策略是运行时生效(Runtime)
,系统重启,配置也就丢失了
可以在配置参数的时候,添加--permanent
参数,防火墙配置永久生效
案例
# firewall-cmd --zone=public --add-port=80/tcp --permanent #开放80 端口 --zone #作用域 --add-port=80/tcp #添加端口,格式为:端口/通讯协议 --permanent #永久生效,没有此参数重启后失效
[root@chaogelinux ~]# firewall-cmd --get-default-zone #服务没有运行 FirewallD is not running #启动服务 systemctl start firewalld
1.检查当前firewalld的区域
[root@chaogelinux ~]# firewall-cmd --get-default-zone public
2.设置当前区域为家庭区域,个人学习时候,还是使用public
[root@chaogelinux ~]# firewall-cmd --set-default-zone=home success [root@chaogelinux ~]# firewall-cmd --get-default-zone home [root@chaogelinux ~]# firewall-cmd --set-default-zone=home success
3.永久修改eth0网卡为public家庭区域
[root@chaogelinux ~]# firewall-cmd --permanent --zone=public --change-interface=eth0 success #改完了重新加载服务 [root@chaogelinux ~]# firewall-cmd --reload success [root@chaogelinux ~]# firewall-cmd --permanent --zone=public --change-interface=eth0 success #查询eth0网卡默认区域 [root@chaogelinux ~]# firewall-cmd --get-zone-of-interface=eth0 home
4.拒绝所有流量包
慎用,会断开ssh流量,一般用于服务器被恶意攻击
firewall-cmd --panic-on #立刻回断开所有的流量连接 firewall-cmd --panic-off #解封
5.查询public区域是否允许了
#防火墙允许ssh通过 [root@chaogelinux ~]# firewall-cmd --zone=public--query-service=ssh yes #防火墙是否允许了http服务 [root@chaogelinux ~]# firewall-cmd --zone=public --query-service=http no #此时服务器的80端口是无法访问的 #防火墙是否允许了ftp服务 [root@chaogelinux ~]# firewall-cmd --zone=public --query-service=ftp no
修改firewalld规则,允许http,ftp服务通过,永久生效
添加参数--permanent
则是永久生效,必须得重启
#临时配置,立即生效 [root@chaogelinux ~]# firewall-cmd --zone=public --add-service=http success #永久配置,需要reload [root@chaogelinux ~]# firewall-cmd --permanent --zone=public --add-service=http success [root@chaogelinux ~]# firewall-cmd --reload success #永久配置ftp规则允许通过 [root@chaogelinux ~]# firewall-cmd --permanent --zone=public --add-service=ftp success [root@chaogelinux ~]# firewall-cmd --reload success #如果拒绝就删除即可,永久删除,也得reload重新加载 [root@chaogelinux ~]# firewall-cmd --permanent --zone=public --remove-service=ftp success [root@linuxprobe ~]# firewall-cmd --reload success
临时打开某个端口的访问策略
[root@chaogelinux ~]# firewall-cmd --zone=public --add-port=8000-9000/tcp success #列出端口情况 [root@chaogelinux ~]# firewall-cmd --zone=public --list-ports 8000-9000/tcp
【防火墙端口转发】
如下管理命令
#列出home区域的端口转发情况 [root@chaogelinux ~]# firewall-cmd --permanent --zone=public --list-forward-ports #转发语句,将23344端口的流量,转发给22端口 [root@chaogelinux ~]# firewall-cmd --permanent --zone=public --add-forward-port=port=23344:proto=tcp:toport=22:toaddr=192.168.178.185 success #记住,firewalld 加上--permanent参数,必须reload才行 [root@chaogelinux ~]# firewall-cmd --reload success #如要删除转发语句 firewall-cmd --permanent --zone=public --remove-forward-port=port=23344:proto=tcp:toport=22:toaddr=192