内容:算法
一、防火墙简介shell
二、iptables简介浏览器
三、iptables的使用说明(主机防火墙和网络防火墙)安全
四、iptables的保存bash
1、防火墙简介服务器
一、防火墙(Firewall),它是一种位于内部网络与外部网络之间的网络安全系统。一项信息安全的防御系统,依照特定的规则,容许或是限制传输的数据经过。内部网络和外部网络之间的全部网络数据流都必须通过防火墙,这是防火墙所处网络位置特性,同时也是一个前提。由于只有当防火墙是内、外部网络之间通讯的惟一通道,才能够全面、有效地保护企业网内部网络不受侵害,因此防火墙通常部署在内网的最外层。网络
二、防火墙的主要类型并发
网络层防火墙:框架
网络层防火墙可视为一种 IP 封包过滤器,运做在底层的TCP/IP协议堆栈上。咱们能够以枚举的方式,只容许符合特定规则的封包经过,其他的一律禁止穿越防火墙(病毒除外,防火墙不能防止病毒侵入)。这些规则一般能够经由管理员定义或修改,不过某些防火墙设备可能只能套用内置的规则。tcp
咱们也能以另外一种较宽松的角度来制定防火墙规则,只要封包不符合任何一项“否认规则”就予以放行。操做系统及网络设备大多已内置防火墙功能。
较新的防火墙能利用封包的多样属性来进行过滤,例如:来源 IP地址、来源端口号、目的 IP 地址或端口号、服务类型(如 HTTP 或是 FTP)。也能经由通讯协议、TTL 值、来源的网域名称或网段...等属性来进行过滤。
应用层防火墙:
应用层防火墙是在 TCP/IP 堆栈的“应用层”上运做,您使用浏览器时所产生的数据流或是使用 FTP 时的数据流都是属于这一层。应用层防火墙能够拦截进出某应用程序的全部封包,而且封锁其余的封包(一般是直接将封包丢弃)。理论上,这一类的防火墙能够彻底阻绝外部的数据流进到受保护的机器里。
防火墙借由监测全部的封包并找出不符规则的内容,能够防范电脑蠕虫或是***程序的快速蔓延。不过就实现而言,这个方法既烦且杂(软件有千千百百种啊),因此大部分的防火墙都不会考虑以这种方法设计。
主机防火墙:每个独立的主机都会载有防火墙的设置,主要用于请求和接受数据,主要做用在filter表的INPUT和OUTPUT链
网络防火墙:部署在一个网络的出口位置,用于保护整个内部网络,主要用于转发数据,主要做用在filter表的FORWORD链和nat表的对应链中
2、iptables简介
一、iptables的前身叫ipfirewall,这是一个做者从freeBSD上移植过来的,可以工做在内核当中的,对数据包进行检测的一款简易访问控制工具。可是ipfirewall工做功能极其有限(它须要将全部的规则都放进内核当中,这样规则才可以运行起来,而放进内核,这个作法通常是极其困难的)。当内核发展到2.x系列的时候,软件改名为ipchains,它能够定义多条规则,将他们串起来,共同发挥做用,而如今,它叫作iptables,能够将规则组成一个列表,实现绝对详细的访问控制功能,它是依赖许多行和列组成的规则表组成,所以叫iptables。。
二、iptables其实应该叫netfilter/iptables它实际上由两个组件netfilter 和 iptables 组成。
netfilter 组件也称为内核空间(kernelspace),是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。
iptables 组件是一种规则编写工具,也称为用户空间(userspace),它使插入、修改和除去信息包过滤表中的规则变得容易。
三、iptables是定义规则的工具,自己并不算是防火墙。它定义的规则,可让在内核空间当中的netfilter来读取,而且实现让防火墙工做。而放入内核的地方必需要是特定的位置,必须是tcp/ip的协议栈通过的地方。而这个tcp/ip协议栈必须通过的地方,能够实现读取规则的地方就叫作 netfilter.(网络过滤器)
内核空间中有5个位置能够被设计来进行数据的过滤:
(1.进入本机的外网接口(PREROUTING)
(2.数据包从内核流入用户空间的(INPUT)
(3.数据包从用户空间流出的(OUTPUT)
(4.从一个网络接口进来,到另外一个网络接口去的(FORWORD)
(5.离开本机的内网接口(POSTROUTING)
由上图能够看出,一个数据包通过时,有必须通过这5个关卡的其中一个或多个,而每一个关卡均可以作相关的规则来进行限制,这个关卡的就叫作CHAIN(链),而每一个关卡都会经过数据包的特征来进行判断(IP、port等)
iptables的表有四种,顾名思义,每一个表的名字都已经高度归纳了其功能,即filter表、nat表、mangle表和raw表,分别用于实现包过滤(防火墙),网络地址转换、包重构(修改)和数据跟踪处理,而每一个表又定义了不一样的链组合:
表的优先级:
row--mangle--nat--filter
其中INPUT、OUTPUT链更多的应用在“主机防火墙”中,即主要针对服务器本机进出数据的安全控制;而FORWARD、PREROUTING、POSTROUTING链更多的应用在“网络防火墙”中,特别是防火墙服务器做为网关使用时的状况。
3、iptables的安装以及使用说明
一、netfilter:位于内核中的tcp/ip协议栈报文处理框架,通常只须要安装iptables管理工具便可
二、iptables命令:
iptables的语法:
iptables [-t TABLE] COMMAND CHAIN [num] 匹配标准 -j(jump) 处理办法
注意全部的规则都是添加上去后当即生效,但不是永久生效。
规则:根据指定的匹配条件来尝试匹配每一个流经此处的报文,一旦匹配成功,则由规则后面指定的处理动做进行处理;
匹配条件:
基本匹配条件:源地址,目标地址,传输层协议
扩展匹配条件:须要借助于扩展模块进行指定的匹配条件
隐式扩展:已经在基本匹配条件中指明的协议相关的扩展;
显式扩展:隐式扩展以外的其它扩展匹配条件;
处理动做:
基本动做:ACCEPT,DROP,...
扩展动做:须要借助于扩展模块进行,但无须显式指定,仅需指明动做;
添加规则时须要考量的问题:
(1) 报文流经的位置:用于判断将规则添加至哪一个链;
(2) 实现的功能:用于判断将规则添加至哪一个表;
(3) 报文的方向:用于判断哪一个为“源”,哪一个为“目标”;
(4) 匹配条件:用于编写可以正确匹配目标报文的规则;
三、iptabls命令的使用格式:
table只有四个,因此无需多讲,下面来看看COMMAND的用法
(1)COMMANDS:按照功能分类,大体能够分为一下几类:
链管理类:
-P:定义链的默认策略;其target通常可以使用ACCEPT或DROP,accept表示全部均可以经过,只有设置的黑名单不能经过,而drop的效果相反,全部都不能经过,只有白名单的才能经过,建议使用accept白名单的模式;
-N:自定义规则链;仅在默认链经过某规则进行调用方可生效;所以,每一个自定义链都有其引用记数;
-X:删除自定义的空的引用计数为0的链;
-F:-F [chain [rulenum]] [options...],清空指定的链,或删除指定链上的规则 ;
-E:-E old-chain-name new-chain-name,重命名自定义的引用计数为0的链;
-Z:-Z [chain [rulenum]] [options...],置零
规则管理类:
-A:追加规则到指定的链尾部;
-I:插入规则到指定的链中的指定位置,默认为链首;
-D:删除指定的链上的指定规则;
-R:将指定的链上的指定规则替换为新的规则;
查看规则类:
-L:list, iptables [-t table] -L [chain [rulenum]] [options...]
-n:数字格式;
-v:verbose,详细格式信息;
-vv, -vvv
--line-numbers:显示链上的规则的编号;
-x:exactly,显示计数器的精确值;
注意,查看时 iptables -Lvn和iptables -vnL的命令效果是不同的,参数是按顺序来进行匹配
iptables-save能够在标准输出查看全部的表的规则状况。
计数器类:
每条规则以及链的默认策略分别有各自的两个计数器:
1) 匹配到的报文的个数:pkts
2) 匹配到的全部报文的大小之积:bytes
(2)PARAMETER(匹配条件)
匹配条件能够分为:基本的匹配条件和扩展的匹配条件,
注意:多重条件之间的隐含逻辑为“与”操做;
基本匹配条件:
[!] -s, --source address[/mask][,...]:检查报文中的源IP地址是否符合此处指定的地址或地址范围;
[!] -d, --destination address[/mask][,...]:检查报文中的目标IP地址是否符合此处指定的地址或地址范围;
[!] -p, --protocol protocol:检查报文中传输层的协议类型,支持tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh,或者 "all";
[!] -i, --in-interface name:检查报文进入本机时的接口是否符合本处指定的接口;INPUT, FORWARD and PREROUTING ;
[!] -o, --out-interface name:检查报文即将离开本机时经由的接口是否符合本处指定的接口;FORWARD, OUTPUT and POSTROUTING;
-m, --match match:显式指明要使用的扩展模块;
-j, --jump target:跳转目标;
扩展匹配条件:
隐式扩展:不用-m选项明确给出要使用的扩展机制的扩展;此处主要指使用-p {tcp|udp|icmp}给定协议后可直接对给定的协议所进行的扩展;
-p tcp:可直接使用tcp协议对应的扩展选项;
[!] --source-port,--sport port[:port]:匹配报文中的传输层的源端口;可给出多个链接的端口;
[!] --destination-port,--dport port[:port]:匹配报文中的传输层的目标端口;可给出多个链接的端口;
[!] --tcp-flags mask comp
tcp-flags:SYN,ACK,FIN,RST,URG,PSH;
mask:要检查的标志位列表,以逗号分隔,例如SYN,ACK,FIN,RST
comp:mask给定的众标志位中,其值必须为1的标志位列表,余下的必须为0;
--tcp-flags SYN,ACK,FIN,RST SYN
[!] --syn:至关于--tcp-flags SYN,ACK,FIN,RST SYN
-p udp:可直接使用udp协议对应的扩展选项;
[!] --source-port,--sport port[:port]:匹配报文中的传输层的源端口;可给出多个链接的端口;
[!] --destination-port,--dport port[:port]:匹配报文中的传输层的目标端口;可给出多个链接的端口;
-p icmp:可直接使用icmp协议对应的扩展选项;
[!] --icmp-type {type[/code]|typename}
--icmp-type 0/0:匹配对ping请求的响应报文
--icmp-type 8/0:匹配ping请求报文
显式扩展:必须使用-m选项给出matchname的扩展,并且有些扩展都还存在专用选项;
1)multiport:以离散或连续的方式定义的多端口匹配条件; Up to 15 ports can be specified.
[!] --source-ports,--sports port[,port|,port:port]...:指定多个源端口;
[!] --destination-ports,--dports port[,port|,port:port]...:指定多个目标端口;
!] --ports port[,port|,port:port]...:匹配此处指定的源或目标端口;
2)iprange:以连续的ip地址范围指明多地址匹配条件;
[!] --src-range from[-to]
[!] --dst-range from[-to]
3)string:对报文中的应用层数据作字符串匹配检测;
[!] --string pattern
[!] --hex-string pattern
--algo {bm|kmp}:字符串匹配检查算法(这是必须带上的参数,不然会报错);
4)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...]
5)connlimit :根据每客户端IP作并发链接数限制,即限制单IP可同时发起链接请求;
--connlimit-upto n:链接数小于等于阈值;
--connlimit-above n:链接数超出阈值;
例:
~]# iptables -I INPUT -d 10.1.0.6 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT:表示容许SSH链接的最大链接数为2个。
6)limit :基于收发报文的速率进行匹配;
--limit rate[/second|/minute|/hour|/day]
- -limit-burst number
例:
~]# iptables -A INPUT -d 10.1.0.6 -p icmp --icmp-type 8 -m limit --limit-burst 3 --limit 20/minute -j ACCEPT #每分钟只能处理ping请求20个
7)state :状态检测:链接追踪机制(conntrack)
NEW:新链接
ESTABLISHED:已创建的链接
RELATED:相关联的链接
INVALID:没法识别的链接
UNTRACKED:未被追踪链接;
相关的内核模块:
nf_conntrack
nf_conntrack_ipv4
nf_conntrack_ftp
追踪到的链接保存在/proc/net/nf_conntrack文件中;
能追踪的最大链接数量定义在:/proc/sys/net/nf_conntrack_max
建议调整至足够大;
不一样的协议的链接追踪时长定义在:/proc/sys/net/netfilter/
用法:
[!] --state state
例:如何开放被动模式的ftp服务步骤:
1) 装载追踪ftp协议的模块;
# modprobe nf_conntrack_ftp
2) 放行入站命令链接
# iptables -A INPUT -d SERVER_IP -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
3) 放行入站数据链接
# iptables -A INPUT -d SERVER_IP -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
4) 放行出站的ESTABLISHED链接
# iptabls -A OUTPUT -s SERVER_IP -m state --state ESTABLISHED -j ACCEPT
(3)target:要处理的动做,通常有-j来跳转进行动做的处理
处理动做(跳转目标):
-j tagetname [per-target-options]
简单target:ACCEPT,DROP
扩展target:
REJECT:(拒绝服务)
--reject-with type
icmp-net-unreachable, icmp-host-unreachable, icmp-port-unreachable, icmp-proto-unreach‐able, icmp-net-prohibited, icmp-host-prohibited, or icmp-admin-prohibited,默认为icmp-port- unreachable;
LOG:记录日志
Turn on kernel logging of matching packets.
--log-level level
--log-prefix prefix:日志信息的前导信息;
(4)自定义链的使用:
1)新建一个自定链
[root@localhost ~]# iptables -N nihao [root@localhost ~]# iptables -vnL Chain INPUT (policy ACCEPT 32 packets, 2304 bytes) pkts bytes target prot opt in out source destination Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 9 packets, 876 bytes) pkts bytes target prot opt in out source destination Chain nihao (0 references) pkts bytes target prot opt in out source destination
2)向自定义链添加规则
# iptables -A nihao -d 10.1.252.36 -p tcp --dport 21 -j DROP
3)将要处理的数据包跳转至自定义连接
# iptables -A INPUT -d 10.1.252.36 -j nihao
4)删除自定链
[root@localhost ~]# iptables -X nihao [root@localhost ~]# iptables -nvL Chain INPUT (policy ACCEPT 10 packets, 859 bytes) pkts bytes target prot opt in out source destination Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 4 packets, 416 bytes) pkts bytes target prot opt in out source destination
四、iptables/netfilter网络防火墙:
一、添加规则于FORWARD链,注意几个问题:
(1) 请求和响应报文均会经由FORWARD链,要注意规则的方向性;
第一条:iptables -I FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
(2) 若是能够启用conntrack机制,注意网关主机所可以追踪的链接数的最大数量要符合须要
二、NAT:
NAT英文全称是Network Address Translation,称是网络地址转换,它是一个IETF标准,容许一个机构以一个地址出如今Internet上。NAT将每一个局域网节点的地址转换成一个IP地址,反之亦然。它也能够应用到防火墙技术里,把个别IP地址隐藏起来不被外界发现,使外界没法直接访问内部网络设备,同时,它还帮助网络能够超越地址的限制,合理地安排网络中的公有Internet 地址和私有IP地址的使用。
NAT的类型
静态NAT(Static NAT)
静态NAT设置起来最为简单和最容易实现的一种,内部网络中的每一个主机都被永久映射成外部网络中的某个合法的地址。
动态地址NAT(Pooled NAT)
动态地址NAT是在外部网络中定义了一系列的合法地址,采用动态分配的方法映射到内部网络。
源地址转换:SNAT,做用在POSTROUTING链上
静态转换:
动态转换:
目标地址转换:DNAT,做用在PREROUTING链上
(1).SNAT基于原地址的转换
基于原地址的转换通常用在咱们的许多内网用户经过一个外网的口上网的时候,这时咱们将咱们内网的地址转换为一个外网的IP,咱们就能够实现链接其余外网IP的功能。
定义的格式:
好比咱们如今要将全部192.168.10.0网段的IP在通过的时候全都转换成172.16.100.1这个假设出来的外网地址:
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT --to-source 172.16.100.1
这样,只要是来自本地网络的试图经过网卡访问网络的,都会被通通转换成172.16.100.1这个IP.
那么,若是172.16.100.1不是固定的怎么办?
咱们都知道当咱们使用联通或者电信上网的时候,通常它都会在每次你开机的时候随机生成一个外网的IP,意思就是外网地址是动态变换的。这时咱们就要将外网地址换成 MASQUERADE(动态假装):它能够实现自动寻找到外网地址,而自动将其改成正确的外网地址。因此,咱们就须要这样设置:
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j MASQUERADE
(2).DNAT目标地址转换
对于目标地址转换,数据流向是从外向内的,外面的是客户端,里面的是服务器端经过目标地址转换,咱们可让外面的ip经过咱们对外的外网ip来访问咱们服务器不一样的服务器,而咱们的服务却放在内网服务器的不一样的服务器上。
定义的格式:
iptables -t nat -A PREROUTING -d 192.168.10.18 -p tcp --dport 80 -j DNAT --todestination 172.16.100.2
目标地址转换要作在到达网卡以前进行转换,因此要作在PREROUTING这个位置上
4、iptables的保存
一、保存和载入规则,建议使用手动保存规则列表:
经过重定向保存:iptables-save > /PATH/TO/SOME_RULE_FILE
重载:iptables-restore < /PATH/FROM/SOME_RULE_FILE 注意:重载文件中的规则,会清除已有规则;
-n, --noflush:不清除原有规则
-t, --test:仅分析生成规则集,但不予提交;
CentOS 6:
保存规则:service iptables save:保存规则于/etc/sysconfig/iptables,保存操做会清除文件中原有的内容;
也能够iptables-save命令重定向输出文本保存,须要恢复时iptables-restore进行重定向输入便可导入
CentOS 7开机自动生效规则:
(1) firewalld服务;
(2) shell脚本,直接记录iptables命令;
(3) 自定义unit file或init script;
规则优化的思路:
(1) 优先放行双方向状态为ESTABLISHED的报文;
(2) 服务于不一样类别的功能的规则,匹配到报文可能性更大的放前面;
(3) 服务于同一类别的功能的规则,匹配条件较为严格的放前面;
(4) 设置默认策略:白名单机制
(a) 可以使用iptables -P设定默认策略;
(b) 建议在规则链的最后定义规则作为默认策略;
OK,更多文章请关注个人博客。