iptables/netfilter:
Firewall:防火墙,隔离工具;工作于主机或网络边缘,对于进出本主机或本网络的报文根据事先定义的检查规则作匹配检测,对于能够被规则匹配到的报文作出相应处理的组件;
主机防火墙
网络防火墙
软件防火墙(软件逻辑):
硬件防火墙(硬件和软件逻辑):NetScreen,CheckPoint,。。。
iptables(netfilter)
netfilter:kernel
hooks function(钩子函数):
iptables:cli
rules untility
hooks function(钩子函数):
input
output
forward
prerouting
postrouting
报文流向:
流入本机:PREROUTING --> INPUT ==>用户空间进程;
由本机流出:用户空间进程==> OUTPUT --> POSTROUTING;
转发:PREROUTING --> FORWARD --> POSTROUTING
功能:表(table)
filter:过滤,防火墙;
nat:network address translation网络地址转换;用于修改源IP或目标IP,也可以改端口;
mangle:拆解报文,按需修改;
raw:关闭nat表上启用的连接追踪机制;
?iptables:
1、内置链:PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING;对应于一个钩子函数(hook function);
2、自定义链:用于内置链的扩展和补充,可实现更灵活的规则管理机制;
表<==>链:
filter:INPUT,FORWARD,OUTPUT
nat:PREROUTING、INPUT、OUTPUT、POSTROUTING
mangle:PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING
raw:PREROUTING、OUTPUT
优先级:同一个链上的不同的表的规则的应用优先级(高-->低):raw>managle>nat>filter
路由功能发生的时刻:
1、报文进入本机后:判断目标主机是否为本机?是:INPUT;否:FORWARD(真正是否生效取决于是否开启路由转发)
2、报文离开本机之前:判断经由哪一个接口送往下一跳?
规则:
组成部分:根据规则匹配条件来尝试匹配报文,一旦匹配成功,就由规则定义的处理动作作出处理;
a、匹配条件:
1、基本匹配条件
2、扩展匹配条件
b、处理动作(target):
1、基本处理动作
2、扩展处理动作
3、自定义处理机制
添加规则时的考量点:
(1) 要实现哪种功能:判断添加到哪个表上;
(2) 报文流经的路径:判断添加到哪个链上;
链上规则的次序:即为检查的次序,因此隐含一定的法则:自上而下检查
1、同类规则(访问同一应用),匹配范围小的放上面;
2、不同类规则(访问不同应用),匹配到报文频率较大的放上面;
3、将那些可由一条规则描述的多个规则合并为一个;
4、设置默认策略;
Centos 7
~]# systemctl stop firewalld.service
~]# systemctl disable firewalld.service
注意:当修改iptables规则时,避免出错导致远程访问给阻挡,应在应用规则前定义一个at或者crontab任务,清除规则,保证远程访问可以正常访问
规则格式:iptables ? [-t table] ? SUBCOMMAND ? chain ? [-m matchname [per-match-options]] ? -j targetname [per-target-options]
-t table:
raw, mangle, nat, [filter]
SUBCOMMAND:
链管理:
-N:new, 新增一条自定义链;
-F:flush,清空指定的规则链;
-X: delete,删除自定义的空链;
-Z:zero,置零规则计数器;iptables的每条规则都有两个计数器:(1) 匹配到的报文的个数;(2) 匹配到的所有报文的大小之和;
-P:Policy,设置默认策略;对filter表中的链而言,其默认策略有:ACCEPT:接受、DROP:丢弃、REJECT:拒绝
-E:rename,重命名自定义的未被引用的链;引用计数不为0的自定义链不能够被重命名,也不能被删除;
规则管理:
-A:append,在最后追加;
-I:insert, 插入,要指明位置,省略时表示第一条;
-D:delete,删除指定规则;
-R:replace,替换指定链上的指定规则;
两种指定方式:(1) 指明规则序号;(2) 指明规则本身;
?-S:selected,以iptables-save命令的格式显示链上的规则;
查看:
-L:list, 列出指定鏈上的所有规则;
-n:numeric,以数字格式显示地址和端口;
-v:verbose,详细信息;
-vv, -vvv
-x:exactly,显示计数器结果的精确值而非换算后的结果;
--line-numbers:显示链上的规则的编号;
chain:
PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
匹配条件:
基本匹配条件:无需加载任何模块,由iptables/netfilter自行提供;
[!] -s, --source ?address[/mask][,...]:检查报文中的源IP地址是否符合此处指定的地址或范围;
[!] -d, --destination address[/mask][,...]:检查报文中的目标IP地址是否符合此处指定的地址或范围;
[!] -p, --protocol protocol
protocol: tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh or ?"all"
{tcp|udp|icmp}
[!] -i, --in-interface name:数据报文流入的接口;只能应用于数据报文流入的环节,只能应用于PREROUTING,INPUT和FORWARD链;
[!] -o, --out-interface name:数据报文流出的接口;只能应用于数据报文流出的环节,只能应用于FORWARD、OUTPUT和POSTROUTING链;
扩展匹配条件: 需要加载扩展模块,方可生效;其模块目录为/usr/lib64/xtables/
隐式扩展:可以不用使用-m选项专门加载相应模块;前提是要使用-p选项可匹配何种协议;
[!] -p, --protocol protocol
协议protocol: tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh or ?"all"
{tcp|udp|icmp}
1、-p tcp:隐含指明了“-m tcp”,有专用选项:
[!] --source-port, --sport port[:port]:匹配报文的tcp首部的源端口;可以是端口范围;
[!] --destination-port,--dport port[:port]:匹配报文的tcp首部的目标端口;可以是端口范围;
[!] --tcp-flags ?LIST1 ?LIST2:检查LIST1所指明的所有标志位,且这其中,LIST2所表示出的所有标记位必须为1,而余下的必须为0;没有在LIST1中指明的,不做检查;
SYN,ACK,FIN,RST,PSH,URG
例如:“--tcp-flags ?SYN,ACK,FIN,RST ? ? SYN”表示,
要检查的标志位为SYN,ACK,FIN,RST四个,其中SYN必须为1,余下的必须为0;
[!] --syn:用于匹配第一次握手,相当于“--tcp-flags ?SYN,ACK,FIN,RST ?SYN”;
2、-p udp :隐含指明了“-m udp”,有专用选项:
[!] --source-port, --sport port[:port]:匹配报文的源端口;可以是端口范围;
[!] --destination-port,--dport port[:port]:匹配报文的目标端口;可以是端口范围;
3、-p icmp :隐含指明了“-m icmp”,有专用选项:
[!] --icmp-type {type[/code]|typename}
echo-request:8/0echo请求
echo-reply:0/0 echo应答
显式扩展:必须要手动加载扩展模块, [-m matchname [per-match-options]];
使用帮助:
CentOS 6: man iptables
CentOS 7: man iptables-extensions
1、multiport扩展
以离散方式定义多端口匹配;最多指定15个端口;
[!] --source-ports,--sports port[,port|,port:port]...:指定多个源端口;
[!] --destination-ports,--dports port[,port|,port:port]...:指定多个目标端口;
[!] --ports port[,port|,port:port]...:指明多个端口;
~]# iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.67 -p tcp -m multiport --dports 22,80 -j ACCEPT
2、iprange扩展
指明连续的(但一般是不能扩展为整个网络)ip地址范围时使用;
[!] --src-range from[-to]:源IP地址范围;
[!] --dst-range from[-to]:目标IP地址范围;
~]# iptables -A INPUT -d 172.16.100.67 -p tcp --dport 80 -m iprange --src-range 172.16.100.5-172.16.100.10 -j DROP
3、string扩展
对报文中的应用层数据做字符串模式匹配检测;
--algo {bm|kmp}:字符串匹配检测算法;
bm:Boyer-Moore
kmp:Knuth-Pratt-Morris
[!] --string pattern:给定要检测的字符串模式;
[!] --hex-string pattern:给定要检测的字符串模式,16进制格式;
~]# iptables -A OUTPUT -s 172.16.100.67 -d 172.16.0.0/16 -p tcp --sport 80 -m string --algo bm --string ‘gay‘ -j REJECT
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...]:匹配一个周中的那些天
--kerneltz:使用内核上的时区,而非默认的UTC;
~]# iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.67 -p tcp --dport 80 -m time --timestart 14:30 --timestop 18:30 --weekdays Sat,Sun --kerneltz -j DROP
5、connlimit扩展
根据每客户端IP做并发连接数数量匹配;
--connlimit-upto n:连接的数量小于等于n时匹配;
--connlimit-above n:连接的数量大于n时匹配;
~]# iptables -A INPUT -d 172.16.100.67 -p tcp --dport 21 -m connlimit --connlimit-above 8 ?-j REJECT
6、limit扩展
基于令牌桶过滤器算法对收发报文的速率做匹配;
令牌桶过滤器;
--limit rate[/second|/minute|/hour|/day]:平均速率
--limit-burst number ?:突发速率
~]# iptables -I INPUT -d 172.16.100.67 -p icmp --icmp-type 8 -m limit --limit 3/minute --limit-burst 5 -j ACCEPT
~]# iptables -I INPUT 2 -p icmp -j REJECT
7、state扩展
根据“连接追踪机制”去检查连接的状态;
conntrack机制:追踪本机上的请求和响应之间的关系;状态有如下几种:
NEW:新发出请求;连接追踪模板中不存在此连接的相关信息条目,因此,将其识别为第一次发出的请求;
ESTABLISHED:NEW状态之后,连接追踪模板中为其建立的条目失效之前期间内所进行的通信状态;
RELATED:相关联的连接;如ftp协议中的数据连接与命令连接之间的关系;
INVALID:无效的连接;
UNTRACKED:未进行追踪的连接;通常在负载均衡前端需要关闭连接追踪的功能。
[!] --state state
~]# ?iptables -A INPUT -d 172.16.100.67 -p tcp -m multiport --dports 22,80 -m state --state NEW,ESTABLISHED -j ACCEPT
~]# iptables -A OUTPUT -s 172.16.100.67 -p tcp -m multiport --sports 22,80 -m state --state ESTABLISHED -j ACCEPT
连接追踪功能所能够容纳的最大连接数量(可调整):
/proc/sys/net/nf_contrack_max
sysctl -w net.nf_contrack_max 300000
echo "300000" > /proc/sys/net/nf_contrack_max
注意:当conntrack所能够追踪的最大值取决于/proc/sys/net/nf_contrack_max的设定;已经追踪到到的并记录下来的连接位于/proc/net/nf_conntrack文件中,超时的连接将会被删除;当模版满载时,后续的新连接有可能会超时;解决办法:
(1)加大nf_contrack_max的值;
(2)降低nf_contrack_max条目的超时时长;
不同协议的连接追踪时长设定位于/proc/sys/net/netfilter/目录下
已经追踪到到的并记录下来的连接:
/proc/net/nf_conntrack
不同的协议的连接追踪时长:
/proc/sys/net/netfilter/
iptables的链接跟踪表最大容量为/proc/sys/net/ipv4/ip_conntrack_max,链接碰到各种状态的超时后就会从表中删除;当模板满载时,后续的连接可能会超时
解決方法一般有两个:通常采用第1个办法
(1) 加大nf_conntrack_max 值
vi /etc/sysctl.conf
net.ipv4.nf_conntrack_max = 393216
net.ipv4.netfilter.nf_conntrack_max = 393216
(2) ?降低 nf_conntrack timeout时间
vi /etc/sysctl.conf
net.ipv4.netfilter.nf_conntrack_tcp_timeout_established = 300
net.ipv4.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
net.ipv4.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
net.ipv4.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120
iptables -t nat -L -n
如何开放被动模式的ftp服务?
(1) 装载ftp连接追踪的专用模块:
~]# modprobe ?nf_conntrack_ftp
(2) 放行命令连接(假设Server地址为172.16.100.67):
~]# iptables -A INPUT -d 172.16.100.67 -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
~]# iptables -A OUTPUT -s 172.16.100.67 -p tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT
(3) 放行数据连接(假设Server地址为172.16.100.67):
~]# iptables -A INPUT -d 172.16.100.67 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
~]# iptables -I OUTPUT -s 172.16.100.67 -m state --state ESTABLISHED -j ACCEPT
规则优化:
服务器端规则设定:任何不允许的访问,应该在请求到达时给予拒绝;
(1) 可安全放行所有入站的状态为ESTABLISHED状态的连接;
(2) 可安全放行所有出站的状态为ESTABLISHED状态的连接;
(3) 谨慎放行入站的新请求
(4) 有特殊目的限制访问功能,要于放行规则之前加以拒绝;
如何使用自定义链:
自定义链:需要被调用才能生效;自定义链最后需要定义返回规则;
返回规则使用的target叫做RETURN;
规则的用效期限:
使用iptables命令定义的规则,手动删除之前,其生效期限为kernel存活期限;
保存规则:
保存规则至指定的文件:
CentOS 6:
~]# service ?iptables ?save
将规则保存至/etc/sysconfig/iptables文件中;
~]# iptables-save ?> ?/PATH/TO/SOME_RULES_FILE
CentOS 7:
~]# iptables-save ?> ?/PATH/TO/SOME_RULES_FILE
重新载入预存规则文件中规则:
~]# iptables-restore < ?/PATH/FROM/SOME_RULES_FILE
CentOS 6:
~]# service ?iptables ?restart
会自动从/etc/sysconfig/iptables文件中载入规则
自动生效规则文件中的规则:
(1) 用脚本保存各iptables命令;让此脚本开机后自动运行;
/etc/rc.d/rc.local文件中添加脚本路径;
/PATH/TO/SOME_SCRIPT_FILE
(2) 用规则文件保存各规则,开机时自动载入此规则文件中的规则;
/etc/rc.d/rc.local文件添加:
iptables-restore < /PATH/FROM/IPTABLES_RULES_FILE
CentOS 7:
引入了新的iptables前端管理工具firewalld,其管理工个有:firewalld-cmd, ?firewalld-config
关于firewalld:
https://www.ibm.com/developerworks/cn/linux/1507_caojh/index.html
处理动作:
-j targetname [per-target-options]
ACCEPT
DROP
REJECT
RETURN:返回调用的链;
REDIRECT:端口重定向;
LOG:记录日志;
MARK:做防火墙标记;
DNAT:目标地址转换;
SNAT:源地址转换;
MASQUERADE:地址伪装;
LOG:开启关于匹配数据包的内核日志
--log-level level ? ?日志级别
emerg, alert, crit, error, warning, notice, info, debug.
--log-prefix prefix ?日志行前缀
iptables -I FORWARD -s 10.0.1.0/24 -p tcp -m multiport --dports 80,21,22,23 -m state --state NEW -j LOG --log-prefix “(new connctions)”
RETURN:
返回调用者;
REDIRECT:
只能用在nat表的PREROUTING和POSTROUTING链上,端口重定向(即端口映射)
--to-ports
iptables -t nat -A PREROUTING -d 172.18.100.67 -p tcp --dport 80 -j REDIRECT --to-ports 8080
nat: network address translation:网络地址转换,网络层+传输层实现
snat: source nat
修改IP报文中的源IP地址;
让本地网络中的主机可使用同一地址与外部主机通信,从而实现地址伪装;
请求:由内网主机发起,修改源IP,如何修改由管理员定义;
响应:修改目标IP,由nat自动根据会话表中追踪机制实现相应修改;
dnat: destination nat
修改IP报文中的目标IP地址;
让本地网络中的服务器使用统一的地址向外提供服务,但隐藏了自己的真实地址;
请求:由外网主机发起,修改其目标地址,如何修改由管理员定义;
响应:修改源IP,由nat自动根据会话表中追踪机制实现相应修改;
pnat: port nat(端口转换)
snat:POSTROUTING
让本地网络中的主机通过某一特定地址访问外部网络时;
dnat:PREROUTING
把本地网络中的某一主机上的某服务开放给外部网络中的用户访问时;
nat表的target:
SNAT
--to-source [ipaddr[-ipaddr]][:port[-port]]
--random
DNAT
--to-destination [ipaddr[-ipaddr]][:port[-port]]
--random
MASQUERADE
--to-ports port[-port]
--random
SNAT示例:
~]# iptables -t nat -A POSTROUTING -s 192.168.12.0/24 -j SNAT --to-source 172.16.100.67
MASQUERADE:只能用在nat表的POSTROUTING链,用于实现要转换的IP为动态地址时;
源地址转换:当源地址为动态获取的地址时,MASQUERADE可自行判断要转换为的地址;
~]# iptables -t nat -A POSTROUTING -s 192.168.12.0/24 -j MASQUERADE
DNAT示例:
~]# iptables -t nat -A PREROUTING -d 172.16.100.67 -p tcp --dport 80 -j DNAT --to-destination 192.168.12.77
~]# iptables -t nat -A PREROUTING -d 172.16.100.67 -p tcp --dport 80 -j DNAT --to-destination 192.168.12.77:8080
~]# iptables -t nat -A PREROUTING -d 172.16.100.67 -p tcp --dport 22012 -j DNAT --to-destination 192.168.12.78:22
REDIRECT:端口重定向;
web: 8080
80 --> 8080
源地址转换:
iptables -t nat -A POSTROUTING -s localnet ! -d localnet -j SNAT --to-source extip
iptables -t nat -A POSTROUTING -s localnet ! -d localnet -j MASQUERADE
目标地址转换:
iptables -t nat -A PREROUTING -d extip -p tcp|udp --dport PORT -j ?DNAT --to-destination ?INTERSERVERIP[:PORT]
补充:利用iptables的recent模块来抵御DOS×××: 22,建立一个列表,保存有所有访问过指定的服务的客户端IP
ssh: 远程连接,
iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j DROP
iptables -I INPUT ?-p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
iptables -I INPUT ?-p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j LOG --log-prefix "SSH Attach: "
iptables -I INPUT ?-p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j DROP
1.利用connlimit模块将单IP的并发设置为3;会误杀使用NAT上网的用户,可以根据实际情况增大该值;
2.利用recent和state模块限制单IP在300s内只能与本机建立2个新连接。被限制五分钟后即可恢复访问。
下面对最后两句做一个说明:
1.第二句是记录访问tcp 22端口的新连接,记录名称为SSH
--set 记录数据包的来源IP,如果IP已经存在将更新已经存在的条目
2.第三句是指SSH记录中的IP,300s内发起超过3次连接则拒绝此IP的连接。
--update 是指每次建立连接都更新列表;
--seconds必须与--rcheck或者--update同时使用
--hitcount必须与--rcheck或者--update同时使用
3.iptables的记录:/proc/net/xt_recent/SSH
也可以使用下面的这句记录日志:
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"
第三方模块:
layer7:识别大多数常见的应用层协议,例如http、qq等协议;
CentOS 6:
http://ftp.redhat.com/redhat/linux/enterprise/6Server/en/os/SRPMS/
layer7:第三方扩展;
iptables实现七层访问过滤:
模块:layer7
识别应用层协议
iptables/netfilter
iptables -m state,
netfilter state
对内核中的netfilter,打补丁layer7,重新编译内核
对iptables打补丁,补上layer7模块,重新iptables
diff/patch:文本操作工具
diff是Unix系统的一个很重要的工具程序。它用来比较两个文本文件的差异,是代码版本管理的核心工具之一。其用法非常简单:
# diff <变动前的文件> <变动后的文件>
由于历史原因,diff有三种格式:
正常格式(normal diff)
上下文格式(context diff)
* 合并格式(unified diff)
1、正常格式的diff
例如,对file1(变动前的文件)和file2(变动后的文件)进行比较可使用如下命令:
# diff file1 file2
显示结果中,第一行是一个提示,用来说明变动位置。它分成三个部分:前面的数字,表示file1的第n行有变化;中间的"c"表示变动的模式是内容改变(change),其他模式还有"增加"(a,代表addition)和"删除"(d,代表deletion);
2、上下文格式的diff
上个世纪80年代初,加州大学伯克利分校推出BSD版本的Unix时,觉得diff的显示结果太简单,最好加入上下文,便于了解发生的变动。因此,推出了上下文格式的diff。它的使用方法是加入-c选项(即context)。
# diff -c f1 f2
结果分成四个部分。第一部分的两行,显示两个文件的基本情况:文件名和时间信息,"***"表示变动前的文件,"---"表示变动后的文件。第二部分是15个星号,将文件的基本情况与变动内容分割开。第三部分显示变动前的文件,即file1。
另外,文件内容的每一行最前面,还有一个标记位。如果为空,表示该行无变化;如果是感叹号(!),表示该行有改动;如果是减号(-),表示该行被删除;如果是加号(+),表示该行为新增。
第四部分显示变动后的文件,即file2。
3、合并格式的diff
如果两个文件相似度很高,那么上下文格式的diff,将显示大量重复的内容,很浪费空间。1990年,GNU diff率先推出了"合并格式"的diff,将f1和f2的上下文合并在一起显示。
它的使用方法是加入u参数(代表unified)。
# diff -u f1 f2br/>其结果的第一部分,也是文件的基本信息。"---"表示变动前的文件,"+++"表示变动后的文件。第二部分,变动的位置用两个@作为起首和结束。第三部分是变动的具体内容。
除了有变动的那些行以外,也是上下文各显示3行。它将两个文件的上下文,合并显示在一起,所以叫做"合并格式"。每一行最前面的标志位,空表示无变动,减号表示第一个文件删除的行,加号表示第二个文件新增的行。
diff
-u
patch
尽管并没有指定patch和diff的关系,但通常patch都使用diff的结果来完成打补丁的工作,这和patch本身支持多种diff输出文件格式有很大关系。patch通过读入patch命令文件(可以从标准输入),对目标文件进行修改。通常先用diff命令比较新老版本,patch命令文件则采用diff的输出文件,从而保持原版本与新版本一致。
patch的标准格式为
patch [options] [originalfile] [patchfile]
如果patchfile为空则从标准输入读取patchfile内容;如果originalfile也为空,则从patchfile(肯定来自标准输入)中读取需要打补丁的文件名。因此,如果需要修改的是目录,一般都必须在patchfile中记录目录下的各个文件名。绝大多数情况下,patch都用以下这种简单的方式使用:
patch命令可以忽略文件中的冗余信息,从中取出diff的格式以及所需要patch的文件名,文件名按照diff参数中的"源文件"、"目标文件"以及冗余信息中的"Index:"行中所指定的文件的顺序来决定。
-p参数决定了是否使用读出的源文件名的前缀目录信息,不提供-p参数,则忽略所有目录信息,-p0(或者-p 0)表示使用全部的路径信息,-p1将忽略第一个"/"以前的目录,依此类推。如/usr/src/linux-2.4.15/Makefile这样的文件名,在提供-p3参数时将使用linux-2.4.15/Makefile作为所要patch的文件。
patch
-p
-R
mockbuild
总结:操作步骤
1、获取并编译内核
useradd mockbuild
rpm -ivh kernel-2.6.32-431.5.1.x86_64.el6.src.rpm
cd rpmbuild/SOURCES
tar linux-2.6.32-*.tar.gz -C /usr/src
cd /usr/src
ln -sv
2、给内核打补丁
tar xf netfilter-layer7-v2.23.tar.bz2
cd /usr/src/linux
patch -p1 < /root/netfilter-layer7-v2.23/kernel-2.6.32-layer7-2.23.patch
cp /boot/config-* ?.config
make menuconfig
按如下步骤启用layer7模块
Networking support → Networking Options →Network packet filtering framework → Core Netfilter Configuration
<M> ?“layer7” match support
3、编译并安装内核
make
make modules_install
make install
4、重启系统,启用新内核
5、编译iptables
tar xf iptables-1.4.20.tar.gz
cp /root/netfilter-layer7-v2.23/iptables-1.4.3forward-for-kernel-2.6.20forward/* /root/iptables-1.4.20/extensions/
cp /etc/rc.d/init.d/iptales /root
cp /etc/sysconfig/iptables-config /root
rpm -e iptables iptables-ipv6 --nodeps
./configure ?--prefix=/usr ?--with-ksource=/usr/src/linux
make && make install
cp /root/iptables /etc/rc.d/init.d
cp /root/iptables-config /etc/sysconfig
6、为layer7模块提供其所识别的协议的特征码
tar zxvf l7-protocols-2009-05-28.tar.gz
cd l7-protocols-2009-05-28
make install
7、如何使用layer7模块
ACCT的功能已经可以在内核参数中按需启用或禁用。此参数需要装载nf_conntrack模块后方能生效。
net.netfilter.nf_conntrack_acct = 1
l7-filter uses the standard iptables extension syntax
iptables [specify table & chain] -m layer7 --l7proto [protocol name] -j [action]
iptables -A FORWARD -m layer7 --l7proto qq -j REJECT
编译内核:
make menuconfig
make -j #
make modules_install
make install
清理内核源码树:
提示:xt_layer7.ko依赖于nf_conntrack.ko模块
?tcp_wrapper:tcp包装器
对基于tcp协议开发并提供服务的应用程序,提供的一层访问控制工具;基于库调用实现其功能:libwrap
判断某服务是否能够由tcp_wrapper进行访问控制的方法:
(1) 动态编译:ldd命令;
ldd $(which COMMAND) | grep libwrap
(2) 静态编译:strings命令查看应用程序文件,其结果中是否出现了hosts.allow和hosts.deny文件;
strings $(which COMMAND)
注意:超级守护进程xinetd链接到了libwrap.so;
服务基于libwrap完成访问控制的流程:
首先检查/etc/hosts.allow文件中有没有显式授权当前请求者访问:
是:直接授权客户端访问;
否:接着去检查/etc/hosts.deny文件中有没有显式拒绝当前请求者访问:
是:直接拒绝当前请求者的访问;
否:允许请求者访问;
配置文件语法:
daemon_list:client_list [:options]
daemon_list:
(1) 单个应用程序的文件名称,而非服务名;例如vsftpd;
(2) 以逗号分隔的应用程序文件名列表;
例如:sshd, vsftpd
(3) ALL:所有接受tcp_wrapper控制的程序;
client_list:
(1)IP地址或主机名;
(2)网络地址:必须使用完整格式的掩码(172.18.0.0/255.255.0.0),或简短格式的网络地址:例如172.16. 表示172.16.0.0/255.255.0.0;不能使用前缀格式掩码;
(3)ALL:所有主机;
(4)KNOWN(正解与反解一致):UNKNOWN:PARANOID(正反解不匹配):
(5)EXCEPT:除了;
例如:包含172.18网络,除了172.18.100网段,但包含172.18.100.68主机;(双重except代表肯定)
vsftpd: 172.18. EXCEPT 172.18.100.0/255.255.255.0 EXCEPT 172.18.100.68
:options
deny:拒绝,主要用于hosts.allow文件;
allow:允许,主要用于hosts.deny文件;
spawn:启动指定的应用程序;
例如:sshd: ALL :spawn /bin/echo $(date) login attempt from %c to %s, %d >> /var/log/sshd.log
可使用的扩展:
%c: client ip
%s: [email protected]_ ip
%d: daemon name
%p:daemon process id
获取所有帮助信息手册:man hosts_access
例如:vsftpd仅开放给172.16.0.0/255.255.0.0中的主机访问;
? sshd仅开放给172.16.0.0/255.255.0.0中的主机访问,但是不包含172.16.100.6;
/etc/hosts.allow:
sshd: 172.16. ?EXCEPT ?172.16.100.6
vsftpd: 172.16.
/etc/hosts.deny:
sshd: ALL
vsftpd:ALL
iptables/netfilter、?tcp_wrapper
原文地址:http://blog.51cto.com/11476314/2159912