iptables/netfilter、?tcp_wrapper

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

时间: 2024-10-10 11:57:54

iptables/netfilter、?tcp_wrapper的相关文章

Linux数据包路由原理、Iptables/netfilter入门学习

相关学习资料 https://www.frozentux.net/iptables-tutorial/cn/iptables-tutorial-cn-1.1.19.html http://zh.wikipedia.org/wiki/Netfilter http://www.netfilter.org/projects/iptables/ http://linux.vbird.org/linux_server/0250simple_firewall.php http://linux.vbird.o

Linux防火墙iptables/netfilter(二)

上一篇文章我们说了一些iptables/netfilter的基础知识,本文我们来介绍一下iptables的规则编写.Iptables的规则可以概括的分为两个方面:1.报文的匹配条件:2.匹配到后的处理动作.其中匹配条件分为基本匹配条件和扩展匹配条件,处理动作分为内建处理机制和自定义处理机制.这里需要注意的一点是,自定义处理机制(自定义链)不在内核中所以报文是不会经过自定义链的,它只能被内建机制引用即当做处理的子目标. Iptables说白了就是一个规则管理工具,用于生成.检查和自动实现规则.规则

Linux防火墙iptables/netfilter(一)

防火墙大家都不陌生,或者说都听说过,现实中的防火墙是将一个区域内的火隔离开来使之不蔓延到另一个区域,计算机领域的防火墙与之功能类似,也是为了隔离危险.在如今广阔的互联网领域内,我们一般会相信一个叫做"黑暗森林"的法则.对于这个法则大家可以去搜索一下,它是在<三体>系列小说中写出来的,大致意思是在黑暗丛林中我们无法判断对方对自己是否有恶意, 对方也无法判断我们是否有恶意,所以一见面就把对方灭掉.互联网中的恶意攻击者太多了,我们无法确定它们都是水更无法把它们灭掉,但是我们可以把

IPtables/NetFilter

前提知识 任何主机若要与非同网络中的主机通信,则必须将报文发送到默认网关: 对Linux而言,IP地址是属于主机(内核中)的,不属于网卡,只要属于当前主机的IP地址间,都可直接响应,不称为转发 私有地址在路由器上是不允许被路由的 防火墙的类型与作用的链 主机防火墙:一般使用INPUT,OUTPUT链来过滤进入和发出的报文 网络防火墙:一般使用PREROUTING,FORWARD,POSTROUTING链来转发经过的报文 命令参数 : iptables [-t 表] -命令 匹配   操作说明(1

iptables/netfilter基于layer7实现应用层过滤

前言 做为网络管理员,对P2P.QQ.酷狗等软件是又爱又恨,大多数公司为了提高工作效率,禁止公司员工登陆QQ.看视频等,在市场上买专门的上网行为管理设备,随便一种都是价格不菲,而使用linux来做网关一样可以禁止qq.酷狗等软件,为实现此功能就需要为iptables/netfilter添加layer7模块,而iptables/netfilter是基于内核的,所以需要重新编译内核. 编译过程 环境介绍 系统环境:CentOS6.6 所需源码包:kernel-2.6.32-504.16.2.el6.

CentOS 7下 iptables/netfilter使用详解(一)

一.理论部分  1.什么是防火墙? 防火墙:(英文:Firewall),隔离工具 防火墙其实就是一个组件,这个组件能够屏蔽来自于互联网,或来自于企业内部的用户的攻击操作(DDos攻击,端口扫描等等):主要目的是防范非授权的访问的!它工作于网络或主机的边缘(通信报文的进出口),对于进出本网络或主机的报文根据事先定义的检查规则做匹配检测,对于能够被规则匹配到的报文做出相应处理,时刻检查出入防火墙的所有数据包,决定拦截或是放行哪些数据包. 它需要对我们主机上的或者是网络内的所有主机上的网络通信操作做一

Centos7 iptables/netfilter 详解

iptables/netfilter netfilter:在Linux内核中的一个软件框架,用于管理网络数据包.不仅具有网络地址转换(NAT)的功能,也具备数据包内容修改.以及数据包过滤等防火墙功能.利用运作于用户空间的应用软件,如iptable等,来控制Netfilter,系统管理者可以管理通过Linux操作系统的各种网络数据包 iptables:一个运行在用户空间的应用软件,通过控制Linux内核netfilter模块,来管理网络数据包的流动与转送.在大部分的Linux系统上面,iptabl

Linux防火墙iptables/netfilter(三)

我们前面两篇已经把iptables介绍的比较充分了,今天来说一个iptables对layer 7的实践.我们说过iptables/netfilter工作在内核空间是不支持应用层协议的,但是诸如QQ.MSN.迅雷等应用我们是无法在传输层或者网络层完全封闭它们的,因为它们非常狡猾发现自己的端口被封掉之后会用其它打开的端口进行传输数据,所以只有在7层中封闭它们才行.所以有人就针对这种情况对iptables/netfilter进行了二次开发,写了一些补丁,我们打上这些补丁可以使iptables支持7层协

Linux系统中的防火墙的实现:iptables/netfilter

防火墙:包括软件防火墙(基于iptables/netfilter的包过滤防火墙)和硬件防火墙,在主机或网络边缘对经由防火墙的报文以一定条件进行检测过滤的一系列组件. Linux系统中的防火墙的实现:利用iptables/netfilter既可以实现主机防火墙(安全服务范围仅限于当前某台主机),又可以实现网络防火墙(安全服务范围为当前局域网).netfilter:Linux系统内核中防火墙的框架,防火墙功能实现的主体:iptables:为netfilter编写数据传输的匹配规则的用户空间中的应用程