Linux基础之防火墙iptables


一.简介

       防火墙是一个由计算机硬件和软件组成的系统,部署于网络边界,是内部网络和外部网络之间的连接桥梁,同时对进出网络边界的数据进行保护,防止恶意入侵、恶意代码的传播等,保障内部网络数据的安全。防火墙技术是建立在网络技术和信息安全技术基础上的应用性安全技术,几乎所有的企业内部网络与外部网络(如因特网)相连接的边界设都会放置防火墙,防火墙能够起到安全过滤和安全隔离外网攻击、入侵等有害的网络安全信息和行为。

二.防火墙种类

硬件防火墙

  F5

软件防火墙

    iptables

  firewalld

安全组

三.iptables基本介绍

用户  --->  调用iptables  --->  ip_tables内核模块  --->  Netfilter(系统安全框架) --->  过滤请求

四.什么是包过滤防火墙

1、什么是包

在数据传输过程,并不是一次性传输完成的;而是将数据分成若干个数据包,一点一点的传输。

2、 什么是包过滤防火墙

过滤数据包的防火墙。

五.包过滤防火墙如何实现

通过系统安全框架,过滤数据包。

六.iptables链的概念

1、哪四个表,有哪些作用

具备某种功能的集合叫做表。

filter: 负责做过滤功能呢 : INPUT、OUTPUT、FORWARD

nat: 网络地址转换 PREROUTING、INPUT、OUTPUT、POSTROUTING

mangle: 负责修改数据包内容 PREROUTING、INPUT、OUTPUT、POSTROUTING、FORWARD

raw: 负责数据包跟踪 PREROUTING、OUTPUT

2.哪五条链,运行在哪些地方

PREROUTING、INPUT、OUTPUT、FORWARD、POSTROUTING

1) PREROUTING: 主机外报文进入位置,允许的表mangle, nat(目标地址转换,把本机地址转换为真正的目标机地址,通常指响应报文)

2) INPUT:报文进入本机用户空间位置,允许的表filter, mangle

3) OUTPUT:报文从本机用户空间出去的位置,允许filter, mangle, nat

4) FOWARD:报文经过路由并且发觉不是本机决定转发但还不知道从哪个网卡出去,允许filter, mangle

5) POSTROUTING:报文经过路由被转发出去,允许mangle,nat(源地址转换,把原始地址转换为转发主机出口网卡地址)

>>>流入本机:PREROUTING --> INPUT --> PROCESS(进程)

>>>经过本机:PREROUTING --> FORWARD --> POSTROUTING

>>>从本机流出:PROCESS(进程) --> OUTPUT --> POSTROUTING

七.iptables流程图

流入本机: A ---> PREROUTING ---> INPUT ---> B

流出本机:OUTPUT ---> POSTROUTING ---> B

经过本机: A ---> OUTPUT ---> POSTROUTING | ---> PREROUTING ---> FORWARD ---->POSTROUTING ---> C ---> PREROUTING ---> INPUT ---> B

filter : INPUT 、OUTPUT 、FORWARD

nat : PREROUTING 、 OUTPUT、 POSTROUTING

raw : PREROUTING、 OUTPUT

mangle : PREROUTING INPUT FORWARD OUTPUT POSTROUTING

八.iptables的使用

一.安装iptables

yum install iptables*

2.启动iptables

systemctl start iptables

3.关闭Firewalld

systemctl disable --now firewalld

格式:iptables -t 表名 选项 链名称 条件 

关于iptables的一些命令参数

-t:                   指定操作的表
-L, --list            列出当前的规则
-v                    显示数据包和数据包大小
-n                   不反解地址
-A, --append        追加一条规则到链中
-I, --insert        插入一条规则,插入到顶部
-F, --flush            清空
-Z, --zero            清空计数器(  包数量 、包大小)

-D, --delete        删除链中的规则
-R, --replace        修改
-S, --list-rules    列出所有的规则

-N, --new-chain        创建一个自定义 链
-X, --delete-chain    删除一个自定义链
-P, --policy        指定链的默认策略  

九.iptables动作

  ACCEPT 将数据包放行,进行完此处理动作后,将不再比对其它规则,直接跳往下一个规则链。

  REJECT 拦阻该数据包,并传送数据包通知对方。

  DROP 丢弃包不予处理,进行完此处理动作后,将不再比对其它规则,直接中断过滤程序。

  REDIRECT 将包重新导向到另一个端口,进行完此处理动作后,将会继续比对其它规则。

10.iptables基本的条件匹配(协议)

  TCP(相当于http)

  UDP

  ICMP(相当于ping)

  ALL

11.源地址(-s)、目标地址(-d)

  源地址:发送请求的地址

  目标地址 : 访问的地址

12.--sport源端口、--dport目标端口

  源端口:发送请求的端口

  目标端口:访问的端口

13.-i、-o、-m、-j动作

  -i : 进来的网卡

  -o : 出去的网卡

  -m : 指定模块

  -j : 转发动作

  -p :指定协议

例子:

案例1:只允许22端口可以访问,其他端口全部无法访问。 
iptables -t filter -A INPUT -p TCP --dport 22  -j ACCEPT
iptables -t filter -A INPUT -p TCP -j DROP

案例2:只允许22,80,443端口可以访问,其他端口全部无法访问。 
iptables -t filter -A INPUT -p TCP --dport 22  -j ACCEPT
iptables -t filter -A INPUT -p TCP --dport 80  -j ACCEPT
iptables -t filter -A INPUT -p TCP --dport 443  -j ACCEPT
iptables -t filter -A INPUT -p TCP -j DROP

案例3:只允许22,80,443端口可以访问,其他端口全部无法访问,但是本机可以访问百度。 

案例4:要求使用192.168.15.81能够通过22端口链接,但是其他的不行
iptables -t filter -A INPUT -p TCP -d 192.168.15.81 --dport 22  -j ACCEPT
iptables -t filter -A INPUT -p TCP -j DROP

案例5:只允许192.168.15.71能够通过22端口链接,其他的不行。
iptables -t filter -A INPUT -p  TCP -s 192.168.15.71  -d 192.168.15.81 --dport 22 -j ACCEPT
iptables -t filter -A INPUT -p TCP -j DROP

案例6:要求192.168.15.71对外部不可见
iptables -t filter -A INPUT -p TCP -d 192.168.15.71 -j DROP

案例7:要求使用eth0网卡的所有请求全部拒绝
iptables -t filter -A INPUT -p TCP -i etho -j DROP

使用172.16.1.71登录进来的窗口,不允许访问百度。
iptables -t filter -I OUTPUT -p TCP -o eth1 -j DROP

案例8:要求访问服务器的8080端口转发至80端口
iptables -t nat -A PREROUTING -p TCP --dport 8080 -j REDIRECT --to-port 80

案例9:要求只允许windows通过ssh连接192.168.15.81,其他的拒绝
iptables -t filter -I INPUT -p TCP -s 192.168.15.1 -d 192.168.15.81 --dport 22 -j ACCEPT
iptables -t filter -I INPUT -p TCP --dport 22 -j DROP

知识储备:
    查看本机端口占用的命令:    
        netstat -nutlp

14.模块

-m : 指定模块

1、连续匹配多个端口(multiport)

    --dports  : 指定多个端口(不同端口之间以逗号分割,连续的端口使用冒号分割)。
    
2、指定一段连续的ip地址范围(iprange)
    --src-range from[-to]:    源地址范围
    --dst-range from[-to]    目标地址范围

3、匹配指定字符串(string)
    --string pattern    # 指定要匹配的字符串
    --algo {bm|kmp}        # 匹配的查询算法
    
4、根据时间段匹配报文(time)
    --timestart hh:mm[:ss]        # 开始时间
    --timestop hh:mm[:ss]        # 结束时间
    --monthdays day[,day...]    # 指定一个月的某一天
    --weekdays day[,day...]        # 指定周 还是  周天 

5、禁ping, 默认本机无法ping别人 、别人无法ping自己
    --icmp-type {type[/code]|typename}
        echo-request  (8) 请求 
        echo-reply    (0) 回应

6、限制链接数,并发连接数(connlimit)
    --connlimit-upto n        #  如果现有连接数小于或等于  n  则 匹配
    --connlimit-above n        #  如果现有连接数大于n 则匹配

7、针对 报文速率 进行限制。 秒、分钟、小时、天。

    --limit rate[/second|/minute|/hour|/day] # 报文数量 
     --limit-burst number  # 报文数量(默认:5

例子:

1、要求将22,80,443以及30000-50000之间所有的端口向外暴露,其他端口拒绝

    iptables -t filter -A INPUT -p TCP -m multiport --dports 22,80,443,30000:50000 -j ACCEPT
    iptables -f filter -A INPUT -p TCP -j DROP

2、要求访问数据包中包含HelloWorld的数据不允许通过。
    iptables -t filter -A INPUT -p TCP -m string --string "HelloWorld" --algo kmp -j DROP

3、要求192.168.15.1 - 192.168.15.10之间的所有IP能够连接192.168.15.81,其他拒绝
    iptables -t filter -A INPUT -p TCP
 -m iprange --src-range 192.168.15.1-192.168.15.10 -j ACCEPT 
    iptables -f filter -A INPUT -p TCP -j DROP

4、要求每天的12到13之间,不允许访问
    iptables -t filter -A INPUT -p TCP -m time  --timestart 4:00   --timestop 5:00 -j DROP
    
    必须使用UTC时间

5、要求别人不能ping本机,但是本机可以ping别人
    iptables -t filter -A INPUT -p TCP -m icmp --icmp-type "echo-request" -j DROP
    
6、要求主机连接最多有2个
    iptables -t filter -A INPUT -p TCP --dport 22 -m connlimit --connlimit-above 2 -j DROP
    
7、要求限制速率在500k/s左右
    iptables -t filter -A INPUT -p TCP -m limit 333/s -j ACCEPT
    iptables -t filter -A INPUT -p TCP -j DROP

相关