linux iptables防火墙最详细讲解

架构图

防火墙

1. 什么是防火墙:
	防止其他用户恶意访问
	
2. 防火墙种类
	硬件防火墙 :F5
	软件防火墙 :iptables  firewalld
	安全组

iptables

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

什么是包过滤防火墙

什么是包:
	在数据传输过程,并不是一次性传输完成的,而是将数据分成若干个数据包,一点一点的传输。
	
什么是包过滤防火墙:
	过滤数据包的防火墙

包过滤防火墙如何实现

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

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 ---> PORTOUTING ---> INPUT --->B

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

分解图

iptables的使用

准备工作:

1、安装 iptables
		[root@m01 ~]# yum install iptables*
		
2、启动 iptables
		[root@m01 ~]# systemctl start iptables
		
3、关闭firewalld
		[root@m01 ~]# systemctl disable --now firewalld
		
4、查看状态
	systemctl status iptables
使用格式:iptables -t 表名 选项 链名 条件 动作

-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		:丢弃包不予处理,进行完此处理动作后,将不再比对其他规则,直接终端过滤程序
DEDIRECT	:将包重新导向到另一个端口,进行完此处理动作后,将会继续比对其他规则

iptables -s与-d参数

-s : 源地址 : 发送请求的地址
-d :目标地址  : 访问的地址

iptables端口

什么是端口:
	可以认为是设备与外界通讯交流的出口。端口可分为虚拟端口和物理端口,其中虚拟端口指计算机内部或交换机路由器内的端口,不可见。例如计算机中的80端口、21端口、23端口等。物理端口又称为接口,是可见端口,计算机背板的RJ45网口,交换机路由器集线器等RJ45端口。电话使用RJ11插口也属于物理端口的范畴。
	
--sport :源端口  :发送请求的端口
 
--dport :目标端口 : 访问的端口

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

-i  : 进来的网卡
-o  : 出去的网卡
-m  : 指定模块
-j  : 转发动作
-p  : 指定协议

应用案例:

### 如果断开xshell可以使用虚拟机去取消所有的命令 因xshell也是需要基于网络的

案例一: 只允许22端口可以访问,其他端口全部无法访问

[root@root ~]# iptables -t filter -A INPUT -p TCP --dport 22 -j ACCEPT
解析:-t 指定操作的表:filter,  -A INPUT 追加一条规则到链INPUT中, -p TCP :指定TCP协议 --dport 22 :目标端口22, -j ACCEPT :转发ACCEPT动作

[root@root ~]# iptables -t filter -A INPUT -p TCP -j DROP
解析: -j DROP 中断所有过滤程序。
案例二: 只允许22,80,443 端口访问,其他端口无法访问

[root@root ~]# iptables -t filter -A INPUT -p TCP --dport 22 -j ACCEPT
[root@root ~]# iptables -t filter -A INPUT -p TCP --dport 80 -j ACCEPT
[root@root ~]# iptables -t filter -A INPUT -p TCP --dport 443 -j ACCEPT
[root@root ~]# iptables -t filter -A INPUT -p TCP -j DROP

#  分布执行允许访问的端口。
案例三: 只允许22,80,443 端口可以访问,其他端口全部无法访问,但是本机可以访问百度。

iptables -t filter -I INPUT -p TCP -o eth1 -j ACCEPT
案例四: 要求使用192.168.15.81 能够通过22端口连接,但是其他不行。

[root@root ~]# iptables -t filter -A INPUT -p TCP -d 192.168.15.81 --dport 22 -j ACCEPT

[root@root ~]# iptables -t filter -A INPUT -p TCP -j ACCEPT

解析 : -d :指定目标地址  (说明只能访问 192.168.15.81 访问不到别的)
案例五: 只允许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

解析: -s 指定源地址  -d 指定目标地址。 其他的禁止 -j DROP
案例六: 要求192.168.15.71对外部不可见

iptables -t filter -A INPUT -p TCP -d 192.168.15.71 -j DROP

解析: -d 指定目标地址 -j DROP 禁止。
案例七: 要求使用eth0网卡的所有请求全部拒绝

iptables -t filter -A INPUT -p TCP -i eth0 -j DROP
案例八: 使用要求访问服务器的8080端口转发至80端口

iptables -t nat -A PREROUTING -p TCP --dport 8080 -j REDIRECT --to-port 80

解析:	  端口转换:使用nat表 :网络地址转换. 
		使用 PREROUTING 链 。 
		REDIRECT : 将包导向另外一个端口。
		--to-port : (参数) 导向另外一个端口

# 知识储备: iptables -L -v -n 默认的表是filter表  
		 iptables -L -v -n -t nat (此时可以指定查看nat表)
案例九: 要求只允许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 -A INPUT -p TCP --dport 22 -j DROP

解析:进入windows cmd 执行ipconfig查看windowsip 。以windows作为源地址。

iptables模块

multiport模块

模块: 拓展iptables的功能

-m 指定模块

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

	--dports :指定多个端口(不同端口之间以逗号分割,连续的端口使用冒号分割)
案例:要求将22,80,443,以及3000-5000之间所有的端口向外暴露,其他端口拒绝

iptables -t filter -A INPUT -p TCP -m multiport --dports 20,80,443,3000:5000 -j ACCEPT

iptables -t filter -A INPUT -p TCP -j DROP

iprange模块

2、指定一段连续的ip地址范围(iprange)

	--src-range from[-to] : 源地址范围
	--dst-range from[-to] : 目标地址范围
案例:要求192.168.15.1 - 192.168.15.10 之间所有的ip能够连接到192.168.15.81,其他拒绝
192.168.15.100

iptables -t filter -A INPUT -p TCP -m iprange --src-range 192.168.15.1-192.168.15.10  -d 192.168.15.81 -j ACCEPT

iptables it filter -A INPUT -p TCP -j DROP

string模块

3、匹配指定字符串(string)
	--string pattern     # 指定要匹配的字符串
	--algo {bm|kmp}      # 匹配的查询算法
案例:要求访问的数据包中包含HelloWorld的数据不允许通过

	iptables -t filter -A INPUT -p TCP -m string --string "HelloWorld" --algo kmp -j DROP

time模块

4、根据时间段匹配报文(time)  
	--timestart hh:mm[:ss]  # 开始时间  小时:分钟:秒
	--timestop hh:mm[:ss]   # 结束时间  小时:分钟:秒
	--monthdays day[,day...]  # 指定一个月的某一天
	--weekdays day[,day...]  # 指定周 还是 周天

这里使用的UTC时间 上海时间为东八区 所以要-8
案例:要求每天的12点到13点之间,不允许访问

iptables -t filter -A INPUT -p TCP -m time --timestart 4:00 --timestop 5:00 -j DROP

icmp模块

5、icmp : 禁ping,默认本机无法ping别人、别人无ping自己
	--icmp-type {type[/code]|typename}
		echo-request (8) 请求
		echo-reply   (0) 回应
案例:要求别人不能ping本机,但是本机可以ping别人
iptables -t filter -A INPUT -p icmp -m icmp --icmp-type "echo-request" -j DROP

connlimit模块

6、限制链接数,并发链接数(connlimit)
	--connlimmit-upto n   # 如果现有连续数小于或等于  n 则匹配
	--connlimit-above n   # 如果现有连接数大于n 则匹配
案例: 要求主机连接最多有两个

iptables -t filter -A INPUT -p TCP --dport 22 -m connlimit --connlimit-above 2 -j DROP

limit模块

7、针对 报文速率 进行限制。秒、分钟、小时、天。
	--limit rate[/second|/minute|/hour|/day]  # 报文数量
	--limit-burst number # 报文数量(默认:5)
案例:要求限制速率在500k/s左右 (500k/s 相当于333个数据包)
iptables -t filter -A INPUT -p TCP -m limit 333/s -j ACCEPT
iptables -t filter -A INPUT -p TCP -j DROP
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值