首页 > 代码库 > 了解IPtables的工作方式
了解IPtables的工作方式
Firewall:工作域、于主机或网络边缘,对于进出的报文根据规则定义的规则作检查,进而对被规则匹配的报文作为相应的处理。主要分为网络防火墙和主机防火墙
IDS(入侵检测系统):Instrusion Detect System
分别为以下两种: HIDS;Host IDS; NIDS: Network IDS
IPS:(入侵防御系统Intrusion Protect System)
HoneyPot: 蜜罐,诱引不法信息进入,使用反向追踪
bt(backtrack):安全工具发行版
安全评估工具:Nessus、nmap、
用户编写规则:先确定功能(表),确定报文的流向,确定要实现的目标,确定匹配条件
规则的功能:
raw、mangle、nat、fitler
fitler:过滤,定义是否允许通过防火墙
nat: 地址转换,启用connection_track
mangle: 修改tcp/ip的首部
raw:让用户的请求在经过Network时,为nat表上启用连接追中功能
表和链的对应关系
fitler:INPUT,FORWARD,OUTPUT
nat:PREROUTING(SNAT),POSRTOUTING,OUTPUT
mangle:修改报文中某些值的特性 ,-->所有位置都可以修改
raw:那里能做nat就在那里做
======================================================================
数据报文的流程
跟本机内部的进程通信
进入:-->PREROUTING-->INPUT
出去:-->OUTPUT-->POSTROUTING
由本机转发
请求:-->PREROUTING-->FORWARD-->POSTROUTING-->
响应:-->PREROUTING-->FORWARD-->POETROUTING
如果规则中限定原地址、目标地址、源端口、目标端口等与流向相关的设定
数据报文的流向:
源IP和目标IP有流向决定
PREROUTING:路由前
INPUT:到达本机内部的报文必经之路
FORWARD:有本机转发报文的必经之路
OUTPUT:本机发出的报文的必经之路
POSTROUTING:路由后
规则文件/etc/sysconfig/iptables
保存启用中的规则到规则文件中
1、#iptables-save > /etc/sysconfig/iptables
2、#service iptables save
生效规则文件中的规则
1、#iptables-restore < /etc/sysconfig/iptables
2、#service iptables restart
执行的操作,清空现有规则,读取并生效规则文件中的规则
写规则时:
作为服务器端:先进后出
作为客户端:先出后进
icmp:控制消息协议
iptables:用户空间的工具,写规则,并发送给netfilter,立即生效
netfilter;接受并生效规则(真正意义上的防火墙)
======================================================================
基本语法:
格式: iptables [-t TABLE] COMMAND CHAIN CRETIRIA -j TARGET
-t TABLE: 默认是filter,其他选项:nat 、mangle、 raw
COMMAND :
链
-F :flush ,清空规则链
-N:new,自建一条链
-X:delete,删除一条自定义空链
-Z:zero,计数器归零
-p:policy,设定默人策略,对filter表来讲。默认规则为ACCEPT或DROP
-E : rEname,重命名自定义的链
链中的规则
-A:Append,在链末添加一条规则,
-D:Insert, 删除一条或多条规则,可以指定链中的序号
-I :Delete,插入条新规则
-R:Replce,修改一条规则,
查询:
-L :list
-n:以数字格式显示主机地址和端口
-v:显示详细信息 ;vv,vvv,vvvv
--line-number:显示规则行号
-x:exactly,详细信息,不作单位换算 ,而显示其精确值
pkts bytes target prot opt in out source destination
包数 字节数 目标 协议 流入接口 流出接口 源地址 目标地址
==========================================================================
格式:iptables [-t TABLE] -A 链名 匹配条件 -j 处理目标
匹配条件:
通用匹配
-s 地址:指定报文源的IP地址匹配的范围,可以是IP地址或者网络地址,使用!取反
--src,--source
-d 地址:自定目标的IP地址的匹配的范围,可以是IP地址或者网络地址,使用!取反
--dst,--destiantion
-p 协议: 指定匹配报文的协议类型,一般有三种:tcp,udp,icmp
-i INTERFACE: 数据报文流入的接口:prerouting,input,forward
-o INTERFACE:数据包流出的接口:output,forward,postrouting
扩展匹配:调用nstfilter额外模块实现特殊检查机制,必须使用-m选项来指定调用那个模块
隐式扩展:当使用-p{tcp | udp | icmp}指定中的一种时,可以直接使用扩展中的一种选项
-p tcp == [-m tcp]
--sports PORT[-PORT]:指定源端口
--dport PORT[-PORT]:指定目标端口
--tcp-flag 要检查标志位列表(逗号分割),必须为1的标志位列表(逗号分割)
eg:--tcp-flags syn,ack,rst,fin syn
--syn
-p udp == [-m udp]
--sports [PORT]...:指定源端口
--dport PORT:指定目标端口
-p icmp == [-m icmp]
--icmp-type
0:echo-relplay,ping响应
8:echo-request,ping请求
显式扩展:必须明确说明使用那个模块扩展,才能使用扩展选项
iptables、netfitler分别拥有模块的一部分代码
-m 扩展模块的名称
mutiport:多端口匹配-->可用于匹配非连续或连续端口(max<=15)
专用选项
--source-ports、--sports port[,port,port:port]
--estination-ports、--dports
#iptables -I INPUT -d 目标地址 -p tcp -m mutiport --dports 20,80 -j ACCEPT
#iptables -I OUTPUT -s 172.16.100.7 -p tcp -m multiport --sports 22,80 -j ACCEPT
===#watch -n 1 ‘iptables -L -n -v’===查看iptables信息
iprange:匹配指定范围内的地址(匹配一段连续的地址而不是整个网络)
专用选项
[!] --src-range IP[-IP]
[!] --dst-range IP[-IP]
# 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
string:字符匹配,能够检测报文应用层中的字符串(字符串匹配检查高效算法)
kmp、bm (基于编码后的二进制进行匹配比较)
专用选项
--slgo {kmp|bm}
--string "STRING"
--hex-string "HEX_STRING":HEX_STRING编程成16进制格式的字串
#iptables -I OUTPUT -m string --algo kmp --string "sex" -j DROP
表示凡事含有“sex”字符串的响应都不让出去
time:基于时间做访问控制
专用选项
--datestart YYYY[-MM][-DD[Thh[:mm[:ss]]]]
--datestop
--timestop hh:mm[:ss]
--timestart hh:mm[:ss]
--weekdays day[,day]
#iptables -I INPUT -d 172.16.100.7 -p tcp --dport 80 -m time --timestart 08:20 --timestop 18:40 --weekdays Mon,Tue,Thu,Fri -j REJECT
connlimit:连接数限制,对每个Ip所鞥够发起并发连接数作限制
专用选项 (可以取反)
--connlimit-above [N]
#iptables -A INPUT -d 172.16.100.7 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j DROP
limit:作速率限制
专用选项
--limit n[/second|/minutel|/hour|/day]
--limit-burst n
#iptables -A INPUT -d 172.16.100.7 -p icmp --icmp-type 8 -m limit --limit 20/minute --limit-burst 5 -j ACCEPT
state:状态检查,连接追踪中的状态
NEW:新建立一个会话
ESTABLISHED:以建立的连接
RELATED:有关联关系的连接
INVALID:无法识别的连接
调整连接追踪功能所能容纳的连接的最大连接数
/proc/sys/net/nf_conntrack_max
当前追踪的所有连接
/proc/net/nf_conntrack
不同协议或连接类型追踪时的属性
/proc/sys/netfilter目录
放行被动模式下的FTP服务
1)、装载模块/lib/modules/KERNEL_VERSION/kernel/net/netfilter/
模块:nf_conntrack_ftp
2)、放行请求报文
1、放行NEW状态对21端口请求的报文
2、放行ESTABLISHED以及RELATED状态报文
3)、履行响应报文
1、放行ESTABLISHED以及RELATED状态报文
防火墙的分类:
简单包过滤防火墙
带状态检测的包过滤防火墙(不适用于访问量庞大的站点)
处理目标:
内置目标:
DROP 拒绝,(悄悄丢弃)
REJECT 拒绝,强行丢弃
ACCEPT 接受
#iptables -t [filter] -A INPUT -s 172.16.0.0/16 -d 172.16.1.1 -p icmp -j {DROP | REJECT}
****表示本地主机(172.16.1.1)拒绝来自172.16.网段的主机访问(即拒绝在网段主机上使用#ping 172.16.1.1)
自定义的链
删除规则:
格式:iptables [-t table] -D chain rulenum
#iptables [-t filter] -D INPUT 1 **表示删除链INPUT上的第一条
设置策略
iptables [-t TABLE] -P chain target
修改规则
iptables [-t table] -R chain rulenum rule-specification
插入规则
iptables [-t table] -I chain [rulenum] rule-specification
==============================================================================
动态编译的可执行文件需要附带一个的动态链接库。在执行时,需要调用其对应动态链接库中的命令。所以其优点一方面是缩小了执行文件本身的体积,另一方面是加快了编译速度,节省了系统资源。缺点一是哪怕是很简单的程序,只用到了链接库中的一两条命令,也需要附带一个相对庞大的链接库;二是如果其他计算机上没有安装对应的运行库,则用动态编译的可执行文件就不能运行。
静态编译就是编译器在编译可执行文件的时候,将可执行文件需要调用的对应动态链接库(.so或.lib)中的部分提取出来,链接到可执行文件中去,使可执行文件在运行的时候不依赖于动态链接库。所以其优缺点与动态编译的可执行文件正好互补。
==============================================================================
TCP Wrappers
TCP Wrappers是有/etc/hosts.allow 、/etc/hosta.deny连个文件来管理的一个类似防火墙的机制,但是并非所有的软件都可以通过这两个文件管理,被管理的软件必须具备下面两个条件:
1)有xinetd这个超级进程管理的服务
2)支持libwrap.so模块的服务
所有我们在实现TCP Wrappers前需要保证安装了xinetd软件
查看某软件是否可以被tcp wrappers管理:
1)#ldd $(which SERVER_NAME)
2)查看是否被xinetd管理,没有则不能使用tcp wrappers
tcp_wrapper通过读取配置文件中的规则来判定某服务是否可被访问:
/etc/hosts.allow 该文件允许,但是可以使用deny对某行规则取反
/etc/hosts.deny 该文件拒绝,同样可以使用allow对某一行规则取反
编辑上面两个文件中的规则是即时生效的;
配置文件的语法:
daemon_list: client_list [:options]
例如:in.telnetd: ALL : spawn /bin/echo `date` login attempt from %c to %s, %d >> /var/log/telnet.log
服务检查逻辑:client --> /etc/hosts.allow -->(Y) --> ALLOW
client --> /etc/hosts.allow -->(N) --> /etc/hosts.deny -->(Y) --> DENY
-->(N) --> ALLOW
优先级:
先以/etc/hosts.allow进行优先比对,规则符合予以放行
再以/etc.hosta.deny进行比对,规则符合则予以抵消
若不再这两个文件中(或者规则都不符合),予以放行
各项的意义
daemon_list:
应用程序程序名称
应用程序程序名称列表:使用逗号分隔
例如sshd, in.telnetd
ALL:所有受控进程
client_list:
IP地址
主机名
网络地址:必须使用完整格式掩码,不能使用长度掩码,172.16.0.0/16不合用;
简短的网络地址:172.16. 表示为 172.16.0.0/255.255.0.0
ALL: 所有客户端地址;
KNOWN:
UNKNOWN:
PARANOID:主机名和IP地址的各自的正反解析结果不匹配;
特殊的变量:
EXCEPT:除了
[:options]
deny: 通常用于在hosts.allow文件实现拒绝的规则;
allow: 通常用于在hosts.deny文件实现允许的规则;
spawn: 启动一个额外命令
***************待修改。iptables的layer7功能还未添加**************************
本文出自 “菜鸟前行之路” 博客,谢绝转载!