Linux防火墙基础知识

Linux的防火墙正确的来说并不算是防火墙,只是一种防火墙的功能体现。我们现在来讲解下Linux的这个防火墙功能的详细解释。

 

Linux的防火墙是由iptablesnetfilter两个程序组成的,而iptables是一个单独的程序,netfilter是集成到内核中的一个程序,两个程序合作才能拥有完整的防火墙功能。

 

Iptables的功能是向netfiler提供规则,netfilter则是将规则执行起来。

 

Linux防火墙还分为主机防火墙与网络防火墙。

主机防火墙:工作在一个主机的边缘,数据报文刚刚进入网卡的时候,设定一个防火墙。

网络防火墙:工作在一个局域网边缘的防火墙。


防火墙定义:工作于主机或网络边缘,对于进出的报文根据定义的规则做检查,进而对被规则匹配到的报文作为相应处理的套件

 

防火墙的功能:

IDSIntrusion Detect System,***检测系统

检测系统进程,如果有可疑行为就会报警


HIDSHost IDS

NIDSNetwork IDS


IPS:Intrusion Protect System,***防御系统

检测系统进程,如果有可疑行为就会进行相应操作,比如杀掉进程


HoneyPot: 蜜罐,专门利用别人会扫描的端口,将其开放用来吸引***进入你准备的陷阱


btbacktrack,专为安全应用的发行版

Nessusnmap

 

防火墙拥有五个钩函数(hook function

PREROUTING:路由前

INPUT:到达本机内部的报文必经之路

FORWARD:由本机转发的报文的必经之路

OUTPUT:由本机发出的报文的必经之路

POSTROUTING:路由后

 

Linux防火墙基础知识及配置_第1张图片

 

规则功能:优先级从左到右,从高到低

raw, mangle, net, filter


filter: 过滤,定义是否允许通过防火墙

net: 地址转发,启用connection_track

    SNAT

    DNAT

    PNAT

mangle: 会修改报文首部,例如:将网络首部跳数增加

raw:目标是关闭net表上启用的连接追踪功能


四个功能四个表

五个钩子五个链

 

做过滤的位置:

路由前与路由后都不做过滤,都不适合,一个过早一个过晚。



表和链的对应关系:

    filter: INPUT, FORWARD, OUTPUT

    nat: PREROUTINGSNT,源地址转换), POSTROUTINGDNAT,目标地址转换),OUTPUT

    mangle: PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING

    rawPREROUTING,OUTPUT



数据报文流程:

    跟本机内部进程通信:

        进入:PREROUTING,INPUT

        出去:OUTPUT,POSTROUTING


    由本机转发:

        PREROUTING, FORWARD, POSTROUTING


        数据报文的流向:

        源IP和目标IP由流向决定



主机防火墙主要是用于到达主机的请求。


app head:应用层首部

tcp head: TCP首部

ip  head: ip 首部

icmp:internet control messaging protocol

iptables: 用户空间的工具,写规则,并自动发往netfilter,立即生效;

netfilter:接受并生效规则

基本语法:
	iptables [-t TABLE(表)] COMMAND CHAIN CRETIRIA -j TARGET
	
	-t TABLE: 
		nat,mangle,raw,filter
		默认是:filter
	
	COMMAND:
		对链做管理:
			-F:flush,清空规则链,默认为对应表的所有链
			-N:new,自建一条链,只有被默认的链,中的某条规则选中,跳转过去才会被用到,没有规则,就会回到主链接着匹配
			-X:delete,删除自定义的空链
			-Z:zero,计数器归零
			-P:policy, 设置默认策略,对filter表来讲,默认规则为ACCEPT或DROP,允许或拒绝,所有规则不匹配才会用到
			-E:重命名自定义链
			
		对链中的规则做管理:
			-A: 在链中的尾部增加规则
			-I:插入一条新规则,在首部
			-D:删除规则的
			-R:替换规则的
		查询:
			-L:查询规则
				-n:显示的结果中IP地址不会被反解成主机名,数字格式显示主机地址和端口
				-v:详细格式,-vv,-vvv
				--line-numbers:显示规则编号
				-x:exactly,不要对计数器的结果做单位换算,而显示其精确值
				
		防火墙查询信息解析:
			pkts:包数,被本规则匹配到的报文数
			bytes:字节数,被本规则匹配到的所有包大小只和
			target: 处理机制
			prot:协议,ip报文中的报的协议
			opt: 选项
			in:流入的接口,从哪个网卡进来的
			out:流出的接口,从哪个网卡出去的
			source: 源地址
			destination: 目标地址
				
	-A使用方法:
		iptables [-t TABLE] -A 链名 匹配条件 -j 处理目标
			
			匹配条件:
				通用匹配
					-s 地址:指定报文源IP地址匹配的范围,匹配IP地址的源地址,可以是IP也可以是网络地址,可以使用!取反
						--src, --source: 都是-s一样的意思
					-d 地址: 指定报文目标IP地址匹配的范围,匹配IP地址的目标地址,可以是IP也可以是网络地址,可以使用!取反
						--dst, --destination: 都是-d一样的意思
					-p 协议:指定匹配报文的协议类型,一般有三种tcp,udp和icmp;
					-i INTERFACE: 数据报文流入的接口,放在数据流入的前半段,PREROUTING,INPUT,FORWARD
					-o INTERFACE:数据报文流出的接口,放在数据流出的后半段,OUTPUT,FORWARD,POSTROUTING
					
				扩展匹配:
					隐式扩展:当使用-p{tcp|udp|icmp}中的一种时,可以直接使用扩展专用选项
						-p tcp:
							--sport PORT[-PORT]: 指定源端口
							--dport PORT[-PORT]: 指定目标端口
							--tcp-flags: 做标志位扩展
								--tcp-flag 要检查标志位列表(用都好分割),必须为1的标志位列表(逗号分割)
									例如: --tcp-flags syn,ack,rst,fin syn
											all none: 所有位都为0
											all all: 所有为都为1
								--syn: 相当于只放型syn为1的
				
						-p udp:
							--sport PORT[-PORT]: 指定源端口
							--dport PORT[-PORT]: 指定目标端口
						
						-p --icmp-type
								0: echo-reply,ping响应
								8: echo-request,ping请求
							
					显式扩展:必须明确说明使用哪个模块进行扩展,而后才能使用扩展专用选项
						-m state --state
						-m limit
						-m time
							
	
			处理目标:
				内置目标:
					过滤:
						拒绝
							DROP:悄悄的丢弃
							REJECT:有返回信息
						允许
							ACCEPT
						在自定义链中无法匹配报文时,将其返回主链
							RETURN 
删除规则:
		-D:删除规则的
			iptables [-t TABLE] -D CHAIN RULENUM
		
	策略设置:
		iptables [-t table] -P chain target
		
	修改规则:
		iptables [-t table] -R chain rulenum rule-specification
	
	插入规则:
		iptables [-t table] -I chain [rulenum] rule-specification
			默认插入到第一条,与-A相反。
	
	隐式扩展:
		--tcp-flag 要检查标志位列表(用都好分割),必须为1的标志位列表(逗号分割)
			例如: --tcp-flags syn,ack,rst,fin syn
				all none: 所有位都为0
				all all: 所有为都为1
		--syn:相当于syn为1
		
		-p --icmp-type
		0: echo-reply,ping响应
		8: echo-request,ping请求

	目标:
		RETURN: 在自定义链中无法匹配报文时,将其返回主链
	
	创建自定义链:
		iptables [-t table] -N chain
			例如:iptables -t filter -N http_in
	
	设置调用自定义连接
		iptables -A INPUT -d 192.168.1.1 -p tcp --dport 80 -j http_in	
			设置访问目标地址为192.168.1.1服务器的80端口的连接都转到httpd_in这个自定义链上
	
	如果自定义链没有匹配的,将会回到主链
		iptables -A http_in -j RETURN	
	
	删除自定义且0引用的空链:
		iptables [-t table] -X chain
			例如:iptable -X http_in
	
	重命名自定义且0引用的空链:
		iptables [-t table] -E old_name new_name
			例如:iptables -E http_in web_in
			
以上为主机防火墙的规则定义,我们现在来分析下:
    1、如何过滤外部连接进入主机。
        外部连接进入主机要先从进入网卡进入,然后通过PREROUTING,再由路由选择进入INPUT,通过INPUT进入主机,接着由OUTPUT出去,再次路由选择,最有从POSTROUTING经过,由出去的网卡出去。
        注意:这里的网卡可能是同一个也可能是两块不同的网卡,主要看你主机状态,这点要弄清楚,否则规则可能会写错。
        如下图:

    Linux防火墙基础知识及配置_第2张图片    

    

由上图可以得出,我们如果要过滤外面进来的连接需要在INPUT这个钩子的表上写规则。
    而规则又要卸载filter这个链上面,filter链是默认的,所以不需要特意指定链
    
    命令:
       iptables  -A INPUT -d 192.168.1.129 -p tcp --dport 22 -j ACCEPT
            开发22号端口,用于ssh连接,否则你的连接可能会直接挡掉
       iptables -P INPUT DROP
            将INPUT的默认状态改为DROP从而挡掉所有不允许通过的连接。
        
 以上就是开放一个端口,并且挡掉所有端口的命令,如果你想要开放某个端口可以参照以上例子。
 iptables  -A INPUT -d 服务器地址 -p 协议 --dport 需要开发的端口 -j ACCEPT

 注意:防火墙的过滤规则只在filter的链上做,其他链不做过滤使用。因此一般做过滤都不需要指定链


以上为主机防火墙的实例。


现在来看下网络防火墙的实例


网络防火墙:

网络防火墙主要用于到达网络的请求。


    网络防火墙我们一般用户NAT转换的比较多。


    

    打开net转发:

vim /etc/sysctl.conf

            net.ipv4.ip_forward = 1 修改这个数值可以永久打开net转发

    sysctl -p: 是sysctl文件重新加载,让配置生效

cat /proc/sys/net/ipv4/ip_forward :查看是否已经打开net转发,1为打开0为关闭

CentOS 7 设置转发:ip route add 0.0.0.0/0.0.0.0 via 192.168.1.1

所有的地址进入都转发到192.168.1.1

ftp的转发也需要开启nf_conntrack_ftp这个模块来,启动追踪。

否则防火墙开启了也不能连接到ftp

设置开机自动装载模块:

1、vim /etc/sysconfig/iptables-config 

IPTABLES_MODULES="nf_conntrack_ftp":开机自动装载模块选项

2、写一个脚本,开机自动运行将iptables的命令键入


    设置了以上的NET转发之后,所有将网关指向这台服务器地址的客户端,都讲由这台服务器转发出去。


    注意:到此虽然你的转发可以发出去但是却不能收回,因为你的地址只是你个人的,不是公网上的,所以我们现在需要做一个nat源地址替换。

    

    我们要做源地址转换的nat需要在防火墙的POSTROUTING这个链上面做。因为源地址转换的话,就是在路由选择之后要出去了,但是还没出去之前将地址伪装成我们的公网地址,这样数据回来的时候就能找到我们的地址了。
    
    nat:Network Address Translation
		网络地址转换,为了安全
		
		地址转换:
			SNAT:源地址转换
			DNAT:目标地址转换
			PNAT:端口转换
			
			FULL NAT:全地址转换
	
	SNAT:
		
		专用选项:
			SNAT --to-source SIP
				转换成哪个源地址
			
			MASQUERADE:地址伪装,用于ADSL网络,会将地址转换成拨号之后的地址。
			
			例如:iptables -t nat -R POSTROUTING 1 -s 192.168.2.0/24 -j SNAT --to-source 192.168.1.129

		nat转换都会带有一个相反的响应,而相反的响应是不需要专门指定的,nat会自己根据自己的追踪表来确定转换地址:
			请求的是目标就会响应源
			请求的是源就会响应目标
				例如:如果nat转换请求外部主机,那么回来的时候就是响应
					请求的时候是源地址转换,回来的时候是目标地址转换
					请求的时候需要指定源地址转换,回来的时候nat会根据自己的追踪表来确定目标地址。
					

	DNAT,PNAT:
		目标地址转换的时候,可以一样进行端口转换。
		
		--to-destination
	
	FULL NAT:全地址转换	
		既转换目标地址,也转换源地址。
		例如:公司内有多个局域网,地址出去的时候需要通过一个路由器,所以转换的时候通过full nat转换目标地址与源地址。
		
		
		
    以上是nat的选项
    
    现在来配置一下:
        这里需要用-t指定表,因为默认是filter这个表
        
        iptales -t nat -A -s 192.168.0.0/16 -j SNAT --to-soure 192.168.1.1 
        
        这样就可以将所有从服务器出去的192.168这个网段的地址伪装成192.168.1.1 这个地址。



以上为基础只是,如果有什么问题也可以在博客留言。