防火墙 — iptables 打补丁layer7—重新编译内核

  很多人认为iptables就是防火墙,其实这是片面的,Linux的防火墙其实是由netfilter和iptables组成的。

  我会简单的阐述这两个组件的含义:

  netfilter也叫内核空间,它其实是内核的一部分,工作在内核空间。那它干嘛的呢,简单的说,netfilter就是定义那些规则是如何实行的(规则是在内核中实现的)。

  iptables那就叫用户空间了,netfilter定义好了哪个规则有哪样的作用,那就交给用户空间的iptables用来操作了。netfilter只是负责翻译。

  如此看来,我们能操作的也就是用户空间iptables了。

  姑且我们讲iptables就看做是一个软件,因为本人是通过RPM安装的,所以可以通过rpm -ql iptables来查看iptables软件包安装所生成的文件都有那些。

  [root@station153 ~]# rpm -ql iptables  查看安装生成的文件

  /bin/iptables-xml-1.4.7

  /etc/rc.d/init.d/iptables  iptables对应的启动服务

  /etc/sysconfig/iptables-config 对应的开机要配置参数

  /lib64/libip4tc.so.0-1.4.7  iptables所需的库文件

  /lib64/xtables

  /lib64/xtables/libipt_CLUSTERIP.so

  /sbin/iptables-1.4.7    iptables的启动程序

  /sbin/iptables-multi-1.4.7

  /sbin/iptables-restore-1.4.7   iptables的重载规则程序

  /sbin/iptables-save-1.4.7        iptables的保存规则的程序

  /usr/share/doc/iptables-1.4.7    iptables相关文档

  /usr/share/doc/iptables-1.4.7/COPYING

  /usr/share/doc/iptables-1.4.7/INCOMPATIBILITIES

  /usr/share/doc/iptables-1.4.7/INSTALL

  /usr/share/man/man8/iptables-1.4.7.8.gz   man文档

  当然并不是生成只有这么多的文件,因为篇幅的原因,我只是复制了各种类型的文件出来已做解释。

  了解完这些后,就去看看具体怎么使用了,当然软件都是看其怎么使用的。

  先说说规划,我先将所以的命令和解释都写出来,然后通过举例子来演示他们的用法,这样子能够在全局上有个了解。

  当然,中间还会穿插一些笔者自己不太清楚的东西,这样能够为那些在网络方面基础也不好的同学来个巩固。

  防火墙种类:

  主机防火墙     网络防火墙

  iptables中有四表五链:

  四表:filter  nat   mangle raw                    五链:INPUT OUTPUT FORWARD PREROUTING POSTROUTING

  表是按照数据包的不同操作区分的,按优先级顺序为raw,mangle,nat,filter

  raw :一般是为了不再让iptables做数据包的链接跟踪处理,提高性能

  mangle:用于对数据包相关字段的修改,如设置TOS、TTL

  nat :只用于NAT转换时的访问控制

  filter:默认表,用于一般的过滤

  链是按处理过程的hook点进行划分的,类似时间先后,有以下几种链:

  PREROUTING :路由之前,进入防火墙之后

  INPUT :路由之后目的地为本机

  FORWARDING :路由之后目的地不为本机

  OUTPUT :本机产生,向外转发

  POSTROUTIONG:发送到网卡接口之前

  filter表中,只有INPUT  OUTPUT FORWARD

  因为其过滤封包或者数据包,只能过滤进入本机或者从本机出去的(人家转发的数据封包你不能随便的给人家过滤吧)

  nat表中,只有 PREROUTING POSTROUTING OUTPUT

  iptables <-t 表名> <操作 链> <一级参数 [二级参数]> <-j 行为 [参数]>

  Iptables [-t tables] -A/-R/-I chain -i/-o/-s/-d/-p tcp.udp.icmp –dport/–sport PORT -m time/multiport/iprange/state –> ESTABLESHED RELEAVED NEW  -j ACCEPT DROP return REJECT SNAT DNAT

  iptables [-t table] -N chain 创建一条新链

  //例如:iptables -N chainA 创建一个名为chainA的新表

  -D chain 删除一条已有链中的规则,可以输入完整规则,或直接指定规则编号加以删除(常用)

  iptables -D INPUT –dport 80 -j DROP //删除INPUT链中匹配的规则

  iptables -D INPUT 1 //删除INPUT链第一条规则

  -E old_chain new_chain

  //例如: iptables -E filterA filterB 讲filterA改名为filterB

  -R 替换某条规则,规则被替换并不会改变顺序,必须要指定替换的规则编号

  //例如:  iptables -R INPUT 1 -s 192.168.1.1 -j ACCEPT  替换INPUT链中的第一行规则

  -I 在指定规则编号处插入一条规则,原本该位置上的规则将会往后顺序移动,如果没有指定规则编号,则在第一条规则前插入(常用)

  //例如:  iptables -I INPUT 1 -s 192.168.1.1 -j ACCEPT  在filter表的INPUT链中加入这个一条规则

  -F:清空所选的链。如果没有指定链,则清空指定表中的所有链。如果什么都没有指定,就清空默认表所有的链。

  //例如: iptables -F INPUT //清空filter表中INPUT链中的所以规则

  -Z:将指定链中的数据包计数器和流量计数器归零

  //例如: iptables -Z INPUT //清空INPUT链中的计数器

  -X:后接名称,删除自定义链。如果没有给出参数,这条命令将会删除默认表所有非内建的链。

  -P:设置默认策略

  iptables -P INPUT DROP //设置表filter的INPUT链的默认策略为DROP

  一级参数:这一栏可以多个参数并存

  -i:后接网卡名,指定数据表从哪块网卡输入,要和INPUT链配合,如ppp0、eth0,查询网卡名:ifconfig

  -o:后接网卡名,指定数据表从哪块网卡输出,要和OUTPUT链配合同上

  -s:后接源IP或子网,表示数据包的源IP是否相同或在此网段,可加!,表示指定之外的网段

  -d:后接目的IP或子网,表示数据包的目的IP是否相同或者在此网段1

  -p:后接协议名,该协议是封装在IP中的,常见有TCP、UDP、ICMP,具体请查看/etc/protocols,all代表全部协议

  如果接的是tcp、udp、icmp,他们还有二级参数

  //tcp:根据tcp相关信息进行过滤,详见iptables -p tcp -h

  –sport:后接源端口号或服务名,具体查看/etc/services,可以接多端口,如1024:65535

  –dport:后接目的端口号服务名,同上

  –tcp-flags:后接A B,A表示标记范围标记之间用逗号隔开;B表示已设置的标记位,标记有SYN | ACK | FIN | RST | URG | PSH

  –syn:后不接参数,作用同iptables -p tcp –tcp-flags SYN,RST,ACK SYN 过滤由外到内的TCP连接请求

  //udp:根据tcp相关信息进行过滤,详见iptables -p udp -h

  –sport:后接源端口号或服务名,具体查看/etc/services,可以接多端口,如1024:65535

  –dport:后接目的端口号服务名,同上

  //icmp:根据tcp相关信息进行过滤,详见iptables -p icmp -h

  –icmp-type:后接icmp报文类型名或对应值

  -m:后接外挂模块,外挂模块就是根据其他的维度来对数据进行过滤,常见的有state、mac、limit

  不同的模块有他们自己的二级参数

  //state:根据状态匹配机制进行过滤,几乎适用于所有的协议,包括那些无状态的协议,如UDP和ICP

  –state:后接状态类型,状态类型有INVALID、ESTABLISHED、NEW、RELATED

  //multiport:根据多端口进行过滤,其实这个和–sport上面多端口差不多,同时用以第一个出现起作用,感觉有点鸡肋

  –source-port:后接端口号,多个用逗号隔开,如3,34-36

  –destination-port:同上

  –port:后接端口号,适用于源和目的端口号一致的连接

  //limit:根据包的速率进行过滤

  –limit:后接速率,设置最大平均匹配速率,格式如:1/second、12/minute、3/hour 7/day

  –limit-burst:后接数值,设定峰值,超出则抛弃

  //mac:根据mac地址进行过滤

  –mac-source:后接MAC地址XX:XX:XX:XX:XX:XX,只适用于以太口和PREROUTING,FORWARD 和INPUT链

  //mark:根据数据包标记进行过滤

  –mark:后接数值或数值和掩码,如1,2/3,如果有掩码,则将两数进行与操作,最大4个字节,即2^32-1,设置详见MARK动作

  //owner:根据包生成者进行过滤,只适用于OUTPUT链,可以是启动进程的用户的ID,或用户所在的组的ID,或进程的ID,或会话的ID

  –uid-owner:后接UID,按生成包的用户的ID来匹配外出的包

  –gid-owner:后接GID,按生成包的用户所在组的ID来匹配外出的包

  –pid-owner:后接PID,按生成包的进程的ID来匹配外出的包

  –sid-owner:后接SID,按生成包的会话的ID来匹配外出的包

  //tos:根据IP头部中TOS字段进行过滤

  –tos:后接16进制数值,详情使用iptables -m tos -h查询

  //ttl:根据IP报文中TTL字段进行过滤

  –ttl:后接TTL

  行为:Target和Jump。Target就是下面要讲的链的操作,JUMP会指定链名,然后转调到该链,进行链中其他操作,如

  iptables -A INPUT -p tcp -j ABCD //转跳到自定义的ABCD链

  —————–如果在ABCD子链中未匹配任何规则,则会转到父链INPUT,继续INPUT链后面的规则匹配———————

  如果在ABCD子链中匹配了一条规则,也就说明父链INPUT匹配,然后跳到INPUT的下一条链。

  Target有如下分类:

  1、ACCEPT:接受数据表

  2、DROP:拒绝数据表

  3、REJECT:作用同DROP,并将错误信息返回给信息发送方,只能用在INPUT、FORWARD、OUTPUT和它们的子链里

  –reject-with:tcp-reset

  4、TOS:改变IP头部中的TOS字段,只能在mangle表内使用,它后面要接参数

  –set-tos:后接数值0-255或者0x00-0xFF

  5、TTL:改变IP头部中的TTL字段,只能在mangle表内使用,他后面要接参数

  –ttl-set:后接数值,作用是设置ttl的值

  –ttl-dec:后接数值,作用是在原TTL基础上减去这个数值

  –ttl-inc:后接数值,作用是在原TTL基础上加上这个数值

  6、MARK:给数据包打上标记,用于高级路,其实并不是修改报文,而是在包穿越计算机的过程中由内核分配的和它相关联的一个字段

  只用于mangle表,它后面要接参数

  –set-mark:后接无符号整数,用于标记

  7、SNAT:改变数据表源地址,只用于nat表的PREROUTING和OUT链和它们的子链里,它后面要接参数

  –to-source:后接改变后的源地址

  8、DNAT:改变数据包目的地址,只用于nat表的PREROUTING和OUT链和它们的子链里,它后面要接参数

  –to-destination:后接改变后的目的地址

  9、MASQUERADE:基于端口的NAT,只用于nat表的POSTROUTING链和它的子链里,它后面可接参数

  –to-ports:后接端口号,如1024-65535

  10、LOG:记录行为,存在/var/log/messages,它后面可接参数

  –log-level:后接信息级别,级别有debug,info,notice,warning,warn,err,error,crit,alert, emerg,panic

  –log-prefix:后接"STRING",告诉iptables在记录的信息之前加上指定的前缀

  –log-tcp-sequence:把包的TCP序列号和其他日志信息一起记录下来

  –log-tcp-options:记录TCP包头中的字段大小不变的选项

  –log-ip-options:记录IP包头中的字段大小不变的选项

  11、REDIRECT:后接重定向端口,它后面要接参数,只能用在nat表的    PREROUTING、OUTPUT链和被它们调用的自定义链里

  –to-ports:后接端口号

  12、RETURN:返回上一级链,子链 -> 父链 -> 默认策略

  13、NOTRACK:跳过追踪,只用于raw表,当行为为NOTRACK,则跳过后面所有的链

  iptables-save > /path/to/somefile  将内存中生效的规则保存到一个文件中

  iptables-restore > /path/to/somefile  恢复由iptables-save保存文件中的规则到内存

  //拒绝192.168.1.0/24端口1024到65535程序从eth0网卡访问本机SSH服务

  iptables -A INPUT -i eth0 -p tcp -s 192.168.1.0/24 –sport 1024:65534 –dport ssh -j DROP

  //SNAT示例:从eth0口出去的包将数据包的源地址改成192.168.1.10到192.168.1.20这个范围

  iptables -t nat -A POSTROUTING -o eth0 -j SNAT –to-source 192.168.1.10-192.168.1.20

  //DNAT示例:外网访问80端口都转到192.168.100.10这台主机上

  iptables -t nat -A PREROUTING -i eth0 -p tcp –dport 80 -j DNAT –to-destination 192.168.100.10:80

  //MASQUERADE示例:将192.168.1.0/24内的主机进行基于端口的NAT转换

  iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE

  //重定向端口,仅适用于nat:PREROUTING和OUTPUT链上

  iptables -t nat -A PREROUTING -p tcp –dport 80 -j REDIRECT –to-ports 8080

  相关注意事项:

  iptables -t nat -A POSTROUTING -o ppp0 -s 192.168.0.0/24 -j MASQUERADE

  MASQUERADE和SNAT作用一样哈~同样是提供源地址转换的操作,但是MASQUERADE是针对外部接口为动态IP地址来设置滴,不需要使用–to-source指定转换的IP地址。如果网络采用的是拨号方式接入互联网,而没有对外的静态IP地址(主要用在动态获取IP地址的连接,比如ADSL拨号、DHCP连接等等),那么建议使用MASQUERADE哈~

  注意:MASQUERADE是特殊的过滤规则,其只可以映射从一个接口到另一个接口的数据哈

  做了NAT之后要是拒绝谁访问的话,就要用到过滤filter上的forward了,不给被拒绝的IP做转发。

  端口映射:

  Iptables -t nat -A PREROUTING -d 172.16.251.153 -p tcp –dport 22022 -j DNAT –to-destination 192.168.100.2:22

  如果你去连接172.16.251.153的22022端口,就会被转换成为192.168.100.2的22号端口

  iptables实现七层访问过滤:

  对内核中的netfilter,打补丁layer7,重新编译内核

  获取内核源码 https://www.kernel.org

  内核编译安装是基于 mockbuild 这个用户的,所以要先创建这个账户:

  编译内核:

  [root@station153 ~]# useradd mockbuild

  [root@station153 ~]# rpm -ivh kernel-2.6.32-431.5.1.el6.src.rpm

  warning: kernel-2.6.32-431.5.1.el6.src.rpm: Header V3 RSA/SHA256 Signature, key ID fd431d51: NOKEY

  1:kernel                 ########################################### [100%]

  [root@station153 ~]# cd rpmbuild/SOURCES/

  [root@station153 SOURCES]# ls

  check-kabi                config-powerpc64             config-x86_64-debug               Makefile.common

  config-debug              config-powerpc64-debug       config-x86_64-debug-rhel          Makefile.config

  config-debug-rhel         config-powerpc64-debug-rhel  config-x86_64-generic             merge.pl

  config-framepointer       config-powerpc64-kdump       config-x86_64-generic-rhel        Module.kabi_greylist_i686

  config-generic            config-powerpc64-kdump-rhel  config-x86_64-nodebug             Module.kabi_greylist_ppc64

  config-generic-rhel       config-powerpc64-rhel        config-x86_64-nodebug-rhel        Module.kabi_greylist_s390x

  config-i686               config-powerpc-generic       config-x86-generic                Module.kabi_greylist_x86_64

  config-i686-debug         config-powerpc-generic-rhel  config-x86-generic-rhel           Module.kabi_i686

  config-i686-debug-rhel    config-s390x                 extrakeys.pub                     Module.kabi_ppc64

  config-i686-nodebug       config-s390x-debug           find-provides                     Module.kabi_s390x

  config-i686-nodebug-rhel  config-s390x-debug-rhel      genkey                            Module.kabi_x86_64

  config-i686-rhel          config-s390x-generic-rhel    kabitool                          perf

  config-ia64-generic-rhel  config-s390x-kdump           kernel-abi-whitelists.tar.bz2     perf-archive

  config-nodebug            config-s390x-kdump-rhel      linux-2.6.32-431.5.1.el6.tar.bz2

  config-nodebug-rhel       config-s390x-rhel            linux-kernel-test.patch

  [root@station153 SOURCES]# tar xf kernel-abi-whitelists.tar.bz2 -C /usr/src/

  [root@station153 usr]# cd src/

  [root@station153 src]# ls

  debug  kabi-rhel60  kabi-rhel61  kabi-rhel62  kabi-rhel63  kabi-rhel64  kabi-rhel65  kernels

  [root@station153 src]# cd kernels/

  [root@station153 kernels]# ls

  2.6.32-431.el6.x86_64

  [root@station153 kernels]# ln -sv 2.6.32-431.el6.x86_64 linux

  `linux' -> `2.6.32-431.el6.x86_64'

  [root@station153 kernels]# cd linux/

  [root@station153 linux]# ls

  arch   crypto   firmware  include  ipc     lib       Makefile.common  Module.symvers  samples  security  System.map  usr

  block  drivers  fs        init     kernel  Makefile  mm               net             scripts  sound     tools       virt

  [root@station153 linux]# cp /boot/config-2.6.32-431.el6.x86_64 .config

  [root@station153 linux]# cd ~

  [root@station153 ~]# ls

  anaconda-ks.cfg      bind-9.9.5.tar.gz       kernel-2.6.32-431.5.1.el6.src.rpm  Python-3.4.0         rpmbuild

  bind10-1.1.0         Discuz_X2.5_SC_GBK.zip  netfilter-layer7-v2.23.tar.bz2     Python-3.4.0.tar.xz

  bind10-1.1.0.tar.gz  install.log             phpwind_UTF8_8.5                   readme

  bind-9.9.5           install.log.syslog      phpwind_UTF8_8.5.zip               Readme–?+?.htm

  [root@station153 ~]# tar xf netfilter-layer7-v2.23.tar.bz2

  [root@station153 ~]# ls

  anaconda-ks.cfg      bind-9.9.5.tar.gz       kernel-2.6.32-431.5.1.el6.src.rpm  phpwind_UTF8_8.5.zip  Readme–?+?.htm

  bind10-1.1.0         Discuz_X2.5_SC_GBK.zip  netfilter-layer7-v2.23             Python-3.4.0          rpmbuild

  bind10-1.1.0.tar.gz  install.log             netfilter-layer7-v2.23.tar.bz2     Python-3.4.0.tar.xz

  bind-9.9.5           install.log.syslog      phpwind_UTF8_8.5                   readme

  [root@station153 ~]# cd netfilter-layer7-v2.23

  [root@station153 netfilter-layer7-v2.23]# ls

  CHANGELOG  iptables-1.4.3forward-for-kernel-2.6.20forward  kernel-2.6.32-layer7-2.23.patch  README

  下来要给内核打补丁,让内核支持 netfilter-layer7,一会直接编译进内核

  1

  [root@station153 linux]# patch -p1 < /root/netfilter-layer7-v2.23/kernel-2.6.32-layer7-2.23.patch

  wKiom1M2rADTpfQYAAMO2jlNe1U103.jpg

  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

  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 -i eth1 -m layer7 –l7proto qq -j REJECT

  注意:

  网络防火墙:ip_forward

  net.netfilter.nf_conntrack_acct参数只有装载nf_conntrack模块后方能生效

发表评论

邮箱地址不会被公开。 必填项已用*标注