Linux防火墙简介 – iptables配置策略
Linux防火墙简介 – iptables配置策略
Netfilter/iptables简介
要想真正掌握Linux防火墙体系,首先要搞清楚Netfilter和iptables的关系,Netfilter和iptables包含在Linux2.4以后的内核中,可实现防火墙、NAT和数据包分割的功能。Netfilter采用模块化设计,具有良好的可扩展性。Netfilter是一个框架,iptables则是我们用户层的工具,通过iptables我们可以配置很多规则,这些规则加载到Netfilter框架中生效。
Netfilter可以和协议栈很好的契合,如图1所示;协议栈底层实现机制就是这样,ABCDE就是我们可以配置规则的点,BD我们可以控制本机的数据包,ACE可以控制经过本网卡转发的数据包。那么在Netfilter中如何实现?如图2所示;针对ABCDE五个点,Netfilter定义了五个hook函数;五个钩子函数对应了五个规则链:PREROUTING、INPUT、OUTPUT、FORWARD、POSTROUTING;我们使用iptables配置的规则就在这五个规则链中生效。
iptables并不是服务,iptables/natfilter相关的内核模块,包括以下几个:iptables_net、iptables_filter、iptables_mangle、iptables_raw,这些模块我们也可以自己写脚本让它们运行,不一定非使用iptables。
图1. 协议栈底层实现
图2. Netfilter实现
Iptables简介
IPtables主要包括四方面的功能:
Filter(过滤功能)可配置在INPUT链、OUTPUT链、FORWARD链
NET(地址转换功能)可配置在PREROUTING链、POSTROUTING链、OUTPUT链
Mangle(修改报文首部)可配置在五个链上
Raw(原始格式)可配置在PREROUTING链和OUTPUT链
我们主要介绍Filter和NET功能
如果在某一个链上配置了多个功能的规则改以什么顺序生效呢?如下图所示:
图3. 规则生效顺序图
Iptables也可以自定义链,但是必须由默认的这五个链调用,类似于中断功能,如果自定义链匹配则不必返回,如果自定义链不匹配,则返回到主链继续匹配。一般将那些同类的,规则比较多的独立出来,用户可以删除自定义的空链。
每个规则链都有两个内置的计数器,一个记录被匹配的报文个数,一个记录匹配到的报文大小。
Iptables规则举例
下面我们以iptables的几个例子来引入iptables规则的详细解释(man iptables可以获得帮助文档)。
//允许所有主机访问本机的web服务
iptables -I INPUT -d 172.16.100.7 -p tcp -dport -j ACCEPT
iptables -I OUTPUT -s 172.16.100.7 -p tcp -sport -j ACCEPT //放行sshd、httpd,并追踪连接
iptables –A INPUT -d 172.16.100.7 –p tcp --dport 22 –m state --state NEW,ESTABLISHED,-j ACCEPT
iptables –A OUTPUT -s 172.16.100.7 –p tcp --sport 22 –m state --state ESTABLISHED,-j ACCEPT
iptables –A INPUT -d 172.16.100.7 –p tcp --dport 80 –m state --state NEW,ESTABLISHED,-j ACCEPT
iptables –A OUTPUT -s 172.16.100.7 –p tcp --sport 80 –m state --state ESTABLISHED,-j ACCEPT
//允许自己ping别人,别人不能ping自己
iptables -A OUTPUT -s 172.16.100.7 -p icmp --icmp-type 8 -j ACCEPT
iptables -A INPUT -d 172.16.100.7 -p icmp --icmp-type 0 -j ACCEPT 上面的规则中,选项 -I 指的是插入一条规则,后面跟数字的话,代表插入到第几条。
上面都没有指定 -t 选项,-t的作用是指定在哪个表操作,如果不指定默认是filter表。
-A选项向链中添加规则;-s源地址,-p指定协议,--sport源端口,-m使用扩展模块,--state指定状态,-j指定执行的动作。
Iptables命令详解
在这一章我们主要介绍常用的Iptables选项,具体的选项可以使用man iptables来查询:也可以通过几个在线文档查询:
https://wiki.archlinux.org/index.php/Iptables_(简体中文)
https://doc.ubuntu-fr.org/iptables
https://zh.wikipedia.org/wiki/Iptables
官方手册 (比较晦涩) http://ipset.netfilter.org/iptables.man.html
https://wsgzao.github.io/post/iptables/
iptables规则大致由“匹配标准”和“处理动作”组成;iptables在写规则的时候必须指明在哪个链上实现什么功能,表可以不用指定。如下:
iptables [-t table] commond chain [num] 匹配标准 -j 处理办法 |
1)iptables常用命令:
iptables -t [table]:指定表
-A CHAIN :附加一条规则,在链的尾部添加。
-I CHAIN [num]:在指定位置添加。
-D CHAIN [num]:删除指定链,第num条规则。
-R CHAIN [num]:替换指定的规则。
-F [CHAIN]: 清空指定链的规则,如果省略CHAIN,则清空这个表中的所有链的规则。
-P CHAIN:设定指定链的默认策略
-N:自定义一个新的空链
-X:删除一个自定义的空链
-Z:清空指定链中的所有规则计数器
-E:重新命名自定义链
-L:显示指定表中的所有规则
-n:以数字格式显示主机地址和端口号。
-v:显示详细信息;
-vv:显示更详细信息。
-x:显示精确值
--line-numbers:显示规则号
2)匹配标准:
a)通用匹配;
这类匹配是通用的匹配,可以通过man查询或者查询在线文档获取更多信息
-s:指定源ip地址,-d:指定目的地址;
-p{tcp|udp|icmp}:指定协议
-i eht0:指定数据报文流入的接口
-o eth0:指定数据报文流出的接口
b)扩展匹配; 扩展匹配需要依赖于模块才能完成检查;如果使用-p选项,则不用特别指定使用哪个模块完成检查;
隐含扩展:
-p tcp
--sport PORT[-PORT]
--dport PORT[-PORT]
--tcp-flags MASK COMP: 检查tcp标志位;
eg:--tcp-flags SYN,FIN,ACK,RST SYN,ACK 检查四个标志位中的两个是否为1.
--syn:专门匹配三次握手中的第一次
-p icmp
--icmp-type
匹配ICMP协议的ICMP TYPECODE,其中TYPE为8代表ping请求,TYPE为0代表平响应。
搜一下"ICMP TYPECODE对应表"即可找到。
-p udp
--sport
--dport 显示扩展:(增加额外的匹配机制,每个扩展都有自己独有的功能)
-m EXTESTION --spe-opt
state扩展:
结合ip_conntrack追踪当前会话所处的状态,NEW、ESTABLISHED、INVALID、RELATED
eg:只要是下面两种状态的都放行
-m state --state NEW,ESTABLISHED -j ACCEPT
multiport扩展:离散多端口扩展
--source-ports
--destination-ports
--ports
eg:-m multiport --destination-ports 21,22,80
iprange扩展:指定地址范围
-m iprange
--src-range ip-ip
--dst-range ip-ip
eg: 源地址不在 172.16.100.3-172.16.100.100范围内的访问
iptables -A INPUT -p tcp -m iprange ! --src-range 172.16.100.3-172.16.100.100 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
connlimit扩展:
-m connlimit
--connlimit-above n
eg: 如果没有达到连接上限我们就允许
iptables -A INPUT -d 172.16.100.7 -p tcp --dport -m connlimit ! --connlimit-above 2 -j ACCEPT
limit扩展:
-m limit 不控制最大上限,只控制单位时间内最大上限和一次蜂拥而至的上限
--limit rate
--limit-burst
eg:限制ping请求
iptables -R INPUT 3 -d 172.16.100.7 -p icmp --icmp-type 8 -m limit --limit 1/minute -j ACCEPT **string扩展**
-m string
--algo bm|kmp
--from offset
--to offset
--string pattern
eg: 如果请求串中含有hello world就拒绝,如果响应内容中含有hello就拒绝。
iptables -I INPUT -d 172.16.100.7 -m string --algo kmp --string "hello world" -j REJECT
iptables -I OUTPUT -s 172.16.100.7 -m string --algo kmp --string "hello" -j REJECT time扩展:
-m time
--timestart --timestop
--datestart --datestop
eg:
iptables -A FORWARD -s 192.168.10.0/24 -m time --timestart 09:10:00 --timestop 12:00:00 -j DROP recent扩展:
-m recent
--set 记录
--name 制定记录的协议名
--update
--seconds
--hitcount
eg:利用recent模块和state模块限制单ip在300s内只能与本机建立3个新链接,被限制5分钟后恢复访问
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SS
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j DROP
第二句是指SSH记录中的IP,300s内发起超过3次连接则拒绝此IP的连接。
--update 是指每次建立连接都更新列表;
--seconds必须与--rcheck或者--update同时使用
--hitcount必须与--rcheck或者--update同时使用
//记录日志
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --name SSH --second 300 --hitcount 3 -j LOG --log-prefix "SSH Attack"
3)处理办法:
ACCEPT :允许通过
DROP :拒绝
REJECT :拒绝的更彻底
DNAT :目标地址转换
SNAT :源地址转换
REDIRECT :端口重定向
MASQUERAND :地址伪装
LOG :记录日志
MARK -j LOG: 记录日志
--log-level
--log-prefix
--log-tcp-sequence
--log-uid
--log-ip-options:记录ip选项信息
eg:记录哪一刻,谁发起了ping请求
iptables -I INPUT 4 -d 172.16.100.7 -p icmp --icmp-type 8 -j LOG --log-prefix "----firewall log for icmp----"
//将保存在 /var/log/messages
NAT地址转换
如何打开转发功能?
echo 1 > /proc/sys/net/ipv4/ip_forward
要想永久有效:
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
网关打开转发功能之后,两个网段的主机便可通信,但是为什么还要NAT地址转换呢?主要是接入外网的时候,虽然报文能发出去,但是如果不做地址转换,响应报文回不来,不像这里的两个网段这么简单,报文能回来是因为路由的原因。
-j SNAT
--to-source A->B->C A是内网,A访问外网C,则在B这里要进行源地址转换,源地址转换应该在POSTROUTING链上;
eg:
iptables –t nat –A POSTROUTING –s 192.168.10.0/24 –j SNAT –to-source 172.168.100.7
-j MASQUEREAD
在外网地址是动态获取的时候才使用,自动查找一个能上网的地址。
-j DNAT
--to-destination 目标地址转换必须指定针对什么服务进行转换的:
eg:
iptables -t nat -A PREROUTING -d 172.16.100.7 -p tcp -dport 80 -j DNAT --to-destination 192.168.10.22
//指定转发到哪个端口
iptables -t nat -A PREROUTING -d 172.16.100.7 -p tcp -dport 80 -j DNAT --to-destination 192.168.10.22:8080
如何在NAT上进行过滤
iptables -A FORWARD -m string --algo kmp --string "hello" -j DROP
Iptables其他知识点
lsmod | grep ip 可以查看跟ip相关的模块是否启动起来。
service iptables stop:停止iptables服务
iptables -L -n :显示所有规则
iptables -P INPUT DROP:改默认策略为堵策略
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
ip_contrack内核模块能够实现链接追踪功能,为了能够实时追踪和查询,需要保存当前每一个客户端和当前主机所建立的链接关系。
这个文件可以保存多少个追踪条目?
iptables -t 显示当前链接的个数
ls /proc/sys/net/ipv4/netfilter/
可以改每个链接的失效时间
保存规则:
# Service iptables save
保存到: /etc/sysconfig/iptables
# iptables-save > /etc/sysconfig/iptables.201703
# iptables-restore < /etc/sysconfig/iptables.201703
/etc/sysconfig/iptables
iptables在启动的时候会重新加载配置信息,因此要把写的规则保存到
cat /etc/sysconfig/iptables下面
使用iptables命令可以保存规则到这个文件下面
DNS服务器要写4条规则才能真正生效:因为DNS服务器即做服务器又做客户端。TCP、UDP都监听的话需要8条规则。
自定义链:
iptables –N clean_in
iptables –A clean_in –d 255.255.255.255 –p icmp –j DROP
iptables –A clean_in –d 172.255.255.255 –p icmp –j DROP
iptables –A clearn_in –p tcp ! –syn –m state --state NEW –j DROP
iptables –A clearn_in –d 172.16.100.7 –j RETURN #返回主链
iptables –I INPUT –j clearn_in #被主链调用
删除自定义链,首先要清空自定义链,然后再用语句删除。
Iptables规则练习
1. 放行FTP
要想放行FTP协议,首先要装载ip_conntrack_ftp和ip_nat_ftp模块,Vim /etc/sysconfig/iptables-config 下找到IPTABLES_MODULES,在这个地方指明要加载的模块。IPTABLES_MODULES=”ip_nat_ftp ip_conntrack_ftp”。
iptables –A INPUT –d 172.16.100.7 –p tcp –m state –-state RELATED,ESTABLISHED –j ACCEPT
iptables –I INPUT 2 –d 172.16.100.7 –p tcp –m multiport –destination-ports 21,22 –m state --state NEW –j ACCEPT
放行回话需要些两天规则:
iptables -t filter -A INPUT -s 172.16.0.0/16 –d 172.16.100.7 –p tcp –dport 22 –j ACCEPT
iptables –t filter –A OUTPUT –s 172.16.100.7 –d 172.16.0.0/16 –p tcp –sport 22 –j ACCEPT
2、追踪链接放行sshd、httpd
iptables –A INPUT -d 172.16.100.7 –p tcp --dport 22 –m state --state NEW,ESTABLISHED,-j ACCEPT
iptables –A OUTPUT -s 172.16.100.7 –p tcp --sport 22 –m state --state ESTABLISHED,-j ACCEPT
iptables –A INPUT -d 172.16.100.7 –p tcp --dport 80 –m state --state NEW,ESTABLISHED,-j ACCEPT
iptables –A OUTPUT -s 172.16.100.7 –p tcp --sport 80 –m state --state ESTABLISHED,-j ACCEPT
修改追踪数值:
sysctl –w net.ipv4.ip_conntrack_max=65536
这种改法不会永久有效,要想永久有效,要写在
/etc/sysctl.conf
3、只要是本机响应的都可以放行
iptables –I OUTPUT –s 172.16.100.7 –m state –state ESTABLISHED –j ACCEPT
再放行数据包的时候,一定要清楚协议运行的流程,出入包顺序。
Layer7 Filter
L7-filter可以过滤应用层协议,是一个开源项目:官方网址:http://l7-filter.sourceforge.net/
涉及到编译内核等问题,如果有需要可查阅官方文档,或者有心人发布的博客介绍。
L7所支持的协议:
用法:
iptables –A FORWARD –s 192.168.10.0/24 –m layer7 –l7proto qq –j REJECT
参考资料:
洞悉linux下的Netfilter&iptables:什么是Netfilter?
http://blog.chinaunix.net/uid-23069658-id-3160506.html
Google搜索 Iptables得到的网站,挑了几个讲解比较全的:
https://wiki.archlinux.org/index.php/Iptables_(简体中文)
https://doc.ubuntu-fr.org/iptables
https://zh.wikipedia.org/wiki/Iptables
官方手册 (比较晦涩) http://ipset.netfilter.org/iptables.man.html
https://wsgzao.github.io/post/iptables/
马哥Linux运维教程208讲是本篇文章的主要参考资料
Linux防火墙简介 – iptables配置策略的更多相关文章
- Linux防火墙(iptables/firewalld)
Linux防火墙(iptables/firewalld) 目录 Linux防火墙(iptables/firewalld) 一.iptables 1. iptables概述 2. netfilter和i ...
- linux防火墙之iptables
linux防火墙之iptables 1.1.1 关于iptables简介 IPTABLES 是与最新的 3.5 版本 Linux 内核集成的 IP 信息包过滤系统.如果 Linux 系统连接到因特网或 ...
- Android Linux自带iptables配置IP访问规则
利用Linux自带iptables配置IP访问规则,即可做到防火墙效果
- linux防火墙的管理和策略控制
iptables 一:IPtables防火墙的简介 IPTABLES 是与最新的 3.5 版本 Linux 内核集成的 IP 信息包过滤系统.如果 Linux 系统连接到因特网或 LAN.服务器或连接 ...
- Linux防火墙:iptables禁IP与解封IP常用命令
在Linux服务器被攻击的时候,有的时候会有几个主力IP.如果能拒绝掉这几个IP的攻击的话,会大大减轻服务器的压力,说不定服务器就能恢复正常了. 在Linux下封停IP,有封杀网段和封杀单个IP两种形 ...
- Linux操作系统下IPTables配置方法详解
如果你的IPTABLES基础知识还不了解,建议先去看看. 们来配置一个filter表的防火墙 1.查看本机关于IPTABLES的设置情况 [root@tp ~]# iptables -L -n Cha ...
- linux防火墙使用以及配置
Centos 7 firewall : 1.firewalld的基本使用 启动: systemctl start firewalld 关闭: systemctl stop firewalld 查看状态 ...
- Linux操作系统下IPTables配置
filter表的防火墙 1.查看本机关于IPTABLES的设置情况 [root@tp ~]# iptables -L -n Chain INPUT (policy ACCEPT) target pro ...
- linux防火墙相关 iptables
1. root用户查看防火墙状态(非root用户无权限查看) 查看防火墙状态: service iptables status 2.开启和关闭防火墙 //开启防火墙: service iptables ...
随机推荐
- Android-LogUtil-工具类
LogUtil-工具类 是专门Log日志打印 和 Toast的提示,的公共方法 package common.library.utils; import android.content.Context ...
- s21day25 python笔记
s21day25 python笔记 正则表达式 1.定义 定义:正则表达式是一种规则匹配字符串的规则 re模块本身只是用来操作正则表达式的,和正则本身没关系 为什么要有正则表达式? 匹配字符串 一个人 ...
- 关于easyui展示慢的Debug
同事开发的软件系统采用Easyui做的前台界面,当业务变得比较复杂之后,展示效果就变得很慢,于是我开始了原因的排查,现在已经找到了具体的原因,所以拿出来与大家一起分享调试过程. 既然调试的是前端,那么 ...
- 杭州.Net 相关大公司,希望对大家有帮助
本人目前大四,还在实习.北京工作辞职后,打算回杭州看看.发现杭州的大公司相对北京好少啊,招.Net相关的公司就更少了... (我认为刚毕业生还是去大公司比较靠谱,一方面也是实力的体现)大学生,而且之前 ...
- C#基础知识入门概要(自我回顾用)
一,C#是什么? 人与人之间可以用语言进行交流,我们和计算机交流也是通过语言.我们可以通过语言让一个人做一件我们想让他做事情(他愿意的话~),我们能不能让计算机按照我们的意愿来做事情呢?比如我们让计算 ...
- C#之通过图片地址下载图片
因为项目上需要加载在线卫星云图,因此写了这个功能来把卫星云图下载的本地,在这里记录一下: string imageUrl=“http://image.nmc.cn/product/2018/08/06 ...
- 【OCP|052】OCP 11g最新考题收集整理-第6题
6.You are installing Oracle Grid Infrastructure by using the Oracle Universal Installer (OUI). You s ...
- jQuery表单2
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- ROS(机器人URDF模型优化)
URDF模型 xacro优化后的URDF模型 1.精简模型代码(创建宏定义,文件包含) 2.提供可编程接口(常量,变量,数学计算,条件语句) 常量定义: name:base_length的值value ...
- Weblogic wls-wsat组件反序列化漏洞(CVE-2017-10271)
CVE编号: CVE-2017-10271 漏洞描述: Weblogic wls-wsat组件反序列化漏洞 利用脚本: https://github.com/hanc00l/weblogic_wls_ ...