linux防火墙

Posted 一叶知秋~~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux防火墙相关的知识,希望对你有一定的参考价值。

安全技术

 入侵检测与管理系统IDS(Intrusion Detection Systems):特点是不阻断任何网络访问,量化、定位来自内外网络的威胁情况,主要以提供报告和事后监督为主,提供有针对性的指导措施和安全决策依据。一般采用旁路部署方式。

入侵防御系统IPS(Intrusion Prevention System):以透明模式工作,分析数据包的内容如:溢出攻击、拒绝服务攻击、木马、蠕虫、系统漏洞等进行准确的分析判断,在判定为攻击行为后立即予以阻断,主动而有效的保护网络的安全,一般采用在线部署方式。

防火墙( FireWall ):隔离功能,工作在网络或主机边缘,对进出网络或主机的数据包基于一定的规则检查,并在匹配某规则时由规则定义的行为进行处理的一组功能的组件,基本上的实现都是默认情况下关闭所有的通过型访问,只开放允许访问的策略。

防火墙的分类

防火墙的分类

(1)主机防火墙:服务范围为当前主机
    网络防火墙:服务范围为防火墙一侧的局域网
(2)硬件防火墙:在专用硬件级别实现部分功能的防火墙;另一个部分功能基于软件实现,如:Checkpoint,NetScreen
    软件防火墙:运行于通用硬件平台之上的防火墙的应用软件
(3)网络层防火墙:OSI模型下四层
    应用层防火墙/代理服务器:代理网关,OSI模型七层

网络层防火墙

包过滤防火墙
网络层对数据包进行选择,选择的依据是系统内设置的过滤逻辑,被称为访问控制列表(ACL),通过检查数据流中每个数据的源地址,目的地址,所用端口号和协议状态等因素,或他们的组合来确定是否允许该数据包通过
优点:对用户来说透明,处理速度快且易于维护
缺点:无法检查应用层数据,如病毒等

 

应用层防火墙

应用层防火墙/代理服务型防火墙(Proxy Service)
将所有跨越防火墙的网络通信链路分为两段
内外网用户的访问都是通过代理服务器上的“链接”来实现
优点:在应用层对数据进行检查,比较安全
缺点:增加防火墙的负载

 

现实生产环境中所使用的防火墙一般都是二者结合体

即先检查网络数据,通过之后再送到应用层去检查

iptables的基本认识

Netfilter组件

内核空间,集成在linux内核中
官网文档:https://netfilter.org/documentation/
扩展各种网络服务的结构化底层框架
内核中选取五个位置放了五个hook(勾子) function(INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING),而这五个hook function向用户开放,用户可以通过一个命令工具(iptables)向其写入规则
由信息过滤表(table)组成,包含控制IP包处理的规则集(rules),规则被分组放在链(chain)上

三种报文流向:

流入本机:PREROUTING --> INPUT-->用户空间进程
流出本机:用户空间进程 -->OUTPUT--> POSTROUTING
转发:PREROUTING --> FORWARD --> POSTROUTING

访问HTTPD服务时,需要对HTTPD服务进行安全控制:要求只能让1号机器进行访问,而2机器不能访问?

最合理的设置位置就是在INPUT位置设置1机器允许访问,2机器进行拒绝,而如果设置在prerouting位置时,如果机器2需要穿过linux router去到达另一个主机就无法到达,此配置不合理,如果配置在OUTPUT位置时,就会使HTTPD服务无法访问右侧的主机。

防火墙工具

iptables

命令行工具,工作在用户空间
用来编写规则,写好的规则被送往netfilter,告诉内核如何去处理信息包

firewalld

CentOS 7 引入了新的前端管理工具

管理工具:

firewall-cmd 命令行
firewall-config 图形

iptables的组成

iptables由五个表和五个链以及一些规则组成

五个表table:filter、nat、mangle、raw、security

filter表:过滤规则表,根据预定义的规则过滤符合条件的数据包
nat表:network address translation 地址转换规则表
mangle:修改数据标记位规则表
raw:关闭NAT表上启用的连接跟踪机制,加快封包穿越防火墙速度
security:用于强制访问控制(MAC)网络规则,由Linux安全模块(如SELinux)实现
优先级由高到低的顺序为:security -->raw-->mangle-->nat-->filter

五个内置链chain

INPUT
OUTPUT
FORWARD
PREROUTING
POSTROUTING

 Netfilter表和链对应关系 

 

 在linux中查看表有几种类型的链,可以使用tab键补全查看链信息。

 数据包过滤匹配流程

 IPTABLES和路由

路由功能发生的时间点

报文进入本机后

      •判断目标主机是否为本机
            是:INPUT
            否:FORWARD

报文离开本机之前

•判断由哪个接口送往下一跳

内核中数据包的传输过程

内核中数据包的传输过程

当一个数据包进入网卡时,数据包首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转送出去
如果数据包就是进入本机的,数据包就会沿着图向下移动,到达INPUT链。数据包到达INPUT链后,任何进程都会收到它。本机上运行的程序可以发送数据包,这些数据包经过OUTPUT链,然后到达POSTROUTING链输出
如果数据包是要转发出去的,且内核允许转发,数据包就会向右移动,经过FORWARD链,然后到达POSTROUTING链输出

iptables规则 

规则rule:根据规则的匹配条件尝试匹配报文,对匹配成功的报文根据规则定义的处理动作作出处理

匹配条件:默认为与条件,同时满足

基本匹配:IP,端口,TCP的Flags(SYN,ACK等)
扩展匹配:通过复杂高级功能匹配

处理动作:称为target,跳转目标

内建处理动作:ACCEPT,DROP,REJECT,SNAT,DNATMASQUERADE,MARK,LOG...
自定义处理动作:自定义chain,利用分类管理复杂情形

规则要添加在链上,才生效;添加在自定义上不会自动生效

链chain:
    内置链:每个内置链对应于一个钩子函数
    自定义链:用于对内置链进行扩展或补充,可实现更灵活的规则组织管理机制;只有Hook钩子调用自定义链时,才生效

iptables添加要点

iptables规则添加时考量点

 要实现哪种功能:判断添加在哪张表上
 报文流经的路径:判断添加在哪个链上
 报文的流向:判断源和目的
 匹配规则:业务需要

实验环境准备:

Centos7:

systemctl stop firewalld.service
systemctl disable firewalld. service

Centos6:

service iptables stop
chkconfig iptables off

查看防火墙规则是否清干净?此时没有清干净,是因为有虚拟网卡存在导致(virbr0驱动存在,需要卸载)

[root@centos777~]#iptables -vnL   查看表所有链内容,还有其他部分信息
Chain INPUT (policy ACCEPT 1289 packets, 127K bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     udp  --  virbr0 *       0.0.0.0/0            0.0.0.0/0            udp dpt:53
    0     0 ACCEPT     tcp  --  virbr0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:53
    0     0 ACCEPT     udp  --  virbr0 *       0.0.0.0/0            0.0.0.0/0            udp dpt:67
    0     0 ACCEPT     tcp  --  virbr0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:67

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     all  --  *      virbr0  0.0.0.0/0            192.168.122.0/24     ctstate RELATED,ESTABLISHED
    0     0 ACCEPT     all  --  virbr0 *       192.168.122.0/24     0.0.0.0/0           
    0     0 ACCEPT     all  --  virbr0 virbr0  0.0.0.0/0            0.0.0.0/0           
    0     0 REJECT     all  --  *      virbr0  0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
    0     0 REJECT     all  --  virbr0 *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable

Chain OUTPUT (policy ACCEPT 1018 packets, 103K bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     udp  --  *      virbr0  0.0.0.0/0            0.0.0.0/0            udp dpt:68
[root@centos777~]#ip a  可以看到有virbr0的虚拟网卡驱动
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:f4:9f:15 brd ff:ff:ff:ff:ff:ff
    inet 192.168.34.102/24 brd 192.168.34.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fef4:9f15/64 scope link 
       valid_lft forever preferred_lft forever
4: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
    link/ether 52:54:00:9d:62:0a brd ff:ff:ff:ff:ff:ff
    inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
       valid_lft forever preferred_lft forever
5: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN group default qlen 1000
    link/ether 52:54:00:9d:62:0a brd ff:ff:ff:ff:ff:ff

卸载虚拟网卡驱动,卸载完之后LINUX系统重新启动

[root@centos777~]#yum remove libvirt-daemon -y
[root@centos777~]#reboot

此时查看防火墙情况,已经全部清空。

iptables命令

man 8 iptables
iptables [-t table] {-A|-C|-D} chain rule-specification
iptables [-t table] -I chain [rulenum] rule-specification
iptables [-t table] -R chain rulenum rule-specification
iptables [-t table] -D chain rulenum
iptables [-t table] -S [chain [rulenum]]
iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]
iptables [-t table] -N chain
iptables [-t table] -X [chain]
iptables [-t table] -P chain target
iptables [-t table] -E old-chain-name new-chain-name
rule-specification = [matches...] [target]
match = -m matchname [per-match-options]
target = -j targetname [per-target-options]

简单示例  

Filter表中INPUT规则

规则格式:iptables [-t table] SUBCOMMAND chain [-m matchname [per-match-options]] -j targetname [per-target-options]

-t table:

 raw, mangle, nat, [filter]默认

SUBCOMMAND:

  1、链管理:

-N:new, 自定义一条新的规则链
-X:delete,删除自定义的空的规则链
-P:Policy,设置默认策略;对filter表中的链而言,其默认策略有:
ACCEPT:接受
DROP:丢弃
-E:重命名自定义链;引用计数不为0的自定义链不能够被重命名,也不能被删除

示例:

A主机:192.168.34.101

B主机:192.168.34.102

(1)在A主机设置防火墙功能,丢弃掉B主机的访问信息

[root@centos7]#iptables -t filter -A INPUT -s 192.168.34.102 -j DROP

(2)在B主机pingA主机,此时无反应,可以怀疑是A主机配置规则问题

[root@centos777~]#ping 192.168.34.101
PING 192.168.34.101 (192.168.34.101) 56(84) bytes of data.

(3)在A主机开始进行抓包排错,可以看到只有B主机pingA主机的信息,没有A主机返回B主机的信息,说明是A主机的配置问题;如果B主机PING的时候A主机未收到,就是中间网络问题,可以判断问题出在哪里

[root@centos7network-scripts]#tcpdump -i ens33 -nn host 192.168.34.102    此时只可以看到只有B主机Ping到A主机的信息,没有A主机到B主机的信息,就可以怀疑是B主机设置规则问题
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes
14:45:54.717118 IP 192.168.34.102 > 192.168.34.101: ICMP echo request, id 7494, seq 197, length 64
14:45:55.717241 IP 192.168.34.102 > 192.168.34.101: ICMP echo request, id 7494, seq 198, length 64
14:45:56.717162 IP 192.168.34.102 > 192.168.34.101: ICMP echo request, id 7494, seq 199, length 64
14:45:57.717258 IP 192.168.34.102 > 192.168.34.101: ICMP echo request, id 7494, seq 200, length 64
14:45:58.717378 IP 192.168.34.102 > 192.168.34.101: ICMP echo request, id 7494, seq 201, length 64

(4)已经排查出是A主机规则问题,没有返回给B主机内容,清空A主机的防火墙规则

[root@centos7network-scripts]#iptables -F

(5)此时B主机就可以ping通

[root@centos777~]#ping 192.168.34.101
PING 192.168.34.101 (192.168.34.101) 56(84) bytes of data.
64 bytes from 192.168.34.101: icmp_seq=721 ttl=64 time=0.721 ms
64 bytes from 192.168.34.101: icmp_seq=722 ttl=64 time=0.429 ms
64 bytes from 192.168.34.101: icmp_seq=723 ttl=64 time=0.477 ms
64 bytes from 192.168.34.101: icmp_seq=724 ttl=64 time=0.630 ms
64 bytes from 192.168.34.101: icmp_seq=725 ttl=64 time=0.424 ms

2、查看:

-L:list, 列出指定鏈上的所有规则,本选项须置后
-n:numberic,以数字格式显示地址和端口号
-v:verbose,详细信息
-vv 更详细
-x:exactly,显示计数器结果的精确值,而非单位转换后的易读值
--line-numbers:显示规则的序号

常用组合:

-vnL
-vvnxL --line-numbers
-S selected,以iptables-save 命令格式显示链上规则

3、规则管理:

-A:append,追加
-I:insert, 插入,要指明插入至的规则编号,默认为第一条
-D:delete,删除
(1) 指明规则序号
(2) 指明规则本身
-R:replace,替换指定链上的指定规则编号
-F:flush,清空指定的规则链
-Z:zero,置零

iptables的每条规则都有两个计数器

     (1) 匹配到的报文的个数

     (2) 匹配到的所有报文的大小之和

chain:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING

示例:

(1)定义三条防火墙规则

[root@centos7~]#iptables -A INPUT -s 192.168.34.102 -j REJECT
[root@centos7~]#iptables -A INPUT -s 192.168.34.100 -j REJECT
[root@centos7~]#iptables -A INPUT -s 192.168.34.103 -j REJECT

(2)删除第一条规则

[root@centos7~]#iptables -vnL --line-numbers  查看防火墙规则全部信息
Chain INPUT (policy ACCEPT 76 packets, 5484 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 REJECT     all  --  *      *       192.168.34.102       0.0.0.0/0            reject-with icmp-port-unreachable
2        0     0 REJECT     all  --  *      *       192.168.34.100       0.0.0.0/0            reject-with icmp-port-unreachable
3        0     0 REJECT     all  --  *      *       192.168.34.103       0.0.0.0/0            reject-with icmp-port-unreachable

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 49 packets, 5340 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
[root@centos7~]#iptables -D  INPUT  1   删除第一条规则
[root@centos7~]#iptables -vnL --line-numbers
Chain INPUT (policy ACCEPT 5 packets, 356 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 REJECT     all  --  *      *       192.168.34.100       0.0.0.0/0            reject-with icmp-port-unreachable
2        0     0 REJECT     all  --  *      *       192.168.34.103       0.0.0.0/0            reject-with icmp-port-unreachable

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 4 packets, 416 bytes)
num   pkts bytes target     prot opt in     out     source               destination   

 (3)插入一个防火墙规则,默认插入到第一条规则上

[root@centos7~]#iptables -I INPUT -s 192.168.34.105 -j REJECT
[root@centos7~]#iptables -vnL --line-numbers
Chain INPUT (policy ACCEPT 50 packets, 3648 bytes)
num pkts bytes target prot opt in out source destination 
1 0 0 REJECT all -- * * 192.168.34.105 0.0.0.0/0 reject-with icmp-port-unreachable   192.168.34.105禁止的规则在第一条
2 0 0 REJECT all -- * * 192.168.34.100 0.0.0.0/0 reject-with icmp-port-unreachable
3 0 0 REJECT all -- * * 192.168.34.103 0.0.0.0/0 reject-with icmp-port-unreachable

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination

Chain OUTPUT (policy ACCEPT 34 packets, 3040 bytes)
num pkts bytes target prot opt in out source destination 

(4)追加一条防火墙规则,默认加在最后一条

[root@centos7~]#iptables -A INPUT -s 192.168.34.8 -j REJECT
[root@centos7~]#iptables -vnL --line-numbers
Chain INPUT (policy ACCEPT 53 packets, 4044 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 REJECT     all  --  *      *       192.168.34.105       0.0.0.0/0            reject-with icmp-port-unreachable
2        0     0 REJECT     all  --  *      *       192.168.34.100       0.0.0.0/0            reject-with icmp-port-unreachable
3        0     0 REJECT     all  --  *      *       192.168.34.103       0.0.0.0/0            reject-with icmp-port-unreachable
4        0     0 REJECT     all  --  *      *       192.168.34.8         0.0.0.0/0            reject-with icmp-port-unreachable

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 38 packets, 3512 bytes)
num   pkts bytes target     prot opt in     out     source               destination  

  插入到指定的编号,默认的编号1会自动下调,将访问频次高的放前面,此项比较重要,如果192.168.34.0/24网段被拒绝,就无法远程连接,加上此选项:windows远程就能连接

[root@centos7~]#iptables -I INPUT 1 -s 192.168.34.1 -j ACCEPT

  替换之前写错指定编号的内容,可以重新写

[root@centos7~]#iptables -R INPUT 2 -s 192.168.34.8 -j REJECT

 清空计数规则

[root@centos7~]#iptables -Z INPUT

匹配条件

基本:通用的,PARAMETERS
扩展:需加载模块,MATCH EXTENTIONS

1、基本匹配条件:无需加载模块,由iptables/netfilter自行提供

[!] -s, --source address[/mask][,...]:源IP地址或范围
[!] -d, --destination address[/mask][,...]:目标IP地址或范围
[!] -p, --protocol protocol:指定协议,可使用数字如0(all)
protocol: tcp, udp, icmp, icmpv6, udplite,esp, ah, sctp, mh or“all“

参看:/etc/protocols

[!] -i, --in-interface name:报文流入的接口;只能应用于数据报文流入环节,只应用于INPUT、FORWARD、PREROUTING链
[!] -o, --out-interface name:报文流出的接口;只能应用于数据报文流出的环节,只应用于FORWARD、OUTPUT、POSTROUTING链

示例:

(1)一次可以插入两条规则

[root@centos7~]#iptables -I INPUT 3 -s 192.168.34.8,192.168.34.45 -j REJECT  插入了一个编号的规则,实际显示的是两个规则
[root@centos7~]#iptables -vnL --line-numbers
Chain INPUT (policy ACCEPT 59 packets, 4232 bytes)
num pkts bytes target prot opt in out source destination 
1 0 0 REJECT all -- * * 192.168.34.105 0.0.0.0/0 reject-with icmp-port-unreachable
2 0 0 REJECT all -- * * 192.168.34.100 0.0.0.0/0 reject-with icmp-port-unreachable
3 0 0 REJECT all -- * * 192.168.34.45 0.0.0.0/0 reject-with icmp-port-unreachable  显示3和4规则
4 0 0 REJECT all -- * * 192.168.34.8 0.0.0.0/0 reject-with icmp-port-unreachable
5 0 0 REJECT all -- * * 192.168.34.103 0.0.0.0/0 reject-with icmp-port-unreachable
6 0 0 REJECT all -- * * 192.168.34.8 0.0.0.0/0 reject-with icmp-port-unreachable

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination

Chain OUTPUT (policy ACCEPT 39 packets, 3748 bytes)
num pkts bytes target prot opt in out source destination

 (2)全部拒绝访问规则,允许规则内的IP地址访问,生产中可以将不是公司内部的IP地址全部进行拒绝访问,只允许指定的IP地址和lo回环网卡的IP地址访问即可。

[root@centos7~]#iptables -A INPUT -s 192.168.34.1 -j ACCEPT  加入本地windows系统的IP地址,否则无法远程连接
[root@centos7~]#iptables -A INPUT -s 192.168.34.102 -j ACCEPT
[root@centos7~]#iptables -A INPUT -s 192.168.34.101 -j ACCEPT
[root@centos777~]#iptables -A INPUT -j REJECT           拒绝所有的IP地址访问,只有在规则内的IP地址才能访问
[root@centos777~]#iptables -I INPUT 5 -s 192.168.34.102,127.0.0.1 -j ACCEPT  可以允许192.168.34.102和回环网卡访问
[root@centos777~]#iptables -A INPUT -i lo -j ACCEPT    加上回环网卡IP地址,需要自己连接上,避免自己无法连接

   查看规则信息

[root@centos7~]#iptables -vnL --line-numbers
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1      277 20776 ACCEPT     all  --  *      *       192.168.34.1         0.0.0.0/0           
2        0     0 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           
3        1    67 ACCEPT     all  --  *      *       192.168.34.102       0.0.0.0/0           
4        1    67 ACCEPT     all  --  *      *       192.168.34.101       0.0.0.0/0           
5        0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable

(3)清除OUTPUT规则

[root@centos777~]#iptables -F OUTPUT

  

  

  

  

  

  

 

 

  

 

  

  

 

  

  

  

  

 

 

 

 

 

 

 

 

以上是关于linux防火墙的主要内容,如果未能解决你的问题,请参考以下文章

linux打开终端如何启动scala,如何在终端下运行Scala代码片段?

Android 逆向Linux 文件权限 ( Linux 权限简介 | 系统权限 | 用户权限 | 匿名用户权限 | 读 | 写 | 执行 | 更改组 | 更改用户 | 粘滞 )(代码片段

linux中怎么查看mysql数据库版本

Linux下单机安装部署kafka及代码实现

Linux中iptables防火墙指定端口范围

-bash: /usr/bin/ls: /lib64/ld-linux-x86-64.so.2: bad ELF interpreter: No such file or directory(代码片段