iptables管理以及selinux对服务端口的影响

IANA固定端口对应的服务
内核拆开网络层后看到端口就知道是哪个进程之前像自己申请的端口
进程没人访问:
1.阻塞
2.忙等

多数进程都是阻塞在这个端口上的
因此拿到请求就会执行

坐在饭店 干等 阻塞
出去转一圈 非阻塞
进程:ip+端口

主机可能开启很多个端口 为了避免所有人访问 需要添加防火墙 开启部分端口映射内部端口允许别人访问

所以大部分防火墙称之为包过滤防火墙

在这里插入图片描述识别报文的源ip目的ip源端口目的端口都是在内核空间的 ,所以防火墙工作在内核。

所以防火墙 工作在内核的tcp.ip协议栈上

这种称之为主机防火墙

但是只能防范对单台主机的防火墙

网络防火墙
试图找局域网每一台主机进行下手攻击
局域网的边缘设置防火墙

进入网络必须进入路由器 (前端网关)网关前一台主机进行识别 对后端局域网进行保护

假如该主机是Linux
打开转发功能即网关
假设有两个网卡
如果路由
网卡接收后 到内核空间 交给tcp分析访问谁 如果是自己 给内用户间
如果目标Ip 不是本机就进行转发 检查本地路由表 检查根据哪个路由发出去(前提打开转发功能)
主机也有默认网关 经过路由设备到局域网内某一台主机。目标ip不是自己只能拆开链路层首部。

内核内部设置屏障 就可以完成外部到内部信息交换的防火功能
在这里插入图片描述
报文到达 拆开链路层封装 查看目标Ip
目标ip是自己 就会转送到用户空间
目标ip不是 通过另外一个接口重新发出去

所以一个主机防火墙,一个网络防火墙

#############################

主机内核防火墙
在这里插入图片描述
tcp/ip 报文流经过程

网卡: 四个网卡

内核中实现的防火墙有五处位置:

报文到达本地主机

路有前钩子 prerouting
1.首先一个路由判断是到本机内部还是转发
2.到达本机内部:只顾到达本机内部的 叫input钩子 没问题放行
3.否则转发给另外一个叫forward钩子

4.内部进程发送报文出去 首先 经过output

发送到网卡前需要判断从哪个网卡转发出去
所以还需要一个路由

所以离开本机之前还有一次路由过程

路由后离开本机前postrouting

在这里插入图片描述
任何一个数据报文都要经过本机五个位置中的某几个位置

这五个位置就是内核的框架,五个钩子

每个位置有规则和处理办法

怎么处理是管理员决定的

如何给内核装规则呢?无法操作内核。系统调用接口进行访问

开发用户空间专有工具帮生成规则即iptables编写规则的工具
iptable就是编写规则的工具可以调用内核接口把规则送到对应的五个位置上让其生效。

真正实现防火墙的是内核的这些框架netfilter以及送往框架的规则

对防火墙来说钩子上放的其实就是过滤规则

通过链上写规则

PREROUTING:数据包进入路由表之前
INPUT:通过路由表后目的地为本机
FORWARD:通过路由表后,目的地不为本机
OUTPUT:由本机产生,向外转发
POSTROUTIONG:发送到网卡接口之前。

红帽研发了firewalld
再去定义防火墙就方便了

可以直接根据局域网去定义 直接根据局域网定义哪个区域开启那些服务

在这里插入图片描述在这里插入图片描述
搞明白后就不用使用iptables写了
iptables写很麻烦

安装centos会自动开启防火墙 默认很多规则
所以httpd都访问不了

iptables: 包过滤型的防火墙

Firewall:防火墙,隔离工具;工作于主机或网络边缘,对于进出本主机或本网络的报文根据事先定义的检查规则作匹配检测,对于能够被规则匹配到的报文作出相应处理的组件;

	主机防火墙 
	网络防火墙 
	
	软件防火墙(软件逻辑)
	硬件防火墙(硬件和软件逻辑)
	
ipfw (firewall framework)
ipchains (firewall framework)

iptables(netfilter)
	netfilter:kernel
	iptables:rules until
nftables
	
	hook function:
		prerouting		
		input 
		output 
		forward 
		postrouting

在iptables书写规则中这些钩子称为链	链和钩子名字一样 但是必须为大写
链(内置):
	PREROUTING
	INPUT
	FORWARD
	OUTPUT
	POSTROUTING

iptables+netfilter不仅仅实现防火墙 还有很多别的功能:

功能:
	filter:过滤,防火墙;
	nat:network address translation;用于修改源IP或目标IP,也可以改端口;nat会话连接追踪表记录,记录在内存空间。
	mangle:拆解报文,做出修改,并重新封装起来;比如更改协议版本等
	raw:关闭nat表上启用的连接追踪机制;
	
功能<--链:
	raw:PREROUTING, OUTPUT
	mangle:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
	nat:PREROUTING,[INPUT,]OUTPUT,POSTROUTING
	filter:INPUT,FORWARD,OUTPUT
	
报文流向:
	流入本机:PREROUTING --> INPUT
	由本机流出:OUTPUT --> POSTROUTING
	转发:PREROUTING --> FORWARD --> POSTROUTING

分析:

任何到达本机80端口都拒绝-
拒绝----过滤 filter  filter:(INPUT,FORWARD,OUTPUT)
访问内部80端口的 --到达本机内部的(prerouting/input)

所以综合上述只能写在input 链上

功能+方向就可以确定写在哪里了

在这里插入图片描述路由功能发生的时刻: 报文进入本机后 判断目标主机是? 报文离开本机之前: 判断经由哪个接口送往下一站?

iptables/netfilter
范围小的先放前面
不同类型的访问量大的放前面

规则:
		组成部分:根据规则匹配条件来尝试匹配报文,一旦匹配成功,就由规则定义的处理动作作出处理;
			匹配条件:
				基本匹配条件:内建
				扩展匹配条件:由扩展模块定义;
			处理动作:
				基本处理动作:内建
				扩展处理动作:由扩展模块定义;
				自定义处理机制:自定义链
				
		iptables的链:内置链和自定义链
			内置链:对应于hook function
			自定义链接:用于内置链的扩展和补充,可实现更灵活的规则管理机制;
			
	添加规则时的考量点:
		(1) 要实现哪种功能:判断添加到哪个表上;
		(2) 报文流经的路径:判断添加到哪个链上;
		
		链:链上的规则次序,即为检查的次序;因此,隐含一定的应用法则:
			(1) 同类规则(访问同一应用),匹配范围小的放上面;
			(2) 不同类的规则(访问不同应用),匹配到报文频率较大的放在上面;
			(3) 将那些可由一条规则描述的多个规则合并起来;
			(4) 设置默认策略;

iptables命令:

	高度模块化,由诸多扩展模块实现其检查条件或处理动作的定义;
		/usr/lib64/xtables/
			IPv6:libip6t_
			IPv4:libipt_, libxt_

yum info httpd
[root@test ~]# rpm -ql iptables | less

在这里插入图片描述

		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]

		规则格式:iptables   [-t table]   COMMAND   chain   [-m matchname [per-match-options]]   -j targetname [per-target-options]
		
			-t table:
				raw, mangle, nat, [filter]
				
			COMMAND:
				链管理:
					-N:new, 自定义一条新的规则链;
					-X: delete,删除自定义的规则链;
						注意:仅能删除 用户自定义的 引用计数为0的 空的 链;
					-P:Policy,设置默认策略;对filter表中的链而言,其默认策略有:
						ACCEPT:接受
						DROP:丢弃
						REJECT:拒绝
					-E:重命名自定义链;引用计数不为0的自定义链不能够被重命名,也不能被删除;
				规则管理:
					-A:append,追加;
					-I:insert, 插入,要指明位置,省略时表示第一条;
					-D:delete,删除;
						(1) 指明规则序号;
						(2) 指明规则本身;
					-R:replace,替换指定链上的指定规则;
					
					-F:flush,清空指定的规则链;
					-Z:zero,置零;
						iptables的每条规则都有两个计数器:
							(1) 匹配到的报文的个数;
							(2) 匹配到的所有报文的大小之和;						
				查看:
					-L:list, 列出指定鏈上的所有规则;
						-n:numberic,以数字格式显示地址和端口号;
						-v:verbose,详细信息;
							-vv, -vvv
						-x:exactly,显示计数器结果的精确值; 
						--line-numbers:显示规则的序号;

在这里插入图片描述

看指定表链的规则
此处没有
因为防火墙没有打开

在这里插入图片描述-L 写在最后面

看filter表INPUT链
在这里插入图片描述在这里插入图片描述
iptables [-t table] -N chain

在这里插入图片描述
新建的链 0 reference 只能被内建的链引用 引用一次+1

在这里插入图片描述
在这里插入图片描述
如果链上 有规则 有引用 删不了
内建的链也删除不了

在这里插入图片描述

默认是accept
在这里插入图片描述

在这里插入图片描述在这里插入图片描述

在这里插入图片描述
在这里插入图片描述以上是链管理

chain:
				PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
				
			匹配条件:
				基本匹配条件:无需加载任何模块,由iptables/netfilter自行提供;
					[!] -s, --source  address[/mask][,...]:检查报文中的源IP地址是否符合此处指定的地址或范围;
					[!] -d, --destination address[/mask][,...]:检查报文中的目标IP地址是否符合此处指定的地址或范围;
						所有地址:0.0.0.0/0
					[!] -p, --protocol protocol
						protocol: tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh or  "all"
							{tcp|udp|icmp}
					[!] -i, --in-interface name:数据报文流入的接口;只能应用于数据报文流入的环节,只能应用于PREROUTING,INPUT和FORWARD链;
					[!] -o, --out-interface name:数据报文流出的接口;只能应用于数据报文流出的环节,只能应用于FORWARD、OUTPUT和POSTROUTING链;											
				
			
			处理动作:
				-j targetname [per-target-options]
					ACCEPT
					DROP
					REJECT

下面是规则管理:
-D 删除 删除FORWARD链的第7条规则
在这里插入图片描述

添加规则 -A
所有172.16网段的访问本机的并且支持tcp协议的都允许
在这里插入图片描述
本机访问别人主机 tcp协议服务都允许
在这里插入图片描述
设置了这个后ssh服务就可以正常连接
然后设置默认规则为拒绝 就是真正意义上的白名单了
在这里插入图片描述
基于tcp的服务都正常
ping 命令时icmp协议 所以别人ping不通的 哪怕是一个网段

在这里插入图片描述
别人可以ping了
在这里插入图片描述在这里插入图片描述
可以看到有报文进来了
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

抓包可以看到两边的包都有了
在这里插入图片描述 练习:

	练习:本机地址172.16.0.67
		1、开放本机的所有tcp服务给所有主机;
			# iptables -I INPUT  -d 172.16.0.67 -p tcp -j ACCEPT
			# iptables -I OUTPUT  -s 172.16.0.67 -p tcp -j ACCEPT 
		2、开放本机的所有udp服务给172.16.0.0/16网络中的主机,但不包含172.16.0.200;
			# iptables -I INPUT 2 -d 172.16.0.67 -s 172.16.0.200 -p udp -j REJECT
			# iptables -I INPUT 3 -d 172.16.0.67 -s 172.16.0.0/16 -p udp -j ACCEPT
			# iptables -I OUTPUT 2 -s 172.16.0.67 -d 172.16.0.0/16 -p udp -j ACCEPT
		3、默认策略为REJECT;
		扩展:
		1、仅开放本机的ssh服务给172.16.0.0/16中的主机,而且不包含172.16.0.200; 

在这里插入图片描述iptables(2)

iptables [-t table] COMMAND [chain] [PARAMETERS] [-m matchname [per-match-options]] [-j targetname [per-target-options]]
	匹配条件:
		基本匹配条件:PARAMETERS
		扩展匹配条件:
			隐式扩展:在使用-p选项指明了特定的协议时,无需再同时使用-m选项指明扩展模块的扩展机制;!!!
			显式扩展:必须使用-m选项指明要调用的扩展模块的扩展机制;!!!
			
				
				隐式扩展:不需要手动加载扩展模块;因为它们是对协议的扩展,所以,但凡使用-p指明了协议,就表示已经指明了要扩展的模块;
					tcp:
						[!] --source-port, --sport port[:port]:匹配报文的源端口;可以是端口范围;
						[!] --destination-port,--dport port[:port]:匹配报文的目标端口;可以是端口范围;
						[!] --tcp-flags  mask  comp
								mask is the flags which we should examine,  written as a comma-separated list,例如 SYN,ACK,FIN,RST
								comp is a comma-separated list  of  flags  which must be set,例如SYN
								例如:“--tcp-flags  SYN,ACK,FIN,RST  SYN”表示,要检查的标志位为SYN,ACK,FIN,RST四个,其中SYN必须为1,余下的必须为0;
						[!] --syn:用于匹配第一次握手,相当于”--tcp-flags  SYN,ACK,FIN,RST  SYN“;								
					udp 
						[!] --source-port, --sport port[:port]:匹配报文的源端口;可以是端口范围;
						[!] --destination-port,--dport port[:port]:匹配报文的目标端口;可以是端口范围;
							
					icmp 
						[!] --icmp-type {type[/code]|typename}
								echo-request:8
								echo-reply:0
							
				显式扩展:必须要手动加载扩展模块, [-m matchname [per-match-options]]; 

基于模块带更强大的
-p指定了协议之外其他的
小写的都是条件 -m指定模块

在这里插入图片描述为什么端口号是65535个 因为指明了只有16位 2^16
在这里插入图片描述
只开放本网络到本机ssh服务

在这里插入图片描述
在这里插入图片描述

因此这就是只开放ssh服务

在这里插入图片描述
在这里插入图片描述
就只剩下默认策略了!!

这两条就相当于默认策略
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
这种不会
第三条就相当于默认规则 还仍然可以本机访问本机

在这里插入图片描述

也可以使用这种 拒绝访问这个网卡的 也决绝从这个网卡出去的

在这里插入图片描述
在这里插入图片描述

也是可以的

在这里插入图片描述但是默认的规则本机就不可以访问本机
所以一般使用上面的方式

在这里插入图片描述
检查三次握手第一次 只有SYN位1 这个很关键 可以使用–syn简写

在这里插入图片描述

在这里插入图片描述

自己[ping别人是8 响应回来是0
所以这个就是自己可以ping别人 别人不可以ping自己

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

拒绝所有别的

自己[ping别人是8 响应回来是0
所以这个就是自己可以ping别人 别人不可以ping自己

在这里插入图片描述到68主机查看下报文
在这里插入图片描述
68也给67 但是响应报文进不去
所以添加放行进来的响应报文的规则

iptables -I INTPUT 2 -d 172.16.0.67 -p icmp --icmp-type 0/0 -j ACCEPT

在这里插入图片描述
在这里插入图片描述
可以ping出去 但是别人无法ping进来

在这里插入图片描述

因为别人ping进来的报文应该是8 但是进来的只接受0

上面的就是隐式扩展!!!!!!!!

在这里插入图片描述
添加规则别人可以访问本机的137-138端口 闭区间

:表示区间
不支持基于离散方式 所以需要显示扩展

man iptables 可以看到扩展的手册
在这里插入图片描述在这里插入图片描述
大写的表示处理动作 小写的就是条件

**显示扩展**

显式扩展:必须使用-m选项指明要调用的扩展模块的扩展机制;
1、multiport
This module matches a set of source or destination ports. Up to 15 ports can be specified. A port range (port:port) counts as two ports. It can only be used in conjunction with one of the following protocols: tcp, udp, udplite, dccp and sctp.

				以离散或连续的 方式定义多端口匹配条件,最多15个;
				
				[!] --source-ports,--sports port[,port|,port:port]...:指定多个源端口;  逗号是离散的 冒号是连续的
				[!] --destination-ports,--dports port[,port|,port:port]...:指定多个目标端口;
				
				# iptables -I INPUT  -d 172.16.0.7 -p tcp -m multiport --dports 22,80,139,445,3306 -j ACCEPT

在这里插入图片描述默认应该访问不了

编辑
在这里插入图片描述
所以需要开启多个端口

更改入栈和出的第二条规则
在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述

注意是–dports

			2、iprange
				以连续地址块的方式来指明多IP地址匹配条件;
				[!] --src-range from[-to]
				[!] --dst-range from[-to]
				
				# iptables -I INPUT -d 172.16.0.7 -p tcp -m multiport --dports 22,80,139,445,3306 -m iprange --src-range 172.16.0.61-172.16.0.70 -j REJECT

在这里插入图片描述

			3、time
				This  matches  if the packet arrival time/date is within a given range.
				
				 --timestart hh:mm[:ss]
				 --timestop hh:mm[:ss]
				 
				 [!] --weekdays day[,day...]
				 
				 [!] --monthdays day[,day...]
				 
				--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
				--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
				
				 --kerneltz:使用内核配置的时区而非默认的UTC;

首先需要时间同步,找一个时间同步服务器 可以去访问别人的1213,323端口
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
表示仅仅在周一到周五的十点到下午四点 主机Ip位60-70网段的才可以访问本机的23端口 使用内核失去–kerneltz

			4、string
				This modules matches a given string by using some pattern matching strategy. 
				
				--algo {bm|kmp}
				[!] --string pattern
				[!] --hex-string pattern
				
				--from offset
				--to offset
				
				~]# iptables -I OUTPUT -m string --algo bm --string "gay" -j REJECT

可以做七层检查(应用层)

在这里插入图片描述
基于编码后进行匹配 英文几乎不存在问题
不允许有gay的字符串发送

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
所有的服务只要包含字符串gay 这个报文就不可以发送
在这里插入图片描述在这里插入图片描述
访问不了

在这里插入图片描述

可以检测到有报文

			5、connlimit 
				Allows  you  to  restrict  the  number  of parallel connections to a server per client IP address (or client address block).
				
				--connlimit-upto n
				--connlimit-above n
				
				~]# iptables -I INPUT -d 172.16.0.7 -p tcp --syn --dport 22 -m connlimit --connlimit-above 2 -j REJECT

连接限制
避免一个用户发送大量请求
DDOS
单客户端最多并发多少个请求数量
使用数据库库
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

在这里插入图片描述
测试连接

在这里插入图片描述
可以连接
在这里插入图片描述打开多个终端shell都可以连接多个
在这里插入图片描述 ~]# iptables -I INPUT -d 172.16.0.7 -p tcp --syn --dport 22 -m connlimit --connlimit-above 2 -j REJECT
–connlimit-upto n
–connlimit-above n
大于两个就决绝 低于两个才允许
如何选择取决于黑白名单

如果默认拒绝 那么小于2个才允许 因为大于就自动拒绝;
如果默认允许 那么大于两个就拒绝 因为小于自动允许;

更改刚才的规则

在这里插入图片描述同时打开三个shell 等第三个连接就连接不上了
在这里插入图片描述
其实就是检查三次握手的第一次
随便断开一个就可以再次连接

			6、limit 
				This  module  matches  at  a limited rate using a token bucket filter. 
				
				--limit rate[/second|/minute|/hour|/day]
				--limit-burst number
				
				~]# iptables -I OUTPUT -s 172.16.0.7 -p icmp --icmp-type 0 -j ACCEPT
				
				限制本机某tcp服务接收新请求的速率:--syn, -m limit

从报文的发包速率限制的 限制发包速率
令牌统算发
拿一个令牌发一次 固定时间发令牌

要想发报文 得拿到令牌

可以有个桶攒令牌 但是桶最多有定义

让别人可以ping自己

在这里插入图片描述显示有人在ping了

平均三秒1个
在这里插入图片描述

web服务器新请求按固定速率限制

80端口上syn类型报文限制每秒100个

–syn

只限制新请求 数量不能太快

			7、state!!!!!!!!!!! 是非常重要的扩展~~~~~
				The "state" extension is a subset of the "conntrack" module.  "state" allows access to the connection tracking state for this packet.  可以查看每个包的状态
				
				[!] --state state
					INVALID, ESTABLISHED, NEW, RELATED or UNTRACKED.
					
					NEW: 新连接请求;
					ESTABLISHED:已建立的连接;
					INVALID:无法识别的连接; TCP报文的syn=1 fin=1都错乱了 
					RELATED:相关联的连接,当前连接是一个新请求,但附属于某个已存在的连接;(a-b已经建立,但是b-a是第一次 端口)
					UNTRACKED:未追踪的连接;nat表中关闭了连接追踪机制就是这个
										
					state扩展:
						内核模块装载:
							nf_conntrack
							nf_conntrack_ipv4
							
							手动装载:
								nf_conntrack_ftp 
								
				追踪到的连接:
					/proc/net/nf_conntrack
					
				调整可记录的连接数量最大值:
					/proc/sys/net/nf_conntrack_max
					
				超时时长:
					/proc/sys/net/netfilter/*timeout*

一个请求访问了服务器访问连接断开后 tcp是不会记得他连接过
ping也是同理 所以连接追踪 能让服务器识别
连接追踪机制----在服务器内核内存中打开一个空间记录哪个客户端之前访问过 /proc/net/nf_conntrack
首先查内存表,无记录说明第一次,记录着说明访问过,直接访问即可
但是内核内存空间有限 还有超时时间 比如udp只有2个小时
服务器很繁忙要么就关闭此功能,要不扩大内存表 一般要关闭连接追踪功能 不适合并发访问量很大的记录

该功能需要开启激活 装载内核模块

可以看到每个服务超时时间
在这里插入图片描述已经追踪到的连接

在这里插入图片描述每个连接状态 ESTABLISHED,NEW,
该表中每个连接都是

服务器80端口一般不可能开启80请求
因为客户端80请求服务器是new 所以服务器响应客户端已经是established
但是有一种。有人在服务器安装了木马,木马扫描发现服务器本身80端口开放 所以向外请求 外部控制服务器 但是向外请求80是new 因此就可以根据80端口出去的请求状态判断是否安全
80入栈位new established 出战的只能位established 完美的杜绝了木马
所以这就是连接追踪一个很好用的功能

ftp模式也有救了 RELATED 出战的只有状态位RELATED才放行

简化了规则
1.入栈只要是establish都放行
2.入栈新请求也接受部分端口的
3.出栈的也只要是establiesh也放行 和1写一起
4.如果yum安装 dns解析访问别人也需要开启访问端口

放行本机22,80,23等服务端口

在这里插入图片描述默认规则设置为拒绝
在这里插入图片描述
写错了
目标为本机的 或者从本机出去的默认都拒绝
在这里插入图片描述
但是自己访问别人不可以 比如同步别人服务器时间
new去同步别人的都可以

在这里插入图片描述忘加状态了 既然自己访问出去的可以了 说明进来的已经时established 默认放行 所以不用写output链
在这里插入图片描述

同步完成
在这里插入图片描述

放行ftp服务
在这里插入图片描述目标为本机 任何为related的也放行

#98 0:35 ftp的没听懂

处理动作(跳转目标):

	-j targetname [per-target-options]
		简单target:
			ACCEPT, DROP
			
		扩展target:
			REJECT
				This is used to send back an error packet in response to the matched packet: otherwise it is equivalent to  DROP  so it  is  a  terminating  TARGET,  ending  rule traversal.
				
				--reject-with type
					The type given can be icmp-net-unreachable, icmp-host-unreachable, icmp-port-unreachable, icmp-proto-unreach‐ able, icmp-net-prohibited, icmp-host-prohibited, or icmp-admin-prohibited (*), which return  the  appropriate ICMP  error  message (icmp-port-unreachable is the default).
														
			LOG
				Turn  on  kernel  logging of matching packets.
					
				--log-level
				--log-prefix
				
				默认日志保存于/var/log/messages

在这里插入图片描述在这里插入图片描述
查看日志
在这里插入图片描述
如果以前访问追踪过就没有
使用一个新的客户端连接 没有访问过的ip
在这里插入图片描述

在这里插入图片描述不好区分 加一个前缀
在这里插入图片描述在这里插入图片描述
RETURN:
返回调用者;

		自定义链做为target:

在这里插入图片描述在这里插入图片描述
需要调用
在这里插入图片描述
在这里插入图片描述
出战没放行但是通了 因为establied放行了
在这里插入图片描述
68主机不可以

在这里插入图片描述

在这里插入图片描述

INPUT调用后重新回去执行

被引用无法删除
在这里插入图片描述
在这里插入图片描述
但是链不为空
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

立即送往内核立即生效
下次开机还想要就需要保存规则

保存和载入规则:
	保存:iptables-save > /PATH/TO/SOME_RULE_FILE
	重载:iptabls-restore < /PATH/FROM/SOME_RULE_FILE
		-n, --noflush:不清除原有规则
		-t, --test:仅分析生成规则集,但不提交

在这里插入图片描述但是模块装载不生效 所以可以写脚本

在这里插入图片描述

规则优化的思路:
		使用自定义链管理特定应用的相关规则,模块化管理规则;
		
		(1) 优先放行双方向状态为ESTABLISHED的报文;
		(2) 服务于不同类别的功能的规则,匹配到报文可能性更大的放前面;
		(3) 服务于同一类别的功能的规则,匹配条件较严格的放在前面;
		(4) 设置默认策略:白名单机制
			(a) iptables -P,不建议;
			(b) 建议在规则的最后定义规则做为默认策略;
回顾:
	iptables/netfilter:
		netfilter:raw,mangle, nat, filter
			PREROUTING --> INPUT
			PREROUTING --> FORWARD --> POSTROUTING
			OUTPUT --> POSTROUTING 
		filter:INPUT,FORWARD,OUTPUT
		nat:PREROUTING,INPUT,OUTPUT,POSTROUTING
		
	iptables:
		[-t table] COMMAND [chain] rule-specification
			-m matchname [per-match-options]
			-t targetname [per-target-options]
			[options]
			
		匹配 条件:
			基本匹配条件:-s, -d, -p, -m, -i, -o
			扩展匹配条件:
				隐式扩展:
					-p tcp: --dport, --sport, --tcp-flags, --syn 
					-p udp:--dport, --sport
					-p imcp: --icmp-type
				显式扩展:
					multiport:--sports, --dports
					iprange:--src-range, --dst-range
					time:--timestart, --timestop, --weekdays, --monthdays, --datestart, --datestop
					string:--algo {bm|kmp}, --string
					connlimit:--connlimit-upto, --connlimit-above
					limit:--limit, --limit-burst
					state:--state
						NEW, ESTABLISHED, RELATED, INVALID, UNTRACKED
						
		target:
			-j:
				ACCEPT/DROP
				REJECT:--reject-with
				LOG:--log-level, --log-prefix
				自定义链
					RETURN
				
	iptables-save/iptables-restore

网络防火墙

规则全部清空
就是转发功能
因为过滤表支持INPUT,FORWARD,OUTPUT 所以转发应该卸载FORWORD上

在这里插入图片描述
192内网 172外网

这个主机两块网卡
在这里插入图片描述
在这里插入图片描述
也可以ping通 但是不叫转发
在这里插入图片描述在这里插入图片描述

在这里插入图片描述
在这里插入图片描述没有开启转发 所以并没有转发

在这里插入图片描述
打开立马就受到了 但是没有回来的
在这里插入图片描述

在这里插入图片描述
命名都发过去报文了 但是为什么没有收到呢
67也收到了 回复给了自己的网关

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述测试内网主机是否可以访问

在这里插入图片描述
现在添加防火墙
不允许所有的 都访问

这个时客户端
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可以出去了回不来

在这里插入图片描述
抓包发现确实收到了 但是也回应了
但是报文进不来

让响应报文可以进入
在这里插入图片描述在这里插入图片描述

很麻烦

使用状态机制

在这里插入图片描述
在这里插入图片描述在这里插入图片描述
内网可以向外访问服务 ssh
在这里插入图片描述
在这里插入图片描述

这个时候内网就可以访问外网都可以
由外向内拒绝

假设内网也开启httpd服务
希望别人访问

在这里插入图片描述
编写默认页面

只开放内网主机的一个80服务
在这里插入图片描述响应的也不用写 因为默认的establish都可以

在这里插入图片描述
在这里插入图片描述
因为服务还有udp的

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
ftp服务首先需要装在模块

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

开机自动加载

在这里插入图片描述

在这里插入图片描述

但是有危险 内网开放的端口 如果被攻击 那么就拥有该内网主机的权限 其余的内网都可以访问

所以一般有吧服务器单独放在一个区域(非军事化) 一个局域网只要是new的绝对不可以进来(军事区)

在这里插入图片描述所以军事区只是不当服务器 只有私网地址 如何访问互联网
非军事区时服务器所以是公网地址
这个时候就需要nat方式了~~~~~

iptables(3)
iptables/netfilter网络防火墙:
(1) 网关;
(2) filter表的FORWARD链;

	要注意的问题:
		(1) 请求-响应报文均会经由FORWARD链,要注意规则的方向性;
		(2) 如果要启用conntrack机制,建议将双方向的状态为ESTABLISHED的报文直接放行;

nat

隐藏主机的

	NAT: Network Address Translation
		请求报文:由管理员定义;
		响应报文:由NAT的conntrack机制自动实现; 
		
		请求报文:
			改源地址:SNAT,MASQUERADE
			改目标地址:DNAT

snat只可以在postrouting因为
进入后首先需要路由之后才知道是不是转发还是进入本机
确定是转发后forward链不可以转换
所以只能是Postrouting路由后从接口发出去前
因为服务器网卡很多 肯定是路由后选择了是从哪个网卡出去 才做源地址转换为这个网卡的ip
在这里插入图片描述上面是隐藏客户的ip的

演示snat

snat只能再路由后做
隐藏

在这里插入图片描述
192.168.10.2是内网
通过172.16.0.6访问外网
但是外网的67看到的访问的是172.16.0.6

在这里插入图片描述在这里插入图片描述内网访问

在这里插入图片描述
查看外部的网卡的抓包情况 确实是网关访问的

在这里插入图片描述
抓包可以看到访问的IP是0.6向外访问的
回复包也是回复给0.6 的

抓包另外一个网卡
在这里插入图片描述

内网访问

在这里插入图片描述

在这里插入图片描述在这里插入图片描述
这就是源地址转换

任何请求的包都会转换
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
但是万一–to-source更改了

动态ip需要MASQUERADE

在这里插入图片描述

DNAT

在路由之前

下面是隐藏服务器ip的
有时候服务器也需要dnat
目标地址转换
服务器主机在网关之后

在这里插入图片描述
网关收到请求后 网关本身没有服务 所以更改目标Ip 直接转发到后端真实的
响应表转发回去还需要再转回去

在这里插入图片描述响应报文也需要经过 更改ip

在这里插入图片描述响应报文nat连接追踪即可

更改目标地址要在prerouting路由前修改改 如果都到Input了那就当问用户空间了
dnat
后端多个服务器就轮询
这个其实就是lvs 后来都是lvs实现了

在这里插入图片描述
只需要识别目标端口即可 不需要监听任何端口 因为监控端口需要程序提供服务
直接在内核空间

在这里插入图片描述
snat dnat不要同时使用
现在是192.168.10.2监听在80端口,提供真正的服务
让172.16.0.67去访问172.16.0.6的80端口 他转发给192.168.10.2

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

访问的就是内网的主机

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

在这里插入图片描述
内网卡
在这里插入图片描述
可以看到目标地址已经转换了

在内网抓包
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述回到外网主机的网卡时 会自动更改sip的 源地址会重新改回去的
自己的nat追踪功能也直接吧出去的ip更改了

在这里插入图片描述

在这里插入图片描述也可以做目标端口转换的
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
看内网卡的8080端口
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
但是现在外部的可以访问
不想让172.16.0.200 主机访问

在这里插入图片描述
应该使用filter规则 过滤在forward链上

-d 因为目标地址转换在prerouting链目标地址都已经转换为内网的真实ip了
所以在forward链上 的-d 应该是真实的服务器的内网ip

在这里插入图片描述目标端口8080

在这里插入图片描述
在这里插入图片描述

这就是nat和filter结合的方法

但是真正负载均衡使用lvs 不需要dnat

重定向:

在这里插入图片描述

在这里插入图片描述

IPTABLES

防火墙的工作原理
iptable也是用来管理配置火墙的一种工具,使用iptable管理火墙比使用firewalld管理火墙要复杂一些。
iptable的四个表五条链

对于iptable我们要先了解它四个表五条链。 4个表分别为filter,nat,mangle,raw。

filter:一般的过滤功能
nat:用于nat功能(端口映射,地址映射等)
mangle:用于对特定数据包的修改
raw:有限级最高,设置raw时一般是为了不再让iptables做数据包的链接跟踪处理,提高性能

5条链分别为PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING。

PREROUTING:数据包进入路由表之前
INPUT:通过路由表后目的地为本机
FORWARD:通过路由表后,目的地不为本机
OUTPUT:由本机产生,向外转发
POSTROUTIONG:发送到网卡接口之前。

iptable的常用管理命令

iptable 
		-t	##指定表名称 
		-n	##不作解析
		-L	##列出指定表中的策略
		-A	##增加策略
		-p	##网络协议
		--dport ##端口
		-s	##数据来源
		-j	##动作
		ACCEPT	##允许
		REJECT  ##拒绝
		DROP	##丢弃
		-N	##增加链
		-E	##修改链名称
		-X	##删除链
		-D	##删除指定策略
		-I	##插入
		-R	##修改策略
		-P	##修改默认策略

首先我们将前面的firewalld关闭在再打开iptable。

 yum list iptables-services ##系统默认有iptables服务,查看
systemctl stop firewalld
systemctl disable firewalld
systemctl mask firewalld
systemctl start iptables.service
systemctl enable iptables.service

在这里插入图片描述

  iptables -nL  ##查看iptables的规则信息,默认查看的是filter默认表
  iptables -t filter -nL

在这里插入图片描述
在这里插入图片描述

 iptables -F    ##删除策略
 systemctl restart iptables.service
 重启服务后, iptables -nL 策略会重新出现
 清空策略-->重启服务-->策略恢复-->清空策略
 两种方式保存策略
 两种保存策略的方法
 (1) service iptables save     ##直接将策略保存到/etc/sysconfig/iptables
 (2) iptables-save
  iptables-save > /etc/sysconfig/iptables

在这里插入图片描述
在这里插入图片描述

  iptables -t filter -A INPUT -p tcp  --dport 22 -j  ACCEPT##添加允许22端口通过的规则
  iptables -t filter -A INPUT -s 192.168.212 -p tcp  --dport 22 -j  REJECT ##添加禁止212主机禁止访问22端口,不过读了第一条规则之后不会再读第二条规则
  iptables -D INPUT 2       ##删除第二个策略
  iptables -N redhat         ##添加链表redaht
  iptables -E redhat WESTOS  ##重命名为WESTOS
  iptables -X  WESTOS       ##删除WESTOS链表
  iptables -P INPUT DROP    ##更改策略为DROP

man iptables
添加策略
-n 不做解析
-L 查看, 列出
-t表名
-A 默认添加最后一行,策略相同只会读第一行
-D 删除
-I 默认添加到第一行
-R 替换,更改REJECT–>DROP
-S 可以看到策略内容
-F 都刷调了,清空策略
-Z 把统计包数为0
-P 只能更改为DROP ACCESS
-N 添加表
-E 重命名
-X 删除表
-m状态。ESTABLISH正在连接的,RELATED已经连接过的,NEW新的

添加squid+sshd+dns,拒绝其他服务
3128 22 53
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述-m状态。ESTABLISH正在连接的,RELATED已经连接过的,NEW新的

  iptables -F ##清空规则
  iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT  ##检测,
  iptables -A INPUT -m state --state NEW -i lo -j ACCEPT      ##允许新用户访问本地,服务和服务之间都是通过回环接口
 从上往下依次匹配策略,匹配不到可用端口,到最后一条则拒绝
  iptables -A INPUT -m state --state NEW -p tcp --dport 22 -j ACCEPT
  iptables -A INPUT -m state --state NEW -p tcp --dport 53 -j ACCEPT
  iptables -A INPUT -m state --state NEW -p tcp --dport 3128 -j ACCEPT
  iptables -A INPUT -j REJECT   ##拒绝使用其他服务
  只允许22.53.3128端口打开允许其他人连接,其余的都不可以
  iptables -nL
  iptables-save      ##保存
  iptables-save > /etc/sysconfig/iptables  ##导入
 iptables -F       ##清空策略
  systemctl restart iptables.service  ##重启服务 
  iptables -nL  ##重新可以查看到策略

在这里插入图片描述
在这里插入图片描述

########## nat ############
1.源地址转换
源地址转换即内网地址向外访问时,发起访问的内网ip地址转换为指定的ip地址,这可以使内网中使用保留ip地址的主机访问外部网络,即内网的多部主机可以通过一个有效的公网ip地址访问外部网络。

iptables -F
iptables -t nat -nL
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 172.25.254.111
把从eth0出去的都转换为172  路由之后  源地值转换
此时发起访问的内网ip通过这台主机向外传送数据时,ip地址转换为172.25.254.111
测试:ping

在这里插入图片描述
在这里插入图片描述

2.目标地址转换
做完源地址转换之后,其他主机去访问172.25.254.111这台主机只能访问到这台真实主机,而访问不到向它发送数据的真实主机,所以172.25.254.111这台主机需要做目标地址转换,让外部主机能找到通过172.25.254.111访问它的真实主机。

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 22 -j DNAT --to-dest 192.168.0.211:22
   ##真实主机
iptables -t nat -nL

测试;用真机ssh root@172.25.254.111
ifconfig 为192.168.0.211

在这里插入图片描述
在这里插入图片描述
设置其他主机访问本机22端口时,将目标转为 192.168.0.211主机的22端口。

#######selinux##########
selinux对服务端口的影响
安装http服务
在这里插入图片描述
重启服务并查看默认服务端口
在这里插入图片描述
编辑http服务配置文件
在这里插入图片描述
更改端口为8080
在这里插入图片描述重启服务,查看端口更改为8080
在这里插入图片描述再次更改端口为8888,重启服务后失败,为什么8080可以而8888不可以呢?
在这里插入图片描述
更改selinux为警告模式,重启服务之后成功。因此selinux影响服务端口
在这里插入图片描述
那么怎么在强制模式下也可以更改端口值为任何一个值呢?
在这里插入图片描述
查看http支持的端口,我们发现支持8080端口,而不支持8888端口,因此便得知为什么8080端口可以而8888端口在重启服务时失败了。
在这里插入图片描述
因此我们可以添加8888端口
在这里插入图片描述成功添加端口,因此可以重启服务更改端口为8888

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值