第1章 iptables防火墙简介
1.1 防火墙作用
1.1.1 做访问控制
企业实际工作当中, 建议采购硬件防火墙(思科ASA 华为 H3C)
软件防火墙:iptables(centos6) firewalld(centos7)
大并发访问架构:选择硬件防火墙
小并发访问架构:选择软件防火墙
1.1.2 总结说明
1) iptables是基于内核的防火墙,功能非常强大,基于数据包的过滤!特别是可以在一台非常低的硬件配置下跑的非常好。
注:iptables主要工作在OSI七层的2.3.4层。七层的控制可以使用squid代理+iptables。
2) iptabes:生产中根据具体情况,一般,内网关闭,外网打开。大并发的情况不能开iptables,影响性能,iptables是要消耗CPU的,所以大并发的情况下,我们使用硬件防火墙。selinux:生产中也是关闭的。可以做ids的***检测。
3) 实际生产中尽可能不给服务器配置外网IP。可以通过代理转发。比如,nagios就不需要外网。
4) 并发不是很大的情况下,在外网的IP环境,开防火墙。
5) 第一次直接默认规则生成配置文件,以后就在配置文件中进行修改(编辑添加删除)。
6) 封掉IP:根据IP地址和网络连接数进行封杀。(定时任务,定时封掉,判断,存在就不再进行二次封杀)
扩展:iptables作为主要讲解防火墙服务
firewalld最新的软件防火墙:利用不同级别(zone)
1.2 学好iptables的基础
Ø OSI 7层模型以及不同层对应哪些协议
Ø TCP/IP三次握手,四次断开的过程,TCP HEADER, 状态转换
Ø 常用的服务端口要非常清楚了解
Ø 常用的服务需要原理http协议,ICMP协议。
参考书籍资料:tcp/ip协议卷1
1.3 iptables防火墙介绍
Netfilter/Iptables(以下简称Iptables)是unix/linux自带的一款优秀且开放源代码的完全自由的基于包过滤的防火墙工具,它的功能十分强大,使用非常灵活,可以对流入和流出服务器的数据包进行很精细的控制。特别是它可以在一台非常低的硬件配置服务器上跑的非常好(赛扬500HZ cpu 64M 内存的惲况下部署网关防火墙),提供近400人的上网服务丝毫不逊色企业级专业路由器防火墙。 iptables + zebra + squid (企业常用网络开源产品)。
补充:Netfilter一个系统的内核模块,通过netfilter内核控制硬件设备
Iptables相当于是一个控制软件
iptables + zebra + squid====一台硬件防火墙(iptables--->防火墙,zebra--->路由器,squid--->缓存)
iptables是linux2.4及2.6内核中集成的服务,其功能与安全性比其老一蜚ipfwadm,ipchains 强大的多,iptables主要工作在0SI七层的二、三、四层,如果重新编译内核,iptables也可以支持 7 层控制(squid代理+iptables)。
实现应用层访问控制:Nginx WAF实现访问控制。(属于架构)
1.4 iptables名词和术语
容器:包含或者说属于的关系
1.4.1 什么是容器
容器:用来包装或装载物品的贮存器(如箱、罐、坛)或者成形或柔软不成形的包覆材料.
第一个容器:iptables(包含表)
第二个容器:表(包含链)
第三个容器:链(包含规则)
1.4.2 什么是表(tables)?
表(tables)是链的容器,即所有的链(chains)都属于其对应的表(tables).如上,如果把Netfilter看成是某个小区的一栋楼.那么表(tables)就是楼里的其中的一套房子。
1.4.3 什么是链(chains)?
链(chains)是规则(Policys)的容器。接上,如果把表(tables)当作有一套房子,那么链(chains)就可以说是房子里的家具(柜子等)。
1.4.4 什么是规则(Policy)?
规则(Policy)就比较容易理解了,就是iptables系列过滤信息的规范和具体方法条款了。可以理解为柜子如何增加并摆放柜子东西等。
1.5 iptables服务表和链的概念
1.5.1 iptables四表五链
表(tables) |
链(chains) |
|
filter表 |
强调:主要和主机自身相关,真正负责主机防火墙功能的(过滤流入流出主机的数据包) filter表示iptables默认使用的表,这个表定义了三个链(chains) 这是默认表,实现防火墙数据过滤功能。 企业工作场景:主机防火墙 |
|
INPUT |
负责过滤所有目标地址是本机地址的数据包 通俗来说:就是过滤进入主机的数据包 对于指定到本地套接字的包,即到达本地防火墙服务器的数据包。 |
|
FORWARD |
负责转发流经主机的数据包。起转发的作用,和NAT关系很大, LVS NAT模式,net.ipv4.ip_forword=0 路由穿过的数据包,即经过本地防火墙服务器的数据包。 |
|
OUTPUT |
处理所有源地址是本机地址的数据包 通俗的讲:就是处理从主机发出去的数据包 本地创建的数据包 |
|
NAT |
当遇到新创建的数据包连接时将参考这个表 |
|
PREROUTING |
一进来就对数据包进行改变 |
|
OUTPUT |
本地创建的数据包在路由之前进行改变 |
|
POSTROUTING |
在数据包即将出去时改变数据包信息 |
|
Mangle |
这个表专门用于改变数据包 |
|
INPUT |
进入到设备本身的包 |
|
FORWARD |
对路由后的数据包信息进行修改 |
|
PREROUTING |
在路由之前更改传入的包 |
|
OUTPUT |
本地创建的数据包在路由之前进行改变 |
|
POSTROUTING |
在数据包即将离开时更改数据包信息 |
|
raw |
此表用处较少,可以忽略不计。 This table is used mainly for configuring exemptions from connection tracking in combination with the NOTRACK target. |
|
PREROUTING |
for packets arriving via any network interface |
|
OUTPUT |
for packets generated by local processes |
1.5.2 filter表信息详细介绍
filter表 |
主要和主机自身相关,真正负责主机防火墙功能的(过滤流入流出主机的数据包) filter表是iptables默认使用的表,这个表定义了三个链(chains) 企业工作场景:主机防火墙 |
INPUT |
负责过滤所有目标是本机地址的数据包 通俗来说:就是过滤进入主机的数据包 |
FORWARD |
负责转发流经主机的数据包。起到转发的作用,和NAT关系很大。 LVS NAT 模式,net.ipv4.ip_forward=0 |
OUTPUT |
处理所有源地址是本机地址的数据包 通俗的讲:就是处理从主机发出的数据包 |
1.5.3 NAT表信息详细介绍
NAT表 |
负责网络地址转换的,即来源与目的的IP地址和port的转换。 应用:和主机本身无关,一般用于局域网共享上网或者特殊的端口转换相关. 工作场景: 1、用于企业路由(zebra)或网关(iptables),共享上网(POSTROUTING) 2、做内部外部IP地址一对一映射(dmz),硬件防火墙映射IP到内部服务器,FTP服务(PREROUTING) 3、WEB,单个端口的映射,直接映射80端口(PREROUTING) 这个表定义了3个链,nat功能相当于网络的acl控制。和网络交换机acl类似。 |
OUTPUT |
和主机放出去的数据包有关,改变主机发出数据包的目的地址。 |
PREROUTING |
在数据包到达防火墙时,进行路由判断之前执行的规则,作用是改变数据包的目的地址、目的端口等 就是收信时,根据规则重写收件人的地址 例如:把公网IP: xxx.xxx.xxx.xxx 映射到局域网的 x.x.x.x 服务器 如果是web服务,可以把80转换为局域网的服务器9000端口上。 |
POSTROUTING |
在数据包离开防火墙时进行路由判断之后执行的规则,作用改变数据包的源地址,源端口等。 写好收件人的地址,要让家人回信时能够有地址可回。 例如。默认笔记本和虚拟机都是局域网地址,在出网的时候被路由器将源地址改为公网地址。 生产应用:局域网共享上网。 |
1.6 iptables工作流程(规则)
工作流程总结:
1. 防火墙是层层过滤的,实际是按照配置规则的顺序从上到下,从前到后进行过滤的。
2. 如果匹配上规则,即明确表示是阻止还是通过,数据包就不再向下匹配新的规则。
3. 如果规则中没有明确表明是阻止还是通过的,也就是没有匹配规则,向下进行匹配,
直到匹配默认规则得到明确的阻止还是通过。
4. 防火墙的默认规则是所有规则执行完才执行的。
第2章 iptables操作
2.1 iptables参数说明
参数 |
参数说明 |
||
显示相关参数 |
|||
-n/--numeric |
以数字的方式显示地址或端口信息 |
||
-L/ --list |
列出一个链或所有链中的规则信息 |
||
--list-rules/-S |
Print the rules in a chain or all chains |
||
--line-number |
当列出规则信息时,打印规则行号 |
||
-v |
显示详细信息,可以叠加 |
||
-h |
显示帮助信息 |
||
初始化相关参数 |
|||
iptables -F |
清除所有规则,不会处理默认的规则 |
||
iptables -X |
删除用户自定义的链 |
||
iptables -Z |
链的计数器清零(数据包计数器与数据包字节计数器) |
||
配置常用参数 |
|||
-t 表名称 |
指定配置哪个表,指定配置表名称。 |
||
--append/-A 链名称 |
附加或追加上相应规则策略,到指定链(链名称必须大写),默认将配置的规则插入到最后一条。 |
||
--check/-C |
Check for the existence of a rule |
||
--insert/-I 链名称 |
插入相应规则策略,到指定链上,默认将配置的规则插入到第一条(可以根据规则序号插入到指定位置)--封IP地址使用。 |
||
--delete/-D 链名称 |
删除指定的规则(可以根据规则序号进行删除) |
||
--replace/-R |
Replace rule rulenum (1 = first) in chain |
||
-P(大写)链名称 |
改变链上的最终默认规则策略 |
||
--new/-N |
创建新的用户定义链 |
||
-p 协议名称 [!] --proto |
指定规则的协议名称 all tcp udp icmp |
||
--dport |
指定匹配的目标端口信息 |
||
--sport |
指定匹配的源端口信息 |
||
-j 动作 |
匹配数据包后的动作 |
||
ACCEPT |
允许 |
||
DROP |
丢弃(没有响应) |
||
REJECT |
拒绝(回应请求者明确的拒绝) |
||
MASQUERADE |
伪装上网时使用 |
||
SNAT |
共享地址上网 |
||
DNAT |
目的地址改写 |
||
-i [!] --in-interface |
在INPUT链配置规则中,指定从哪一个网卡接口进入的流量(只能配置在INPUT链上) |
||
-o [!] --out-interface |
在OUTPUT链配置规则中,指定从哪一个网接口出去的流量(只能配置在OUTPUT链上) |
||
-s [!] --source |
指定源IP地址或源网段信息 |
||
-d [!] --destination |
指定目标IP地址或目标网段信息 |
||
扩展参数 |
|||
-m 模块 |
表示增加扩展,匹配功能扩展匹配(可以加载扩展参数) |
||
multiport |
实现不连续多端口扩展匹配 |
||
icmp |
使用icmp的扩展 |
||
state |
状态模块扩展 |
||
--icmp-type |
只有类型8是真正会影响ping,或者也可以采用any;了解很多icmp类型iptables -p icmp -h |
||
--limit n/{second/minute/hour} |
指定时间内的请求速率”n”为速率,后面为时间分别为:秒 分 时 |
||
--limit-burst [n] |
在同一时间内允许通过的请求”n”为数字,不指定默认为5 |
||
--exact/-x |
扩展数字(显示精确数值) |
2.2 配置前准备
系统环境说明: [root@m01 ~]# cat /etc/redhat-release CentOS release 6.9 (Final) [root@m01 ~]# hostname -I 10.0.0.61 172.16.1.61 软件版本: [root@m01 ~]# iptables -V iptables v1.4.7 |
2.2.1 备份配置文件
[root@m01 ~]# cp /etc/sysconfig/iptables{,.bak} [root@m01 ~]# ll /etc/sysconfig/iptables* -rw-------. 1 root root 476 Jan 18 21:29 /etc/sysconfig/iptables -rw------- 1 root root 476 Mar 5 22:22 /etc/sysconfig/iptables.bak -rw-------. 1 root root 1974 Jul 24 2015 /etc/sysconfig/iptables-config -rw-------. 1 root root 476 Jan 18 21:29 /etc/sysconfig/iptables.old |
2.2.2 启动防火墙
[root@m01 ~]# /etc/init.d/iptables start iptables: Applying firewall rules: [ OK ] |
2.2.3 清除iptables所有规则
[root@m01 ~]# iptables -F <- 清空iptables所有规则信息(清除filter) [root@m01 ~]# iptables -X <- 清空iptables自定义链配置(清除filter) [root@m01 ~]# iptables -Z <- 清空iptables计数器信息(清除filter) [root@m01 ~]# iptables -nL Chain INPUT (policy ACCEPT) target prot opt source destination
Chain FORWARD (policy ACCEPT) target prot opt source destination
Chain OUTPUT (policy ACCEPT) target prot opt source destination |
2.2.4 查看iptables的规则
方法一:利用iptables启动脚本参数查看 [root@m01 ~]# /etc/init.d/iptables status Table: raw Chain PREROUTING (policy ACCEPT) num target prot opt source destination
Chain OUTPUT (policy ACCEPT) num target prot opt source destination
Table: filter Chain INPUT (policy ACCEPT) num target prot opt source destination
Chain FORWARD (policy ACCEPT) num target prot opt source destination
Chain OUTPUT (policy ACCEPT) num target prot opt source destination 方法二:利用iptables服务命令查看规则信息 [root@m01 ~]# iptables -nvL <- 显示匹配数据计算器信息 Chain INPUT (policy ACCEPT 6 packets, 432 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 target prot opt source destination |
2.2.5 查看其他的表配置(-t 参数)
[root@m01 ~]# iptables -nvL -t raw <- -t --- 指定要配置或管理的表信息 Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination |
2.2.6 查看配置规则的顺序号
[root@m01 ~]# iptables -nvL --line-number <- 显示规则序号信息 Chain INPUT (policy ACCEPT 54 packets, 4067 bytes) num pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) num pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 40 packets, 4154 bytes) num pkts bytes target prot opt in out source destination |
2.3 iptables filter表配置实例
2.3.1 基础配置
iptables实践案例一:阻止访问22端口
iptables -t filter -A INPUT -i eth0 -j DROP iptables -t filter -D INPUT -i eth0 -j DROP iptables -t filter -A INPUT -i eth0 -p tcp --dport 22 -j DROP iptables -t filter -D INPUT 1 <-- 利用规则序号进行删除规则
iptables -t filter -A OUTPUT -o eth0 -j DROP iptables -t filter -D OUTPUT 1 |
参数说明:
-t --- 指定要配置或管理的表信息
-A --- 指定在哪个链上添加规则信息(追加规则信息,会把规则添加到最后一行)
-I --- 指定在哪个链上插入规则信息(插入规则信息,默认插入到第一条)
主要用于封IP地址,利用shell脚本实现封IP
-R --- 指定在哪个链进行规则信息替换(利用-R参数时,需要指定要替换的规则序号信息)
-D --- 指定在哪个链上删除规则信息
-i --- 指定数据流入的接口信息
-o --- 指定数据流出的接口信息
-j --- 数据匹配后,要指定的动作信息(ACCEPT DROP REJECT)
DROP == 不做任何理睬 (推荐)
REJECT == 进行拒绝
-p --- (小p)指定数据包协议信息(tcp udp icmp)
--dport --- 指定目标端口号信息
--sport --- 指定源端口号信息
说明:INPUT链上不能配置 -o参数;OUTPUT链上不能配置 -i参数
iptables -A INPUT -p tcp --dprot 22 -j DROP # 禁止所有人访问22端口 iptables -I INPUT -p tcp --dprot 22 -j ACCEPT # 恢复连接方法 iptables -I INPUT 2 -p tcp --dprot 22 -j ACCEPT # 通过插入指定行号信息,指定将规则插入到第几行 iptables -D INPUT -p tcp --dport 22 -j ACCEPT # 删除指定规则 iptables -D INPUT 2 # 根据规则行号,删除相应的规则 |
iptables实践案例二:禁止10.0.0.1这台主机访问22端口
配置错误规则:(顺序错误) iptables -t filter -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT iptables -t filter -A INPUT -i eth0 -p tcp --dport 22 -s 10.0.0.1 -j DROP [root@m01 ~]# iptables -t filter -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT [root@m01 ~]# iptables -t filter -A INPUT -i eth0 -p tcp --dport 22 -s 10.0.0.1 -j DROP [root@m01 ~]# iptables -nL Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 DROP tcp -- 10.0.0.1 0.0.0.0/0 tcp dpt:22
Chain FORWARD (policy ACCEPT) target prot opt source destination
Chain OUTPUT (policy ACCEPT) target prot opt source destination 调整配置信息: iptables -t filter -D INPUT 2 iptables -t filter -I INPUT -i eth0 -p tcp --dport 22 -s 10.0.0.1 -j DROP iptables -t filter -I INPUT 2 -i eth0 -p tcp --dport 22 -s 10.0.0.1 -j DROP <- 将此规则插入到第2行 iptables -R INPUT 1 -i eth0 -p tcp --dport 22 -s 10.0.0.1 -j DROP <-替换第一条规则信息 |
参数说明:
-s --- 表示匹配的源地址主机或网段信息
-d --- 表示匹配的目标地址主机或网段信息
只允许10.0.0.1的ip通过ssh连接这台服务器 iptables -I INPUT -s 10.0.0.1 -p tcp --dport 22 -j ACCEPT |
iptables实战案例三:只允许指定网段主机访问22端口(允许10.0.0.1主机访问)
方法一: iptables -A INPUT -i eth0 -p tcp --dport 22 -s 10.0.0.1 -j ACCEPT iptables -A INPUT -i eth0 -p tcp --dport 22 -s 10.0.0.0/24 -j DROP 方法二: iptables -A INPUT -i eth0 -p tcp --dport 22 ! -s 10.0.0.1 -j DROP --- !表示取反策略 centos6配置方法 iptables -A INPUT -i eth0 -p tcp --dport 22 -s ! 10.0.0.1 -j DROP --- !表示取反策略 centos5配置方法 |
2.3.2 实践案例
iptables实践案例四:禁止23到80端口,都不允许10.0.0.1主机进行访问
[root@lb01 ~]# iptables -A INPUT -i eth0 -s 10.0.0.1 -p tcp --dport 23:80 -j DROP [root@lb01 ~]# iptables -nvL Chain INPUT (policy ACCEPT 70 packets, 3936 bytes) pkts bytes target prot opt in out source destination 3 152 DROP tcp -- eth0 * 10.0.0.1 0.0.0.0/0 tcp dpts:23:80
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 142 packets, 8644 bytes) pkts bytes target prot opt in out source destination |
iptables实践案例五:禁止23,24,30,80端口,都不允许10.0.0.1主机进行访问
[root@lb01 ~]# iptables -A INPUT -i eth0 -s 10.0.0.1 -p tcp -m multiport --dport 23,24,30,80 -j DROP 参数说明: -m extended match (may load extension) 指定加载扩展功能参数 multiport --- 多端口配置扩展参数 [root@lb01 ~]# iptables -nvL Chain INPUT (policy ACCEPT 21 packets, 1224 bytes) pkts bytes target prot opt in out source destination 0 0 DROP tcp -- eth0 * 10.0.0.1 0.0.0.0/0 multiport dports 23,24,30,80
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 29 packets, 2064 bytes) pkts bytes target prot opt in out source destination |
iptables实践案例六:匹配ICMP类型
禁止ping策略原则 icmp --- 进行icmp协议访问控制 icmp type8:Echo request——回显请求(Ping请求) 出去的信息 icmp type0: Echo Reply——回显应答(Ping应答) 回来的信息 iptables服务器是ping命令发起者或是接受者 发起者:以下两种方式(可以任选其一) input链: 禁止icmp-type 0 iptables -A INPUT -i eth0 -p icmp --icmp-type 0 -j DROP output链: 禁止icmp-type 8 iptables -A OUTPUT -o eth0 -p icmp --icmp-type 8 -j DROP 接受者:以下两种方式(可以任选其一) input链: 禁止icmp-type 8 iptables -A INPUT -i eth0 -p icmp --icmp-type 8 -j DROP output链: 禁止icmp-type 0 iptables -A OUTPUT -o eth0 -p icmp --icmp-type 0 -j DROP 简化配置: iptables -A INPUT -i eth0 -p icmp --icmp-type any -j DROP iptables -A INPUT -i eth0 -p icmp -m icmp --icmp-type any -j DROP <- 禁止所有类型的icmp 指定类型禁止ICMP iptables -A INPUT -p icmp --icmp-type 8 iptables -A INPUT -p icmp --icmp-type 8 -j DROP iptables -A INPUT -p icmp -m icmp --icmp-type any -j ACCEPT iptables -A FORWARD -s 192.168.1.0/24 -p icmp -m icmp --icmp-type any -j ACCEPT 说明:只有类型8是真正会影响ping,或者也可以采用any;了解很多icmp类型iptables -p icmp -h http://www.cnitblog.com/yang55xiaoguang/articles/59581.html |
ICMP类型的说明
TYPE |
CODE |
Description |
Query |
Error |
0 |
0 |
Echo Reply——回显应答(Ping应答) |
x |
|
3 |
0 |
Network Unreachable——网络不可达 |
x |
|
3 |
1 |
Host Unreachable——主机不可达 |
x |
|
3 |
2 |
Protocol Unreachable——协议不可达 |
x |
|
3 |
3 |
Port Unreachable——端口不可达 |
x |
|
3 |
4 |
Fragmentation needed but no frag. bit set——需要进行分片但设置不分片比特 |
x |
|
3 |
5 |
Source routing failed——源站选路失败 |
x |
|
3 |
6 |
Destination network unknown——目的网络未知 |
x |
|
3 |
7 |
Destination host unknown——目的主机未知 |
x |
|
3 |
8 |
Source host isolated (obsolete)——源主机被隔离(作废不用) |
x |
|
3 |
9 |
Destination network administratively prohibited——目的网络被强制禁止 |
x |
|
3 |
10 |
Destination host administratively prohibited——目的主机被强制禁止 |
x |
|
3 |
11 |
Network unreachable for TOS——由于服务类型TOS,网络不可达 |
x |
|
3 |
12 |
Host unreachable for TOS——由于服务类型TOS,主机不可达 |
x |
|
3 |
13 |
Communication administratively prohibited by filtering——由于过滤,通信被强制禁止 |
x |
|
3 |
14 |
Host precedence violation——主机越权 |
x |
|
3 |
15 |
Precedence cutoff in effect——优先中止生效 |
x |
|
4 |
0 |
Source quench——源端被关闭(基本流控制) |
||
5 |
0 |
Redirect for network——对网络重定向 |
||
5 |
1 |
Redirect for host——对主机重定向 |
||
5 |
2 |
Redirect for TOS and network——对服务类型和网络重定向 |
||
5 |
3 |
Redirect for TOS and host——对服务类型和主机重定向 |
||
8 |
0 |
Echo request——回显请求(Ping请求) |
x |
|
9 |
0 |
Router advertisement——路由器通告 |
||
10 |
0 |
Route solicitation——路由器请求 |
||
11 |
0 |
TTL equals 0 during transit——传输期间生存时间为0 |
x |
|
11 |
1 |
TTL equals 0 during reassembly——在数据报组装期间生存时间为0 |
x |
|
12 |
0 |
IP header bad (catchall error)——坏的IP首部(包括各种差错) |
x |
|
12 |
1 |
Required options missing——缺少必需的选项 |
x |
|
13 |
0 |
Timestamp request (obsolete)——时间戳请求(作废不用) |
x |
|
14 |
Timestamp reply (obsolete)——时间戳应答(作废不用) |
x |
||
15 |
0 |
Information request (obsolete)——信息请求(作废不用) |
x |
|
16 |
0 |
Information reply (obsolete)——信息应答(作废不用) |
x |
|
17 |
0 |
Address mask request——地址掩码请求 |
x |
|
18 |
0 |
Address mask reply——地址掩码应答 |
2.3.3 防火墙状态机制配置
防火墙状态机制
状态机制是iptables中较为特殊的一部分,这也是iptables和比较老的ipchains的一个比较大的区別之一,运行状态机制(连接跟踪)的防火墙称作带有状态机制的防火墙,以下简称为状态防火墙.状态防火墙比非状态防火墙要安全,因为它允许我们编写更严密的规则。
在iptables上一共有四种状态,分别被称为NEW、ESTABLISHED、INVALID、RELATED,这四种状态对于TCP、UDP、ICMP三种协议均有效。下面,我们来分别阐述四种状态的特性.
NEW
meaning that the packet has started a new connection, or otherwise associated with a connection which has not seen packets in both directions
NEW说明这个包是我们看到的笛一个包。意思就是,这是conntrack横块看到的某个连接的第一个包,它即格被匹配了。比如,我们看到一个SYN包,是我们所留意的连接的第一 个包,就要匹配它。
ESTABLISHED
meaning that the packet is associated with a connection which has seen packets in both directions
ESTABLISHED已经注意到两个方向上的数据传输,而且会继续匹配这个连接的包.处于ESTABLISHED状态的连接是非常容易理解的.只要发送并接到应答,连接就是ESTABLISHED的了。一个连接要从NEW变为ESTABLISHED,只需要接到应答包即可,不管这个包是发往防火墙的,还是要由防火墙转发的.ICMP的错误和重定向等信息包也被看作是ESTABLISHED,只要它们是我们所发出的信息的应答。
RELATED
meaning that the packet is starting a new connection, but is associated with an existing connection, such as an FTP data transfer, or an ICMP error.
RELATED是个比较麻烦的状态.当一个连接和某个已处于ESTABLISHED状态的连接有关系时,就被认为是RELATED的了,换句话说,一个连接要想是RELATED的,首先要有一个ESTABLISHED的连接。这个ESTABLISHED连接再产生一个主连接之外的连接,这个新的连接就是RELATED的了,当然前提是conntrack模块要能理解RELATED。ftp是个很好的例子,FTP-data连接就是和FTP-control有关联的,如果没有在iptables的策略中配RELATED状态,FTP-data的连接是无法正确建立的,还有其他的例子,比如,通过IRC的DCC连接#有了这个状态,ICMP应答、FTP传输、DCC等才能穿过防火墙正常工作.注意,大部分还有一些UDP协议都依赖这个机制。这些协议是很复杂的,它们把连接信息放在数据包里,并且要求这些信息能被正确理解。
INVALID
meaning that the packet is associated with no known connection
INVALID说明数据包不能被识别属于哪个连接或没有任何状态.有几个原因可以产生这种情况,比如,内存溢出,收到不知厲于哪个连接的ICMP错误信息。一般地,我们DROP这个状态的任何东西,因为防火墙认为这是不安全的东西
注意:允许关联的状态包通过(web服务不要使用FTP服务)
状态集简单说明
状态集 |
说明 |
NEW |
表示新建立连接的数据包状态 |
ESTABLISHED |
表示新建立连接数据包发送之后,回复响应的数据包状态 |
RELATED |
表示借助已经建立的链路,发送新的连接数据包 |
INVALID |
无效无法识别的数据包 |
防火墙服务配置在FTP服务器上时,需要配置以下策略 iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT 实现发现sent_syn状态 iptables -A INPUT -m state --state NEW -j DROP <- 防火墙所连接客户端上配置 实现发现sent_rcvd状态 iptables -I INPUT -i eth0 -s 10.0.0.201 -m state --state ESTABLISHED -j DROP <-防火墙上配置的 参数说明: state --- 指定匹配状态扩展模块 |
2.4 企业当中应用防火墙方法
项目:部署一个最安全的企业级防火墙(案例)
两种思想:针对默认规则而言。
1、默认规则默认是允许的状态,则配置的规则为黑名单
2、默认规则默认是不允许的状态,则配置的规则为白名单(更安全,推荐配置)
2.4.1 保存防火墙配置文件信息
cp /etc/sysconfig/iptables{,.bak} |
2.4.2 清除配置规则
iptables -F <- 清空iptables所有规则信息(清除filter) iptables -X <- 清空iptables自定义链配置(清除filter) iptables -Z <- 清空iptables计数器信息(清除filter) |
2.4.3 别把自己踢出到门外
任选其一 iptables -A INPUT -s 10.0.0.0/24 -j ACCEPT --- 防止被踢出门外 iptables -A INPUT -p tcp --dport 22 -j ACCEPT |
2.4.4 配置防火墙filter上各个链的默认规则
iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT ACCEPT -P --- 指定相应链的默认规则策略,是允许还是阻止 |
2.4.5 允许iptables服务端ping自己的网卡地址
iptables -A INPUT -i lo -j ACCEPT --- 让自己可以ping自己 |
2.4.6 指定外网可以访问的端口信息
iptables -A INPUT -p tcp -m multiport --dport 80,443 -j ACCEPT |
2.4.7 企业中内网之间不要配置防火墙策略
iptables -A INPUT -s 172.16.1.0/24 -j ACCEPT --- 允许架构内部服务进行访问 |
2.4.8 企业之间有合作关系的,不要将友商的网络禁止(主要经常改动)
iptables -A INPUT -s 10.0.0.0/24 -j ACCEPT --- 允许一些合作企业的外网服务器进行访问 |
2.4.9 如果防火墙上配置了FTP服务,需要配置网络状态机制
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT --- 允许web服务与ftp服务器建立连接 |
2.4.10 实现iptables策略配置永久保存
方法一:利用防火墙启动脚本命令参数,实现永久保存 /etc/init.d/iptables save 方法二:利用防火墙配置信息保存命令,实现永久保存 iptables-save >/etc/sysconfig/iptables |
2.5 实例拓展:恢复刚才断掉的SSH连接
01. 去机房重启系统或者登陆服务器删除刚才的禁止规则。
02. 让机房人员重启服务器或者让机房人员拿用户密码登录进去
03. 通过服务器的远程管理卡管理(推荐)
04. 先写一个定时任务,每5分钟就停止防火墙
05. 测试环境测试好,写成脚本,批量执行
2.6 iptables NAT表配置
iptables NAT:(配置NAT表就是配置以下两个链)
01. postrouting(内网---外网)
路由之后,进行地址映射转换,把源地址进行转换(源私网地址==>源公网地址)
02. prerouting(外网---内网)
路由之前,进行地址映射转换,把目标地址进行转换(目标公网地址==>目标变为私网地址)
2.6.1 iptables实现共享上网方法(postrouting)
第一个历程:配置内网服务器,设置网关地址
/etc/init.d/iptables stop --- 内网服务器停止防火墙服务 ifdown eth0 --- 模拟关闭内网服务器外网网卡 setup --- 修改内网网卡网关和DNS地址信息 [root@web01 ~]#route add default gw 172.16.1.5 [root@web01 ~]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 172.16.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1 169.254.0.0 0.0.0.0 255.255.0.0 U 1003 0 0 eth1 0.0.0.0 172.16.1.5 0.0.0.0 UG 0 0 0 eth1 说明:内网服务器网关地址指定为共享上网服务器内网网卡地址 |
第二个历程:配置共享上网服务器,开启共享上网服务器路由转发功能
[root@lb01 ~]# vim /etc/sysctl.conf [root@lb01 ~]# sysctl -p net.ipv4.ip_forward = 1 |
第三个历程:配置共享上网服务器,实现内网访问外网的NAT映射
iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -o eth0 -j SNAT --to-source 10.0.0.5 -s 172.16.1.0/24 --- 指定将哪些内网网段进行映射转换 -o eth0 --- 指定在共享上网哪个网卡接口上做NAT地址转换 -j SNAT --- 将源地址进行转换变更 -j DNAT --- 将目标地址进行转换变更 --to-source ip地址 --- 将源地址映射为什么IP地址 --to-destination ip地址 --- 将目标地址映射为什么IP地址 说明:在企业中如何没有固定外网IP地址,可以采取以下伪装映射的方式进行共享上网 iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -o eth0 -j MASQUERADE <- 伪装共享上网 |
扩展如果开启:forward默认drop策略,如果配置forward链 二选一 iptables -A FORWARD -i eth1 -s 172.16.1.0/24 -j ACCEPT iptables -A FORWARD -o eth0 -s 172.16.1.0/24 -j ACCEPT 二选一 iptables -A FORWARD -i eth0 -d 172.16.1.0/24 -j ACCEPT iptables -A FORWARD -o eth1 -d 172.16.1.0/24 -j ACCEPT |
总结:配置映射方法
01. 指定哪些网段需要进行映射 -s 172.16.1.0/24
02. 指定在哪做映射 -o eth0
03. 用什么方法做映射 -j SNAT/DNAT
04. 映射成什么地址 --to-source ip地址/--to-destination ip地址
2.6.2 iptables实现外网IP的端口映射到内网IP的端口
需求:将网关的IP和9000端口映射到内网服务器的22端口
端口映射 10.0.0.5:9000 -->172.16.1.7:22
实现命令: iptables -t nat -A PREROUTING -d 10.0.0.5 -i eth0 -p tcp --dport 9000 -j DNAT --to-destination 172.16.1.7:22 参数说明: -d 10.0.0.5 目标地址 -j DNAT 目的地址改写 |
2.6.3 IP一对一映射
需求:将IP地址172.16.1.51 映射到 10.0.0.81 通过辅助IP配置: ip addr add 10.0.0.81/24 dev eth0 label eth0:0 #<==辅助IP iptables -t nat -I PREROUTING -d 10.0.0.81 -j DNAT --to-destination 172.16.1.51 iptables -t nat -I POSTROUTING -s 172.16.1.51 -o eth0 -j SNAT --to-source 10.0.0.81 适合内网的机器访问NAT外网的IP iptables -t nat -I POSTROUTING -s 172.16.1.0/255.255.240.0 -d 10.0.0.81 -j SNAT --to-source 172.16.1.8 检查: ping 10.0.0.81 -t tcpdump|grep -i icmp(两台机器上分别监测) telnet 10.0.0.81 873(51上提前配好) |
2.6.4 映射多个外网IP上网
方法1: iptables -t nat -A POSTROUTING -s 10.0.1.0/255.255.240.0 -o eth0 -j SNAT --to-source 124.42.60.11-124.42.60.16 三层交换机或路由器,划分VLAN。 方法2: iptables -t nat -A POSTROUTING -s 10.0.1.0/22 -o eth0 -j SNAT --to-source 124.42.60.11 iptables -t nat -A POSTROUTING -s 10.0.2.0/22 -o eth0 -j SNAT --to-source 124.42.60.12 扩大子网,增加广播风暴。 |
2.7 系统防火墙与网络内核优化标准参数
有关iptables的内核优化
调整内核参数文件/etc/sysctl.conf
以下是我的生产环境的某个服务器的配置:
------------解决time-wait过多------------- net.ipv4.tcp_fin_timeout = 2 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_keepalive_time = 600 net.ipv4.tcp_max_tw_buckets = 36000 ---------------------------------- net.ipv4.ip_local_port_range = 4000 65000 net.ipv4.tcp_max_syn_backlog = 16384 net.ipv4.route.gc_timeout = 100 net.ipv4.tcp_syn_retries = 1 net.ipv4.tcp_synack_retries = 1 ---------------------------------- #dmesg里面显示 ip_conntrack: table full, dropping packet.的错误提示,什么原因?如何解决? |
iptables优化 net.nf_conntrack_max = 25000000 net.netfilter.nf_conntrack_max = 25000000 net.netfilter.nf_conntrack_tcp_timeout_established = 180 net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120 net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60 net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120 |
2.8 自定义链配置
2.8.1 自定义链原理
2.8.2 创建自定义链
自定义链==shell 变量
示例:在filter表中创建syn-flood自定义链 iptables -N syn-flood |
2.8.3 调用自定义链
示例:在INPUT链中引用刚才创建的自定义链 iptables -A INPUT -i eth0 -syn -j syn-flood |
2.8.4 对自定义链配置进行赋值
示例:在INPUT链中引用刚才创建的自定义链 iptables -A syn-flood -m limit -limit 5000/s -limit-burst 200 -j RETURN iptables -A syn-flood -j DROP |
2.9 使用iptables实现限速功能
2.9.1 limit模块
limit是iptables的一个匹配模块,用它结合iptables的其它命令可以实现限速的功能。
不过首先必须明确,limit本身只是一个“匹配”模块。我们知道,iptables的基本原理是“匹配--处理”,limit在这个工作过程中只能起到匹配的作用,它本身是无法对网络数据包进行任何处理的。
实际上,利用imit来限速需要包括两个步骤:
Ø 对符合limit匹配规则包放行
Ø 丢弃/拒绝未放行的包
iptables -A INPUT -i eth0 -syn -m limit -limit 5000/s -limit-burst 200 -j RETURN iptables -A INPUT -i eth0 -syn -j DROP 示例: iptables -I INPUT -s 10.0.0.7 -p icmp --icmp-type 8 -m limit --limit 6/min --limit-burst 5 -j ACCEPT iptables -I INPUT -s 10.0.0.7 -p icmp --icmp-type 8 -j DROP 语句含义:当来自10.0.0.7 的ping包超过5个时进行限速,限制为每10s一个。 参数说明: --limit n/{second/minute/hour} <--- 指定时间内的请求速率”n”为速率,后面为时间分别为:秒 分 时 --limit-burst [n] <--- 在同一时间内允许通过的请求”n”为数字,不指定默认为5 |
2.9.2 limit模块具体工作过程
limit的匹配是基于令牌桶 (Token bucket)模型的。
令牌桶是一种网络通讯中常见的缓冲区工作原理,它有两个重要的参数,令牌桶容量n和令牌产生速率s。
我们可以把令牌当成是门票,而令牌桶则是负责制作和发放门票的管理员,它手里最多有n张令牌。一开始,管理员开始手里有n张令牌。每当一个数据包到达后,管理员就看看手里是否还有可用的令牌。如果有,就把令牌发给这个数据包,limit就告诉iptables,这个数据包被匹配了。而当管理员把手上所有的令牌都发完了,再来的数据包就拿不到令牌了。这时,limit模块就告诉iptables,这个数据包不能被匹配。除了发放令牌之外,只要令牌桶中的令牌数量少于n,它就会以速率s来产生新的令牌,直到令牌数量到达n为止。
通过令牌桶机制,即可以有效的控制单位时间内通过(匹配)的数据包数量,又可以容许短时间内突发的大量数据包的通过(只要数据包数量不超过令牌桶n)。
limit模块提供了两个参数--limit和--limit-burst,分别对应于令牌产生速率和令牌桶容量。除了令牌桶模型外,limit匹配的另外一个重要概念是匹配项。在limit中,每个匹配项拥有一个单独的令牌桶,执行独立的匹配计算。