linux下的防火墙

Firewall是一种隔离工具,工作于主机或网络的边缘,对经由的报文根据预先定义的规则(识别条件)进行检测,对于能够被规则匹配到的报文实行某预定义的处理机制的一套组件,主要有以下四种:

硬件防火墙:在硬件级别能部分防火墙,另一部分功能基于软件实现;
软件防火墙:应用软件处理逻辑运行通用硬件实现的防火墙;
主机防火墙:服务范围为当前主机;
网络防火墙:服务范围为局域网;

本文将介绍的是防火墙工具iptables。

1.iptables结构

iptables由五个表和五个链以及一些规则组成:
五个表table:filter、nat、mangle、raw、security:

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

五个内置链chain:

INPUT
OUTPUT
FORWARD
PREROUTING
POSTROUTING

对于网络中的报文,分为两种,一种是到本主机的报文,一种是经由本主机的转发报文,对于到本主机的报文,在内核中的传输过程是这样的,首先数据包会PREROUTING进入主机,在内核中进入tcp/ip协议栈,在这里会检查这个数据包的目的ip,查看是否是发送给本主机的,如果是发送给本主机的,会进入INPUT链,

2.iptables基本语法匹配规则

iptables的语法主要有三部分,第一部分是定义操作,第二不会是检查条件,第三步是是处理动作。
首先说一下对链的操作:

-P 定义某张表的某条链的默认策略
-N 新建一条自定义的规则链,但自定义规则链只有在被主链调用时才能生效
-X 删除引用数为0的自定义规则链
-F 清空某张表的某条链,不指定是清空某张表的所有的表规则
-E 重命名某条引用为0的自定义规则链
-L 列出某张表某条链的所以规则,不指定时列出所有的表规则
-v 详细显示表规则
-n 不进行地址解析

操作有以下几个选项:

-A 追加,在某一表的某一条链上追加一条规则
-I 插入,在某一张表的某一条链的特定位置插入一条规则
-D 删除,删除某一个表的某一条链的规则
-R 替换,用某一条规则替换掉某张表的某条规则

检查条件有一下几项:

-s 检查报文中的源ip地址是否符合此处指定的ip地址范围
-d 检查报文中的目的ip地址是否符合此处指定的ip地址范围
-i 检查报文的流入借口
-o 检查报文的流出借口
-p 检查报文的协议是否符合此处指定的协议

1.主链
可以看下面这些例子:
查看filter表的表规则:

我们先保证ssh能够连接,这样不管我们怎么修改,都不会让我们的xshell连接不上,命令如下:

 iptables -t filter -A INPUT 1 -d 192.168.123.44/24 -p tcp -i ens34 --dport 22 -j ACCEPT
 iptables -t filter -A OUTPUT -s 192.168.123.44/24 -p tcp -o ens34 --sport 22 -j ACCEPT

执行结果如下:

然后把默认规则设置为DROP,表的默认规则只能是DROP和ACCEPT,不能是REJECT,命令如下:

 iptables -t filter -P INPUT DROP
 iptables -t filter -P OUTPUT DROP
 iptables -t filter -P FORWARD DROP

执行结果如下:

然后访问本机的http服务,命令如下:

curl http://192.168.123.44/hello.html

执行结果如下:

因为防火墙只允许通往192.168.123.44的ssh服务通过,默认策略又是拒绝的,这里访问http服务的包会被丢掉。
我们修改防火墙策略,将http服务设置为允许,命令如下:

iptables -t filter -A INPUT -p tcp -d 192.168.123.44 --dport 80 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp -s 192.168.123.44 --sport 80 -j ACCEPT 

分别在centos6(192.168.123.22)和本机(192.168.123.44)访问,结果如下:
centos6:

centos7:

然后开放允许本机访问,命令如下:

iptables -A  INPUT  -p tcp -s 192.168.123.44 -d 192.168.123.44  -j ACCEPT
iptables -A  OUTPUT  -p tcp -d 192.168.123.44  -s 192.168.123.44 -j ACCEPT 

执行结果如下:

防火墙策略入下:

对于访问本机的http服务,数据流是这样的,请求报文开一个随机端口,从OUTPUT链流出,出POSTROUTING链出,从PREROUTING进到INPUT80端口,然后从80出进入随机端口。所有本机访问时要把本机对本机的随机端口的访问打开。
虽然对于白名单和黑名单来说,白名单相对来说安全的多,但是当我们的服务是一个开放的文件共享服务如samba或者http服务,那么白名单就不适合了,黑名单更加实用,而且我们不要把链的默认规则设置为禁止访问,如果这样做,当我们清空防火墙时,会发现我们的ssh也连接不上了。
2.自建链
自建链单独自己是不能生效的,必须要主链调用才能生效,我们可以用下面命令来创建一条自定义链,并且调用他:

iptables -t filter -N can
iptables -A can -j REJECT
iptables -A INPUT -j can

结果如下:

然后本机访问自己的http服务:

一条被调用的自定义链不能被删除,一条有规则的链也不能被删除,只有删除所有的调用,并且清空规则的自定义才能被删除:

3.iptables扩展匹配

基本的扩展规则在对一条普通的报文还可行,但是对于ftp数据包无能为力,同时如果本机有多重服务,每个服务都有大量的访问量时,一条一条的规则匹配会浪费大量的时间,使用扩展匹配条件能够帮助我们减少规则数,提高用户的访问速率。

1.隐式扩展

不用-m选项指出matchname即可使用此match的专用选项进行匹配
1.tcp扩展
--source-port,--sport 端口,--destination-port,--dport 端口,在这里指定-p tcp时隐含包括了-m tcp ;--sport匹配传输层源端口,--dport匹配传输层目的端口,例如:

iptables -t filter -A INPUT -p tcp --dport 20:80 -d 192.168.123.44 -j REJECT

这样20到80的所有端口都不能被访问了,结果如下:

使用ssh和http在centos6(192.168.123.22)上测试,结果如下:

--tcp-flags 标志位列表 必须为1的标志位列表,余下出现在前面的标志位列表必须为0
tcp的几个标志位:SYN,ACK,FIN,RST,URG,PSH;
SYN表示请求序列
ACK回应的序列
FIN表示开始断开
RST复位标志
URG紧急标志位
PSH标志置位时,接收端不将该数据进行队列处理,而是尽可能快将数据转由应用处理。
例如阻断tcp连接的首次连接:

iptables -A INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST SYN -j REJECT 

结果如下:

用本机测试http服务:

--syn:
相当于--tcp-flags SYN,ACK,FIN,RST SYN
2.udp扩展
--source-port,--sport port 端口,匹配报文中传输层的源端口
--destination-port,--dport port 端口匹配报文中传输层的目标端口,这里是使用UDP协议时隐含包括了-m udp
3.icmp扩展
icmp扩展,指定-p icmp时,隐含了-m icmp,语法是--icmp-type 报文类型,请求报文类型是8,响应报文类型是0,例如:
在centos7上的INPUT链关闭请求报文,命令如下:

 iptables -t filter -A INPUT -p icmp --icmp-type 8 -j REJECT 

结果如下:

在centos6(192.168.123.22)上pingcentos7(192.168.123.44)结果如下:

显示到达不了目标主机,可以证明防火墙生效了。

2.显式扩展

必须使用-m选项指出matchname,有的match可能存在专用的选项
1.multiport扩展
multiport扩展的目的是以离散或连续的方式定义多端口匹配条件,语法如下:
--source-ports,--sports port[,port|,port:port]...:指定多个源端口;
--destination-ports,--dports port[,port|,port:port]...:指定多个目标端口;
--ports port[,port|,port:port]...:指定多个端口;
例如指定目的端口为centos7的20到80还有3306端口,命令如下:

iptables -A INPUT -p tcp -m multiport --dports 20:80,3306 -j ACCEPT
iptables -A INPUT -j REJECT

结果如下:

在centos6(192.168.123.22)上分别访问centos7(192.168.123.44)上的ssh服务和http服务:
ssh:

http:

2.iprange扩展
iprange以连续的ip地址范围指明连续的多地址匹配条件,语法如下:
--src-range 地址范围 -------------------用来匹配源IP地址;
--dst-range 地址范围 -------------------用来匹配目标IP地址;
例如允许192.168.123.1-192.168.123.33的地址访问centos7的http服务,命令如下:

iptables -t filter -I INPUT 2 -p tcp -m iprange --src-range 192.168.123.1-192.168.123.33 --dport 80 -j ACCEP

结果如下:

分别在centos6(192.168.123.22)上分别访问centos7(192.168.123.44)上访问centos7的http服务:
centos6:

centos7:

3.set扩展
set扩展依赖于ipset命令行工具,set扩展的目的就是解决离散型ip地址的匹配问题,首先是利用ipset生成一个ip地址表,命令如下:

ipset create httplist hash:net maxelem 1000
ipset add httplist 192.168.123.22

执行结果如下:

然后将这张表添加进防火墙规则,命令如下:

iptables -I INPUT 2 -p tcp --dport 80 -m set --match-set httplist src -j ACCEPT

-m指定扩展的模块,--match-set指定ip地址表,src/dst指定是源海市目的地址列表
结果如下:


分别在centos6(192.168.123.22)上分别访问centos7(192.168.123.44)上访问centos7的http服务:
centos6:

centos7:
4.string扩展
string扩展是对报文中的应用层数据做字符串匹配检测,语法为:
--string pattern:要检测字符串模式;
--algo {bm|kmp}
例如我们对centos7上的hello.html网站进行过滤,命令如下:

iptables -I INPUT 2 -p tcp -m string --algo bm --string hello -j REJECT

结果如下:

使用本机访问hello.html:

5.time扩展
time扩展是用来指定在规定时间内才能访问该主机,例如下面的命令:
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]:起始日期时间;
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]:结束日期时间;

--timestart hh:mm[:ss]
--timestop hh:mm[:ss]

--monthdays day[,day...]
--weekdays day[,day...]

--kerneltz:使用内核中配置的时区
6.connlimit扩展
--connlimit-upto n:连接数数量小于等于n,此时应该允许;
--connlimit-above n:连接数数量大于n,此时应该拒绝;
7.limit扩展
--limit rate[/second|/minute|/hour|/day]:平均速率
--limit-burst number:峰值速率
8.state扩展

4.保存,重载和优化

iptables-save > /PATH/TO/SOME_RULE_FILE
iptables-restore < /PATH/FROM/SOME_RULE_FILE

CentOS 6:
        保存规则:
                service iptables save
                自动保存规则至/etc/sysconfig/iptables文件中;
        重载规则:
                server iptables restore
                从/etc/sysconfig/iptables文件中重载规则;
规则优化:
        (1) 可安全放行所有入站及出站,且状态为ESTABLISHED的连接;
        (2) 服务于同一类功能的规则,匹配条件严格的放前面,宽松放后面;
        (3) 服务于不同类功能的规则,匹配报文可能性较大扩前面,较小放后面;
        (4) 设置默认策略;
        (a) 最后一条规则设定;
        (b) 默认策略设定; 

原文地址:http://blog.51cto.com/13412442/2310896

时间: 2024-11-05 13:47:10

linux下的防火墙的相关文章

Linux下iptables防火墙简单配置

Linux下防火墙简单配置 作为一个网站服务器,只需要开放80端口和22端口即可.80用于web访问,22用于远程登录管理,可以把22端口改成其他的端口,这样更安全.一般来说 在创建访问规则时 都会将原有的规则清零 这是一个比较好的习惯,因为某些规则的存在会影响你建的规则. 基本语法:iptables [-t filter] [-AI INPUT,OUTPUT,FORWARD] [-io interface]         [-p tcp,udp.icmp,all] [-s ip/nerwor

RedHat Linux下iptables防火墙设置

一般情况下iptables已经包含在Linux发行版中.运行 # iptables --version 来查看系统是否安装iptables 启动iptables: # service iptables start 查看iptables规则集 # iptables --list 下面是没有定义规划时iptables的样子: Chain INPUT (policy ACCEPT) target    prot opt source              destination Chain FOR

linux下的防火墙iptables

防火墙(firewall),也称为防护墙,是由Check Point创立者Gil Shwed于1993年发明并引入国际互联网.它是一项信息安全的防护系统,依照特定的规则,允许或者是限制传输的数据通过. 简介 防火墙在做信息包过滤决定时,有一套遵循和组成的规则,这些规则存储在专用的信息包过滤表中,而这些表集成在linux内核中.在信息包过滤表中,规则被分组放在我们所谓的链(chain)中,而 netfilter/iptables IP信息包过滤系统是一款功能强大的工具,可用于添加.编辑和移除规则.

linux下iptables防火墙详解

Linux网络防火墙基础知识 工作在主机或网络的边缘,对于进出的数据报文按照事先定义好的规则中的匹配标准进行检查,并做出对应的处理办法的机制称作防火墙. IP报文首部:主要包含源IP,目标IP TCP报文首部:主要包含源端口,目标端口,标志位SYN,ACK,RST,FIN 匹配标准解释: IP: 源IP,目标IP TCP: 源端口,目标端口 TCP三次握手三个阶段表示: 第一阶段:  SYN=1,FIN=0,RST=0,ACK=0; 第二阶段: SYN=1,ACK=1,FIN=0,RST=0;

Linux下简单防火墙的设置

对于个人VPS来说,简单的防火墙设置也是有必要的,具体方法如下: 1. 先检查一下防火墙的功能是否开启: # /etc/init.d/iptables status 2. 设定输入.输出和转发三个链的预设政策: # iptables -P INPUT ACCEPT # iptables -P OUTPUT ACCEPT # iptables -P FORWARD ACCEPT 3. 清空全部预设的防火墙: # iptables -F # iptables -X # iptables -Z 4.

Linux下关闭防火墙的几种方法

查看防火墙状态 iptables -L or service iptables status 临时性关闭防火墙 iptables -F or service iptables stop 永久性关闭防火墙(重启生效) chkconfig iptables off

iptables linux下的防火墙

iptables: 查看防火墙信息: sudo iptables -L -v 设置防火墙(客户端 --> 服务器): sudo iptables -A INPUT -s ipaddress(客户端的ip) -p tcp --dport 61616 -j ACCEPT 设置防火墙(服务器-->客户端) sudo iptables -A OUTPUT -d ipaddress(客户端的ip) -p tcp --sport 61616 -j ACCEPT 版权声明:本文为博主原创文章,未经博主允许不

Linux下 iptables防火墙 放开相关port 拒绝相关port 及查看已放开port

我用的是fedora 14 1. 查看iptables 防火墙已经开启的port:/etc/init.d/iptables status [[email protected] ~]#/etc/rc.d/init.d/iptables status             或者 service iptables status Table: filter Chain INPUT (policy ACCEPT) num  target     prot opt source              

linux下查看防火墙当前状态,开启关闭等

从配置菜单关闭防火墙是不起作用的,索性在安装的时候就不要装防火墙 查看防火墙状态: /etc/init.d/iptables status 暂时关闭防火墙: /etc/init.d/iptables stop 禁止防火墙在系统启动时启动 /sbin/chkconfig --level 2345 iptables off 重启iptables: /etc/init.d/iptables restart 题外话: BT或者骡子速度慢用不着关防火墙,只要把相应端口开放就可以了 在文件 /etc/sys