IP格式
版本号 首部长度 优先级与服务类型 总长度
(4) (4) (8) (16)段标识符 标志(R,DF,MF) 段偏移量 (16) (3) (13) TTL 协议号 首部效验和 (8) (8) (16) 源地址(32) 目标地址(32) 可选项 数据第一行: 版本:制定ip协议的版本号 首部长度:首部总共5行,每行32位(4字节),5行最短20字节 优先级与服务类型:数据在传输中是普通还是加急 总长度:首部长度和数据长度的和第二行: 段标识符:当数据报文太大的时候,数据分割成几片,当这个段标识符一样的时候合并成一个报文 标志: R: DF:不能分片 MF:更多的分片 段偏移量:指定偏移量,是拼接的报文不会乱序第三行: TTL:数据包在网络中的寿命,每经过一个路由时候减去1,减到0时丢弃数据包,防止数据包在网络中无线循环 协议号:指出数据包为上层提供的那种协议(17是UDP,6是TCP) 首部效验和:为数据包首部进行检验 TCP首部源端口号 目标端口 (0~15) (16~31) 序列号(32) 确认号(32)首部长度 保留(URG,ACK,PSH,RST,SYN,FIN) 窗口大小
(4) (6) 各占一位 (16)效验和(16) 紧急指针(16)
可选项
数据第一行: 源端口 目标端口序列号:生成一个随机序列号seq伴随数据包传输目的地,在然后每次传输数据每次加1确认号:确认数据已收到,产生确认号ack=初始序列号seq + 1 ,回送给对方窗口大小:源和目标协商一次发送多少内容,尤其针对接收方,接收方还有多少空闲资源可以接收,如果多的话有可能会接收不到导致报文会背丢弃,如果接收方收不到报文,发送方就会触发重传机制,在重传一次报文.这个时候就会有等待时间,多久之后会重传.
第四行: 首部长度 保留: URG:紧急指针(1),1表示有效,0表示无效 ACK:确认连接,用来说明确认号是否有效 PSH:尽快发送数据 RST:重新建立连接 SYN:请求建立连接 FIN:请求断开连接 窗口大小:一次发送多少报文第五行: 效验和:对TCP数据进行差错效验 紧急指针:和URG配合使用 三次握手过程A 第一次发送 B -----SYN=1,ACK=0-------> <-----SYN=1,ACK=1------- --------ACK=1----------->
防火墙:硬件,软件
framework:
默认规则:
开放:堵住不允许进来的
关闭:通,只允许有令牌的进来
规则:匹配标准
ip:sip,dip
TCP:sprot,dprot
ICMP:icmp-type
钩子函数: prerouting input output forward postrouting规则链:
PRETOUTING INPUT OUTPUT FORWARD POSTROUTINGfilter(过滤): INPUT OUTPUT FORWARDnat(地址转换): PREROUTING OUTPUT POSTROUTINGmangle(拆开,修改,封装): PRETOUTING INPUT OUTPUT FORWARD POSTROUTINGraw(): PREROUTING OUTPUT
原创作品,允许转载,转载时请务必以超链接形式标明文章 、作者信息和本声明。否则将追究法律责任。
iptables从入门到应用
一、简介
1.1、是什么?
iptables是隔离主机以及网络的工具,通过自己设定的规则以及处理动作对数据报文进行检测以及处理。
1.2、发展史
防火墙的发展史就是从墙到链再到表的过程,也即是从简单到复杂的过程。为什么规则越来越多,因为互联网越来越不安全了,所有防火墙的的规则也越来越复杂。防火的工具变化如下:
ipfirewall(墙)-->ipchains(链条)--iptables(表)
2.0版内核中,包过滤机制是ipfw,管理工具是ipfwadm;
2.2 版内核中,包过滤机制ipchain,管理工具是ipchains;
2.4版及以后的内核中,包过滤机制是netfilter,管理工具iptables。
二、原理
2.1、组成
linux的防火墙由netfilter和iptables组成。用户空间的iptables制定防火墙规则,内核空间的netfilter实现防火墙功能。
netfilter(内核空间)位于Linux内核中的包过滤防火墙功能体系,称为Linux防火墙的“内核态”。
iptables(用户空间)位于/sbin/iptables,是用来管理防火墙的命令的工具,为防火墙体系提供过滤规则/策略,决定如何过滤或处理到达防火墙主机的数据包,称为Linux防火墙的“用户态”。
2.2、实现方式
Linux系统的防火墙功能是由内核实现的,包过滤防火墙工作在TCP/IP的网络层。
用户空间的iptables制定相应的规则策略控制内核空间的netfilter处理相应的数据访问控制。
iptables有四表五链(其实有五表,是后来加进来的),四表分别是下图的的raw,mangle,nat,filter表。五链分别是PREROUTING,INPUT,OUTPUT,FORWARD,POSTROUTING链。表有什么用?链又有什么用呢?其实表决定了数据报文处理的方式,而链则决定了数据报文的流经哪些位置。
你可以从图中看出规则表的优先级:raw-->mangle-->nat-->filter。
四表的介绍如图(ps:由于现在有五表了,所以我把另一个表也加了进来)。
五链的介绍如图。
制作防火墙规则通常有两种基本策略。一是黑名单策略;二是白名单策略。
黑名单策略指没有被拒绝的流量都可以通过,这种策略下管理员必须针对每一种新出现的攻击,制定新的规则,因此不推荐。
白名单策略指没有被允许的流量都要拒绝,这种策略比较保守,根据需要,逐渐开放,目前一般都采用白名单策略,推荐。
2.3、数据包过滤匹配流程
如图,我们可以分析数据报文进入本机后应用了哪些表规则以及链规则,根据表规则和链规则我们分析数据包的过滤匹配流程。
比如我们制定一个filter表的规则,filter表决定是否放行数据包通过,那如果通过,则必须经由INPUT链流入数据包,INPUT链是处理入站数据的,如果没问题,继续放行到用户空间,再经由OUTPUT链将数据包流出。
那如果是nat表的规则,nat表主要实现转发功能,数据包先经由PREROUTING链进行路由选择,选择好路线后再经由FORWARD链转发数据,然后再进行一个路由选择,最后由POSTROUTING链流出数据。
其他表规则的数据包流程不做介绍,图中介绍的十分详尽。
三、iptables命令
3.1、制定iptables表规则思路
(1)选择一张表(此表决定了数据报文处理的方式)
(2)选择一条链(此链决定了数据报文的流经哪些位置)
(3)选择合适的条件(此条件决定了对数据报文做何种条件匹配)
(4)选择处理数据报文的动作,制定相应的防火墙规则。
3.2、基本语法结构
结构:
iptables [ -t 表名 ] 管理选项 [ 链名 ] [num(链的第几条规则)] [ 条件匹配 ] [ -j 目标动作或跳转 ]
几个注意事项:
不指定表名时,默认表示filter表,不指定链名时,默认表示该表内所有链,除非设置规则链的缺省策略,否则需要指定匹配条件。
3.3、详细语法
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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] |
3.4、语法结构解析
语法结构解析如下。
注意:本导图是按照iptables语法结构的使用的先后顺序制作的,如果按照此种方式能够很快地帮助我们记忆以及掌握iptables规则的制定。
3.4.1、表
其实表的介绍,在上面已经介绍了。这里我们可以再来回顾以下五张表的功能。
3.4.2、管理选项
管理选项分为三大类,分别为:规则的显示,规则链管理以及规则管理。我们可以通过man帮助查看iptables的用法,大多选项用法都见名知意。
链管理
1 2 3 4 5 6 7 8 9 | -N, --new-chain chain:新建一个自定义的规则链; -X, --delete-chain [chain]:删除用户自定义的引用计数为0的空链; -F, --flush [chain]:清空指定的规则链上的规则; -E, --rename-chain old-chain new-chain:重命名链; -Z, --zero [chain [rulenum]]:置零计数器; 注意:每个规则都有两个计数器 packets:被本规则所匹配到的所有报文的个数; bytes:被本规则所匹配到的所有报文的大小之和; -P, --policy chain target 制定链表的策略(ACCEPT|DROP|REJECT) |
规则管理
1 2 3 4 5 | -A, --append chain rule-specification:追加新规则于指定链的尾部; -I, --insert chain [rulenum] rule-specification:插入新规则于指定链的指定位置,默认为首部; -R, --replace chain rulenum rule-specification:替换指定的规则为新的规则; -D, --delete chain rulenum:根据规则编号删除规则; -D, --delete chain rule-specification:根据规则本身删除规则; |
规则显示
1 2 3 4 5 6 7 | -L, --list [chain]:列出规则; - v , --verbose:详细信息; -vv 更详细的信息 -n, --numeric:数字格式显示主机地址和端口号; -x, --exact:显示计数器的精确值,而非圆整后的数据; --line-numbers:列出规则时,显示其在链上的相应的编号; -S, --list-rules [chain]:显示指定链的所有规则; |
3.4.3、链
五链的功能如图所示。
3.4.4、条件匹配
条件匹配分为基本匹配和扩展匹配,扩展匹配又分为显示匹配和隐式匹配。
基本匹配的特点是:无需加载扩展模块,匹配规则生效;扩展匹配的特点是:需要加载扩展模块,匹配规则方可生效。
隐式匹配的特点:使用-p选项指明协议时,无需再同时使用-m选项指明扩展模块以及不需要手动加载扩展模块;
显示匹配的特点:必须使用-m选项指明要调用的扩展模块的扩展机制以及需要手动加载扩展模块。
基本匹配的使用选项及功能
1 2 3 4 5 6 | -p 指定规则协议,tcp udp icmp all -s 指定数据包的源地址,ip hostname -d 指定目的地址 -i 指定数据报文流入的接口(一般用在PRETOUTING,INPUT,FORWARD) -o 指定数据报文流出的接口(一般用在OUTPUT,FORWARD,POSTROUTING) ! 取反 |
隐式匹配的使用选项及功能
1 2 3 4 5 6 7 8 9 10 | -p tcp --sport 匹配报文源端口;可以给出多个端口,但只能是连续的端口范围 --dport 匹配报文目标端口;可以给出多个端口,但只能是连续的端口范围 --tcp-flags mask comp 匹配报文中的tcp协议的标志位 只检查mask列表里面的标志位,comp此列表出现的mask必须为1,comp中没出现的,而mask中出现的,必须为0 --tcp-flages mask comp --tcp-flages SYN,ACK,RST,FIN SYN,ACK 意思是只检查tcp的SYN,ACK,RST,FIN,但是SYN,ACK只能为1,其他的位置必须为0专门匹配tcp三次握手里面的第一次--syn--tcp-flags mask comp 只检查mask制定的标志位,是逗号分隔的标志位列表 comp:次列表里的标志为必须为1,comp中没出现,而mask中出现的必须为0-p udp --sport 匹配报文源端口;可以给出多个端口,但只能是连续的端口范围 --dport 匹配报文目标端口;可以给出多个端口,但只能是连续的端口范围 -p icmp --icmp- type 0 /0 : echo reply 允许其他主机 ping 0表示响应报文 8 /0 : echo request 允许 ping 其他主机 8请求报文 |
显式匹配的使用选项及功能
显式匹配的选项特别多,所以使用思维导图的方式梳理一下。我们可以使用命令:man iptables-extensions查看具体用法。
1.multiport(多端口)
开放多个端口。
-
-
-
--ports
123例子:
iptables -I INPUT -d 172.16.100.7 -p tcp -m multiport --dports 22,80 -j ACCEPT
iptables -I OUTPUT -s 172.16.100.7 -p tcp -m multiport --sports 22,80 -j ACCEPT
-
-
2.iprange(ip范围)
以连续地址块的方式来指明多IP地址匹配条件。
-m iprange
--src-range 指定一段的地址
--dst-range
- 123
例子:
iptables -A INPUT -d 172.16.100.7 -p tcp --dport 23 -m iprange --src-range 172.16.100.1-172.16.100.100 -j ACCEPT
iptables -A OUTPUT -s 172.16.100.7 -p tcp --sport 23 -m iprange --dst-range 172.16.100.1-172.16.100.100 -j ACCEPT
3.time(时间范围)
指定时间范围。
- 123
例子:
iptables -A INPUT -d 172.16.100.7 -p tcp --dport 901 -m
time
--weekdays Mon,Tus,Wed,Thu,Fri --timestart 08:00:00 --
time
-stop 18:00:00 -j ACCEPT
iptables -A OUTPUT -s 172.16.100.7 -p tcp --sport 901 -j ACCEPT
4.string(字符串)
对报文中的应用层数据做字符串模式匹配检测(通过算法实现)。
- 123
--algo {bm|kmp}:字符匹配查找时使用算法
--string
"STRING"
: 要查找的字符串
--hex-string “HEX-STRING”: 要查找的字符,先编码成16进制格式
注意报文经过那个链出去:
iptables -t filter -I OUTPUT -s 192.168.132.171 -p tcp --sport 22 -m string --algo kmp --string "h7n9" -j REJECT
指定协议 指定限定的内容
5.connlimit(连接限制)
-m connlimit
! --connlimit-above n 同一个服务最多几个连接请求,记住一定加!,否则就是超过几个才匹配
根据每个客户端IP作并发连接数量限制。
1 2 | --connlimit-upto n 连接数小于等于n时匹配 --connlimit-above n 连接数大于n时匹配 |
6.limit(速率限制)
-m limit
--limit RATE 单位时间内放行的数目
--limit-burst 第一次一下子能放行几个
iptables -t filter -R INPUT 5 -d 192.168.132.171 -s 192.168.132.172 -p icmp --icmp-type 8 -m limit --limit 5/minute -j ACCEPT
报文速率控制。
7.state(状态)状态扩展
结合ip_conntrack追踪回话状态 ,配置文件在/proc/net/ip_conntrack,可以调节大小。现在没有了以前的时候有
lsmod | grep "ip" 查看内核模块ip_conntrack
追踪本机上的请求和响应之间的数据报文的状态。状态有五种:INVALID, ESTABLISHED, NEW, RELATED, UNTRACKED.
-
法则:
-
1、对于进入的状态为ESTABLISHED都应该放行;
-
2、对于出去的状态为ESTABLISHED都应该放行;
-
3、严格检查进入的状态为NEW的连接;
-
4、所有状态为INVALIED都应该拒绝;
-m state --state NEW,ESTABLISHED -j ACCEPT 后面可以跟多个状态,逗号隔开
3.4.5、处理动作
处理动作有内置的处理动作和自定义的处理动作。自定义的处理动作用的比较少,因此只介绍内置的处理动作。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | ACCEPT:允许数据包通过 DROP:直接丢弃数据包,不给出任何回应信息 REJECT:拒绝数据包通过,必要时会给数据发送端一个响应信息 LOG:在日志文件中记录日志信息,然后将数据包传递给下一条规则 QUEUE: 防火墙将数据包移交到用户空间 RETURN:防火墙停止执行当前链中的后续Rules,并返回到调用链 REDIRECT:端口重定向 MARK:做防火墙标记 DNAT:目标地址转换 SNAT:源地址转换 -MASQUERADE:地址伪装 |
-j TARGET
LOG 注意这个地方一定要显示速率,多久记录一次,要不会占用太多空间,影响服务器效率
--log--prefix "自己想写的标记"
iptables -I INPUT 4 -d 192.168.132.171 -p icmp --icmp-type 8 -j LOG --log-prefix "-----firewall log for icmp ------lliubi"
3.5、保存和载入规则
CentOS6和CentOS7保存和载入的规则稍有差异。
3.5.1、CentOS 7
1 2 3 4 | 手动保存,并且自己制定文件,重启之后还能生效 保存:iptables-save > /PATH/TO/SOME_RULE_FILE 重载:iptabls-restore < /PATH/FROM/SOME_RULE_FILE -n, --noflush:不清除原有规则 -t, -- test :仅分析生成规则集,但不提交 |
3.5.2、CentOS 6
1 2 3 | 保存规则:service iptables save #保存规则于/etc/sysconfig/iptables文件,覆盖保存; 重载规则:service iptables restart #默认重载/etc/sysconfig/iptables文件中的规则 配置文件: /etc/sysconfig/iptables-config |
四、iptables的实践应用
iptables十分重要与网络的安全息息相关,我们理所应当掌握。不过我们大可不必死记硬背,一定结合实际项目,多多练习,效果才会更好。
如果转态一样的话,出去的规则可以用缺省的方法写
[root@vh01 ~]# iptables -t filter -I OUTPUT -s 192.168.132.171 -m state --state ESTABLISHED -j ACCEPT
[root@vh01 ~]# iptables -L -n -v --line-number放行sshd服务
235 iptables -t filter -A INPUT -d 192.168.132.171 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
236 iptables -t filter -A OUTPUT -s 192.168.132.171 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT放行httpd服务
240 iptables -t filter -A INPUT -d 192.168.132.171 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
241 iptables -t filter -A OUTPUT -s 192.168.132.171 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
放行icmp
iptables -t filter -A INPUT -d 192.168.132.171 -p icmp --icmp-type 8 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -t filter -A OUTPUT -s 192.168.132.171 -p icmp --icmp-type 0 -m state --state ESTABLISHED -j ACCEPT
打开自己的还回扣:
272 iptables -A INPUT -i lo -j ACCEPT
273 iptables -A OUTPUT -o lo -j ACCEPT
相同规则的合并成一条,尽可能简化规则加快速递
iptables -t filter -I OUTPUT -s 192.168.132.171 -m state --state ESTABLISHED -j ACCEPT
iptables -t filter -I INPUT 2 -d 192.168.132.171 -p tcp -m multiport --dport 21,22,80 -m state --state NEW -j ACCEPT
利用iptables的recent模块一定限度抵制DOS工具
iptables -t filter -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j DROP
iptables -t filter -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
记录访问22的新连接,记录名为SSH,--set 记录数据包的来源IP,如果IP已经存在将更新已经存在的条目iptables -t filter -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j DROPSSH里面记录的ip地址,300秒内发起超过3此连接则拒绝此IP地址,并且在300秒之内如果再建立新连接--update 是指每次建立连接都更新列表--seconds 必须与 --rcheck 或者 --update同时使用--hitcount 必须与 --rcheck 或者 --update同时使用1.利用connlimit模块将单IP的并发设置为3,会误杀使用NAT上网的用户,可以根据实际情况增大
2.利用recent和state模块显示单IP在300秒内只能建立三个新连接,被限制五分钟后即可恢复正常4.1、iptables常用规则
1.放行sshd服务
1 2 | iptables -t filter -A INPUT -s 192.168.0.0 /24 -d 192.168.0.1 -p tcp --dport 22 -j ACCEPT iptables -t filter -A OUTPUT -s 192.168.0.1 -p tcp --sport 22 -j ACCEPT |
-
2.放行httpd/nginx服务
1 2 | iptables -I OUTPUT -s 192.168.0.1 -p tcp --sport 80 -j ACCEPT iptables -I INPUT -d 192.168.0.1 -p tcp --dport 80 -j ACCEPT |
-
-
3.放行本机端的流入流出
1 2 3 | iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -i lo -j ACCEPT iptables -A OUTPUT -s 127.0.0.1 -d 127.0.0.1 -o lo -j ACCEPT #不放行本机的流入与流出,访问本机的httpd服务,网页会出现Error establishing a database connection。 |
-
4.限制ping 192.168.0.1主机的数据包数,平均2/s个,最多不能超过3个
1 | iptables -A INPUT -i ens33 -d 192.168.0.1 -p icmp --icmp- type 8 -m limit --limit 2 /second --limit-burst 3 -j ACCEPT |
4.2、如何配置iptables
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | a) 1. 删除现有规则 iptables -F b) 2. 配置默认链策略 iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT DROP c) 3. 允许远程主机进行SSH连接 iptables -A INPUT -i eth0 -p tcp –dport 22 -m state –state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp –sport 22 -m state –state ESTABLISHED -j ACCEPT d) 4. 允许本地主机进行SSH连接 iptables -A OUTPUT -o eth0 -p tcp –dport 22 -m state –state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp –sport 22 -m state –state ESTABLISHED -j ACCEPT e) 5. 允许HTTP请求 iptables -A INPUT -i eth0 -p tcp –dport 80 -m state –state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp –sport 80 -m state –state ESTABLISHED -j ACCEPT |
4.3、iptables初始化脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | #!/bin/bash echo "Setting firewall . . . . start" #--------RULESET INIT----------# iptables -F iptables -X iptables -P INPUT DROP iptables -P OUTPUT ACCEPT iptables -P FORWARD ACCEPT iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT #------------------------------# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -i eth0 -p tcp ! --syn -j ACCEPT iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT #------------------------------# #zabbix iptables -A INPUT -p tcp --destination-port 10050 -j ACCEPT iptables -A INPUT -p udp --destination-port 10051 -j ACCEPT iptables -A OUTPUT -p tcp --destination-port 10050 -j ACCEPT iptables -A OUTPUT -p udp --destination-port 10051 -j ACCEPT #for web iptables -A INPUT -p tcp --destination-port 21 -j ACCEPT iptables -A INPUT -p tcp --destination-port 80 -j ACCEPT iptables -A OUTPUT -p tcp --destination-port 80 -j ACCEPT iptables -A OUTPUT -p tcp --destination-port 21 -j ACCEPT #for mysql iptables -A INPUT -p tcp --destination-port 3306 -j ACCEPT iptables -A OUTPUT -p tcp --destination-port 3306 -j ACCEPT #for mail iptables -A INPUT -p tcp --destination-port 25 -j ACCEPT iptables -A OUTPUT -p tcp --destination-port 25 -j ACCEPT iptables -A OUTPUT -p tcp --destination-port 110 -j ACCEPT #for ssh iptables -A INPUT -p tcp -s any /0 --destination-port 22 -j ACCEPT iptables -N icmp_allowed iptables -A icmp_allowed -p ICMP --icmp- type 11 -j ACCEPT iptables -A icmp_allowed -p ICMP --icmp- type 8 -j ACCEPT iptables -A icmp_allowed -p ICMP -j DROP iptables -A OUTPUT -p icmp -j ACCEPT iptables -A INPUT -p icmp -j ACCEPT iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1 /s -j ACCEPT iptables -A FORWARD -p icmp --icmp- type echo -request -m limit --limit 1 /s -j ACCEPT iptables -A FORWARD -p tcp --syn -m limit --limit 1 /s -j ACCEPT /etc/init .d /iptables save |
SNAT,DNAT
NAT:地址转换 httpd,vsftpd环境说明 192.168.0.10 192.168.0.1AND172.168.0.1 172.168.0.10
DNAT:目标地址转换
SNAT:源地址转换(POSTROUTING,OUTPUT只会在这两条链做)-j SANT
--to-source-j MASQUERAED 自动获取转换的ip地址,只有是动态获取的时候才能用,因为这个比SNAT效率低很多,因为自动指定,所以不用后面再加--to-sourceiptables -t nat -A POSTROUTING -s 192.168.0.0/16 -j SNAT --to-source 172.168.0.1
如何用拨号网卡上网
ADSL:123.2.3.2 ppp0代表拨号上网的网卡,第一张 也可以指定一个范围iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o ppp0 -j SNAT --to-source 123.2.3.2-123.2.3.5只放行httpd服务,跟icmp协议
iptables -P FORWARD DROPiptables -L -niptables -A FORWARD -m state --state ESTABLISHED -j ACCEPTiptables -A FORWARD -s 192.168.0.0/16 -p tcp --dport 80 -m state --state NEW -j ACCEPT打开icmpiptables -A FORWARD -s 192.168.0.0/16 -p icmp --icmp-type 8 -m state --state NEW -j ACCEPT打开ftp服务,必须加载这两个模块
vim /etc/sysconfig/iptables-config IPTABLES_MODULES="ip_nat_ftp"IPTABLES_MODULES="ip_conntrack_ftp"iptables -A FORWARD -s 192.168.0.0/16 -p tcp --dport 21 -m state --state NEW -j ACCEPT
RELATED,附属已存在的链接iptables -R FORWARD 1 -m state --state ESTABLISHED,RELATED -j ACCEPT httpd环境说明 192.168.0.10 192.168.0.1AND172.168.0.1 172.168.0.10-j DNAT 目标地址转换 --to-destination ip[:port]iptables -t nat -A PREROUTING -d 172.168.0.1 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.10端口转换
iptables -t nat -R PREROUTING 1 -d 172.168.0.1 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.10:8080拒绝所有含有“h7n9”的页面访问
iptables -A FORWARD -m string --algo kmp --string "h7n9" -j DROP
一:防火墙是用于实现Linux下访问控制的功能的,它分为硬件的或者软件的防火墙两种。无论是在哪个网络中,防火墙工作的地方一定是在网络的边缘。而我们的任务就是需要去定义到底防火墙如何工作,这就是防火墙的策略、规则,以达到让它对出入网络的IP、数据进行检测。
目前市面上比较常见的有3、4层的防火墙,叫网络层的防火墙,还有7层的防火墙,其实是代理层的网关。
对于TCP/IP的七层模型来讲,我们知道第三层是网络层,三层的防火墙会在这层对源地址和目标地址进行检测。但是对于七层的防火墙,不管你源端口或者目标端口,源地址或者目标地址是什么,都将对你所有的东西进行检查。所以,对于设计原理来讲,七层防火墙更加安全,但是这却带来了效率更低。所以市面上通常的防火墙方案,都是两者结合的。而又由于我们都需要从防火墙所控制的这个口来访问,所以防火墙的工作效率就成了用户能够访问数据多少的一个最重要的控制,配置的不好甚至有可能成为流量的瓶颈。
二:iptables 的历史以及工作原理
1.iptables的发展:
iptables的前身叫ipfirewall (内核1.x时代),这是一个作者从freeBSD上移植过来的,能够工作在内核当中的,对数据包进行检测的一款简易访问控制工具。但是ipfirewall工作功能极其有限(它需要将所有的规则都放进内核当中,这样规则才能够运行起来,而放进内核,这个做法一般是极其困难的)。当内核发展到2.x系列的时候,软件更名为ipchains,它可以定义多条规则,将他们串起来,共同发挥作用,而现在,它叫做iptables,可以将规则组成一个列表,实现绝对详细的访问控制功能。
他们都是工作在用户空间中,定义规则的工具,本身并不算是防火墙。它们定义的规则,可以让在内核空间当中的netfilter来读取,并且实现让防火墙工作。而放入内核的地方必须要是特定的位置,必须是tcp/ip的协议栈经过的地方。而这个tcp/ip协议栈必须经过的地方,可以实现读取规则的地方就叫做 netfilter.(网络过滤器)
作者一共在内核空间中选择了5个位置,
1.内核空间中:从一个网络接口进来,到另一个网络接口去的
2.数据包从内核流入用户空间的
3.数据包从用户空间流出的
4.进入/离开本机的外网接口
5.进入/离开本机的内网接口
2.iptables的工作机制
从上面的发展我们知道了作者选择了5个位置,来作为控制的地方,但是你有没有发现,其实前三个位置已经基本上能将路径彻底封锁了,但是为什么已经在进出的口设置了关卡之后还要在内部卡呢? 由于数据包尚未进行路由决策,还不知道数据要走向哪里,所以在进出口是没办法实现数据过滤的。所以要在内核空间里设置转发的关卡,进入用户空间的关卡,从用户空间出去的关卡。那么,既然他们没什么用,那我们为什么还要放置他们呢?因为我们在做NAT和DNAT的时候,目标地址转换必须在路由之前转换。所以我们必须在外网而后内网的接口处进行设置关卡。
这五个位置也被称为五个钩子函数(hook functions),也叫五个规则链。
1.PREROUTING (路由前)
2.INPUT (数据包流入口)
3.FORWARD (转发管卡)
4.OUTPUT(数据包出口)
5.POSTROUTING(路由后)
这是NetFilter规定的五个规则链,任何一个数据包,只要经过本机,必将经过这五个链中的其中一个链。
3.防火墙的策略
防火墙策略一般分为两种,一种叫“通”策略,一种叫“堵”策略,通策略,默认门是关着的,必须要定义谁能进。堵策略则是,大门是洞开的,但是你必须有身份认证,否则不能进。所以我们要定义,让进来的进来,让出去的出去,所以通,是要全通,而堵,则是要选择。当我们定义的策略的时候,要分别定义多条功能,其中:定义数据包中允许或者不允许的策略,filter过滤的功能,而定义地址转换的功能的则是nat选项。为了让这些功能交替工作,我们制定出了“表”这个定义,来定义、区分各种不同的工作功能和处理方式。
我们现在用的比较多个功能有3个:
1.filter 定义允许或者不允许的
2.nat 定义地址转换的
3.mangle功能:修改报文原数据
我们修改报文原数据就是来修改TTL的。能够实现将数据包的元数据拆开,在里面做标记/修改内容的。而防火墙标记,其实就是靠mangle来实现的。
小扩展:
对于filter来讲一般只能做在3个链上:INPUT ,FORWARD ,OUTPUT
对于nat来讲一般也只能做在3个链上:PREROUTING ,OUTPUT ,POSTROUTING
而mangle则是5个链都可以做:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
iptables/netfilter(这款软件)是工作在用户空间的,它可以让规则进行生效的,本身不是一种服务,而且规则是立即生效的。而我们iptables现在被做成了一个服务,可以进行启动,停止的。启动,则将规则直接生效,停止,则将规则撤销。
iptables还支持自己定义链。但是自己定义的链,必须是跟某种特定的链关联起来的。在一个关卡设定,指定当有数据的时候专门去找某个特定的链来处理,当那个链处理完之后,再返回。接着在特定的链中继续检查。
注意:规则的次序非常关键,谁的规则越严格,应该放的越靠前,而检查规则的时候,是按照从上往下的方式进行检查的。
三.规则的写法:
iptables定义规则的方式比较复杂:
格式:iptables [-t table] COMMAND chain CRETIRIA -j ACTION
-t table :3个filter nat mangle
COMMAND:定义如何对规则进行管理
chain:指定你接下来的规则到底是在哪个链上操作的,当定义策略的时候,是可以省略的
CRETIRIA:指定匹配标准
-j ACTION :指定如何进行处理
比如:不允许172.16.0.0/24的进行访问。
iptables -t filter -A INPUT -s 172.16.0.0/16 -p udp --dport 53 -j DROP
当然你如果想拒绝的更彻底:
iptables -t filter -R INPUT 1 -s 172.16.0.0/16 -p udp --dport 53 -j REJECT
iptables -L -n -v #查看定义规则的详细信息
四:详解COMMAND:
1.链管理命令(这都是立即生效的)
-P :设置默认策略的(设定默认门是关着的还是开着的)
默认策略一般只有两种
iptables -P INPUT (DROP|ACCEPT) 默认是关的/默认是开的
比如:
iptables -P INPUT DROP 这就把默认规则给拒绝了。并且没有定义哪个动作,所以关于外界连接的所有规则包括Xshell连接之类的,远程连接都被拒绝了。
-F: FLASH,清空规则链的(注意每个链的管理权限)
iptables -t nat -F PREROUTING
iptables -t nat -F 清空nat表的所有链
-N:NEW 支持用户新建一个链
iptables -N inbound_tcp_web 表示附在tcp表上用于检查web的。
-X: 用于删除用户自定义的空链
使用方法跟-N相同,但是在删除之前必须要将里面的链给清空昂了
-E:用来Rename chain主要是用来给用户自定义的链重命名
-E oldname newname
-Z:清空链,及链中默认规则的计数器的(有两个计数器,被匹配到多少个数据包,多少个字节)
iptables -Z :清空
2.规则管理命令
-A:追加,在当前链的最后新增一个规则
-I num : 插入,把当前规则插入为第几条。
-I 3 :插入为第三条
-R num:Replays替换/修改第几条规则
格式:iptables -R 3 …………
-D num:删除,明确指定删除第几条规则
3.查看管理命令 “-L”
附加子命令
-n:以数字的方式显示ip,它会将ip直接显示出来,如果不加-n,则会将ip反向解析成主机名。
-v:显示详细信息
-vv
-vvv :越多越详细
-x:在计数器上显示精确值,不做单位换算
--line-numbers : 显示规则的行号
-t nat:显示所有的关卡的信息
五:详解匹配标准
1.通用匹配:源地址目标地址的匹配
-s:指定作为源地址匹配,这里不能指定主机名称,必须是IP
IP | IP/MASK | 0.0.0.0/0.0.0.0
而且地址可以取反,加一个“!”表示除了哪个IP之外
-d:表示匹配目标地址
-p:用于匹配协议的(这里的协议通常有3种,TCP/UDP/ICMP)
-i eth0:从这块网卡流入的数据
流入一般用在INPUT和PREROUTING上
-o eth0:从这块网卡流出的数据
流出一般在OUTPUT和POSTROUTING上
2.扩展匹配
2.1隐含扩展:对协议的扩展
-p tcp :TCP协议的扩展。一般有三种扩展
--dport XX-XX:指定目标端口,不能指定多个非连续端口,只能指定单个端口,比如
--dport 21 或者 --dport 21-23 (此时表示21,22,23)
--sport:指定源端口
--tcp-fiags:TCP的标志位(SYN,ACK,FIN,PSH,RST,URG)
对于它,一般要跟两个参数:
1.检查的标志位
2.必须为1的标志位
--tcpflags syn,ack,fin,rst syn = --syn
表示检查这4个位,这4个位中syn必须为1,其他的必须为0。所以这个意思就是用于检测三次握手的第一次包的。对于这种专门匹配第一包的SYN为1的包,还有一种简写方式,叫做--syn
-p udp:UDP协议的扩展
--dport
--sport
-p icmp:icmp数据报文的扩展
--icmp-type:
echo-request(请求回显),一般用8 来表示
所以 --icmp-type 8 匹配请求回显数据包
echo-reply (响应的数据包)一般用0来表示
2.2显式扩展(-m)
扩展各种模块
-m multiport:表示启用多端口扩展
之后我们就可以启用比如 --dports 21,23,80
六:详解-j ACTION
常用的ACTION:
DROP:悄悄丢弃
一般我们多用DROP来隐藏我们的身份,以及隐藏我们的链表
REJECT:明示拒绝
ACCEPT:接受
custom_chain:转向一个自定义的链
DNAT
SNAT
MASQUERADE:源地址伪装
REDIRECT:重定向:主要用于实现端口重定向
MARK:打防火墙标记的
RETURN:返回
在自定义链执行完毕后使用返回,来返回原规则链。
练习题1:
只要是来自于172.16.0.0/16网段的都允许访问我本机的172.16.100.1的SSHD服务
分析:首先肯定是在允许表中定义的。因为不需要做NAT地址转换之类的,然后查看我们SSHD服务,在22号端口上,处理机制是接受,对于这个表,需要有一来一回两个规则,如果我们允许也好,拒绝也好,对于访问本机服务,我们最好是定义在INPUT链上,而OUTPUT再予以定义就好。(会话的初始端先定义),所以加规则就是:
定义进来的: iptables -t filter -A INPUT -s 172.16.0.0/16 -d 172.16.100.1 -p tcp --dport 22 -j ACCEPT
定义出去的: iptables -t filter -A OUTPUT -s 172.16.100.1 -d 172.16.0.0/16 -p tcp --dport 22 -j ACCEPT
将默认策略改成DROP:
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
七:状态检测:
是一种显式扩展,用于检测会话之间的连接关系的,有了检测我们可以实现会话间功能的扩展
什么是状态检测?对于整个TCP协议来讲,它是一个有连接的协议,三次握手中,第一次握手,我们就叫NEW连接,而从第二次握手以后的,ack都为1,这是正常的数据传输,和tcp的第二次第三次握手,叫做已建立的连接(ESTABLISHED),还有一种状态,比较诡异的,比如:SYN=1 ACK=1 RST=1,对于这种我们无法识别的,我们都称之为INVALID无法识别的。还有第四种,FTP这种古老的拥有的特征,每个端口都是独立的,21号和20号端口都是一去一回,他们之间是有关系的,这种关系我们称之为RELATED。
所以我们的状态一共有四种:
NEW
ESTABLISHED
RELATED
INVALID
所以我们对于刚才的练习题,可以增加状态检测。比如进来的只允许状态为NEW和ESTABLISHED的进来,出去只允许ESTABLISHED的状态出去,这就可以将比较常见的反弹式木马有很好的控制机制。
对于练习题的扩展:
进来的拒绝出去的允许,进来的只允许ESTABLISHED进来,出去只允许ESTABLISHED出去。默认规则都使用拒绝
iptables -L -n --line-number :查看之前的规则位于第几行
改写INPUT
iptables -R INPUT 2 -s 172.16.0.0/16 -d 172.16.100.1 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -R OUTPUT 1 -m state --state ESTABLISHED -j ACCEPT
此时如果想再放行一个80端口如何放行呢?
iptables -A INPUT -d 172.16.100.1 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -R INPUT 1 -d 172.16.100.1 -p udp --dport 53 -j ACCEPT
练习题2:
假如我们允许自己ping别人,但是别人ping自己ping不通如何实现呢?
分析:对于ping这个协议,进来的为8(ping),出去的为0(响应).我们为了达到目的,需要8出去,允许0进来
在出去的端口上:iptables -A OUTPUT -p icmp --icmp-type 8 -j ACCEPT
在进来的端口上:iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
小扩展:对于127.0.0.1比较特殊,我们需要明确定义它
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
iptables -A OUTPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
八:SNAT和DNAT的实现
由于我们现在IP地址十分紧俏,已经分配完了,这就导致我们必须要进行地址转换,来节约我们仅剩的一点IP资源。那么通过iptables如何实现NAT的地址转换呢?
1.SNAT基于原地址的转换
基于原地址的转换一般用在我们的许多内网用户通过一个外网的口上网的时候,这时我们将我们内网的地址转换为一个外网的IP,我们就可以实现连接其他外网IP的功能。
所以我们在iptables中就要定义到底如何转换:
定义的样式:
比如我们现在要将所有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这个位置上
九:控制规则的存放以及开启
注意:你所定义的所有内容,当你重启的时候都会失效,要想我们能够生效,需要使用一个命令将它保存起来
1.service iptables save 命令
它会保存在/etc/sysconfig/iptables这个文件中
2.iptables-save 命令
iptables-save > /etc/sysconfig/iptables
3.iptables-restore 命令
开机的时候,它会自动加载/etc/sysconfig/iptabels
如果开机不能加载或者没有加载,而你想让一个自己写的配置文件(假设为iptables.2)手动生效的话:
iptables-restore <>
则完成了将iptables中定义的规则手动生效
十:总结
Iptables是一个非常重要的工具,它是每一个防火墙上几乎必备的设置,也是我们在做大型网络的时候,为了很多原因而必须要设置的。学好Iptables,可以让我们对整个网络的结构有一个比较深刻的了解,同时,我们还能够将内核空间中数据的走向以及linux的安全给掌握的非常透彻。我们在学习的时候,尽量能结合着各种各样的项目,实验来完成,这样对你加深iptables的配置,以及各种技巧有非常大的帮助。