Linux iptables配置应用

                Linux iptables配置应用

概述:

   Linux的防火墙体系主要工作在网络层,只对tcp/ip数据包实施过滤和限制,属于典型的包过滤防火墙(或称为网络层防火墙)。Linux的防火墙体系基于内核编码实现,因此具有非常好的性能和效率,因此被更加广泛的采纳和应用。

 

Iptables

  Firewall:隔离工具;Packets Filter Firewall;工作于主机或网络的边缘,对经由的报文根据预先定义的规则(匹配条件)进行检测,对于能够被规则匹配到的报文实行某预定义的处理机制的一套组件。

   硬件防火墙:在硬件级别实现部分功能的防火墙;另一个部分功能基于软件实现;

   软件防火墙:应用软件处理逻辑运行于通用硬件平台之上的防火墙;

   主机防火墙:服务范围为当前主机;

   网络防火墙:服务范围为防火墙背后的局域网;

 

iptables/netfilter

   netfilter:防火墙框架,framework;位于内核空间;

   iptables:命令行工具程序,位于用户空间;规则管理工具;

 

netfilter

hooks function (钩子函数)

prerouting

input

forward

output

postrouting

 

iptables的五个链:

CHAINS:链

PREROUTING:在对数据包作路由选择之前,应用此链中的规则。

INPUT:当接收到访问防火墙本机地址的数据包(入站)时,应用此链中的规则。

FORWARD :当接收到需要通过防火墙发送给其它主机地址的数据包(转发)时,应用此链中的规则。

OUTPUT:当防火墙本机向外发送数据包(出站)时,应用此链中的规则。

POSTROUTING:在对数据包作路由选择之后,应用此链中的规则。

 

数据报文流向:

到本机某进程的报文:PREROUTING –> INPUT

由本机转发的报文:PREROUTING –> FORWARD –> POSTROUTING

由本机的某进程发出报文:OUTPUT –> POSTROUTING

blob.png

iptables四个表(tables):

  filter:过滤,防火墙;

  natnetwork address translation,网络地址转换;

  mangle:拆解报文,做出修改,并重新封装;

  raw:关闭nat表上启用的连接追踪机制;

 

iptables四个表的优先级顺序(由高到低):

  raw –> mangle –> nat –> filte

 

iptables四个表各自所对应的链:

rawPREROUTINGOUTPUT

manglePREROUTINGINPUTFORWARDOUTPUTPOSTROUTING

natPREROUTINGINPUTOUTPUTPOSTROUTING

filterINPUTFORWARDOUTPUT

 

iptables规则的组成部分:

匹配条件:

  网络层首部:Source IP, Destination IP

传输层首部:Source Port, Destination Port

  扩展检查机制:需要借助于扩展模块进行指定的匹配条件

处理动作:target

ACCEPTDROPREJECT

 

配置iptables规则条件前操作:

netfilter:位于内核中的tcp/ip协议栈报文处理框架;

iptables

CentOS 5/6iptables命令编写规则;

    # iptables -t filter -F  //清空防火墙规则

   # service iptables save

CentOS 7firewalldfirewall-cmd, firewall-config

   # systemctl disable firewalld  //重启后,防火墙不会自动启动

程序包:iptablesiptables包名;

        iptstateiptables依赖包,状态追踪机制包;

 

iptables命令匹配条件:

规则:根据指定的匹配条件来尝试匹配每个流经此处的报文,一旦匹配成功,则由规则后面指定的处理动作进行处理;

匹配条件:

  基本匹配条件:源地址,目标地址,传输层协议

  扩展匹配条件:需要借助于扩展模块进行指定的匹配条件

隐式扩展:已经在基本匹配条件中指明的协议相关的扩展;

显式扩展:隐式扩展之外的其它扩展匹配条件;

  处理动作:

基本动作:ACCEPTDROP

扩展动作:需要借助于扩展模块进行,但无须显式指定,仅需指明动作;

添加规则时需要考量的问题:

(1) 报文流经的位置:用于判断将规则添加至哪个链;

(2) 实现的功能:用于判断将规则添加至哪个表;

(3) 报文的方向:用于判断哪个为“源”,哪个为“目标”;

(4) 匹配条件:用于编写能够正确匹配目标报文的规则;

 

规则管理格式:iptables [-t able] COMMAND chain cretieria [-m -m matchname [per-match-options]]  [-j targetname [per-target-options]]

   -t table:指明要管理的表; 默认为filter

 

COMMANDS

链管理控制选项:

-P:定义链的默认策略;其target一般可使用ACCEPTREJECTDROP

    示例:[root@centos7 ~]# iptables -P INPUT DROP

    -N:自定义规则链;仅在默认链通过某规则进行调用方可生效;因此,每个自定义链都有其引用记数;

    -X:删除自定义的空的引用计数为0的链;

-F:清空指定的链,或删除指定链上的规则 ;

-E:重命名自定义的引用计数为0的链;

-Z:清空指定链上的计数器。

 

链规则选项:

-A:追加规则到指定的链尾部;

     -I:插入规则到指定的链中的指定位置,默认为链首;

-D:删除指定的链上的指定规则;

-R,将指定的链上的指定规则替换为新的规则;    

 

查看链规则选项:

-Llist, iptables [-t table] -L [chain [rulenum]] [options…]

-n:数字格式;

-vverbose,详细格式信息;

-V:查看iptables命令工具的版本信息;

–line-numbers:显示链上的规则的编号;

-xexactly,显示计数器的精确值;

计数器:

每条规则以及链的默认策略分别有各自的两个计数器:

  (1) 匹配到的报文的个数:pkts

  (2) 匹配到的所有报文的大小之积:bytes

 

匹配条件:

基本匹配条件

扩展匹配条件

   隐式扩展

   显式扩展

注意:多重条件之间的隐含逻辑为“与”操作;

基本匹配条件:

[!] -s :检查报文中的源IP地址是否符合此处指定的地址或地址范围;

[!] -d :检查报文中的目标IP地址是否符合此处指定的地址或地址范围;

[!] -p :检查报文中传输层的协议类型,支持tcp, udp,  udplite, icmp,  icmpv6,esp,  ah, sctp, mh,或者 "all"

[!] -i :检查报文进入本机时的接口是否符合本处指定的接口;INPUT, FORWARD  and  PREROUTING

[!] -o:检查报文即将离开本机时经由的接口是否符合本处指定的接口;FORWARD, OUTPUT and POSTROUTING

-m, –match match:显式指明要使用的扩展模块;

-j, –jump target:跳转目标;匹配条件:

 

示例:

  在本机防火墙上只开启本地网络pingicmp)协议的报文通过:

  iptables  -t filter -A INPUT -j DROP

  iptables  -t filter -A OUTPUT -j DROP

  iptables  -t filter -I INPUT -s 192.168.3.0/24 -d 192.168.3.5 -p icmp –icmp-type 8 -j ACCEPT

  iptables  -t filter -I OUTPUT -s 192.168.3.5 -d 192.168.3.0/24 -p icmp –icmp-type 0/ -j ACCEPT

 

示例:

  在本机防火墙上只开启pingicmp)本地网络中其他主机的报文通过:

  iptables  -t filter -A INPUT -j DROP

  iptables  -t filter -A OUTPUT -j DROP

  iptables -I INPUT -s 192.168.3.0/24 -d 192.168.3.5  -p icmp –icmp-type 0 -j ACCEPT

  iptables -I OUTPUT -s 192.168.3.5 -d 192.168.3.0/24 -p icmp –icmp-type 8 -j ACCEPT

 

示例:

 在本机防火墙只开启本地网络openssh远程登录:

 iptables  -t filter -A INPUT -j DROP

 iptables  -t filter -A OUTPUT -j DROP

 iptables -I INPUT -s 192.168.3.0/24 -d 192.168.3.5 -p tcp –dport 22 -j ACCEPT

 iptables -I OUTPUT -s 192.168.3.5 -d 192.168.3.0/24 -p tcp –sport 22 -j ACCEPT

 

扩展匹配条件:

   隐式扩展:不用-m选项明确给出要使用的扩展机制的扩展;此处主要指使用-p {tcp|udp|icmp}给定协议后可直接对给定的协议所进行的扩展;

 -p tcp:可直接使用tcp协议对应的扩展选项;

 [!]–sport port[:port]:匹配报文中的传输层的源端口;可给出多个连接的端口;

 [!] –dport port[:port]:匹配报文中的传输层的目标端口;可给出多个连接的端口;

 [!] –tcp-flags mask comp

SYNACKFINRSTURGPSH

mask:要检查的标志位列表,以逗号分隔,例如SYN,ACK,FIN,RST

compmask给定的众标志位中,其值必须为1的标志位列表,余下的必须为0

–tcp-flags SYN,ACK,FIN,RST SYN

 [!] –syn:相当于–tcp-flags SYN,ACK,FIN,RST SYN

-p udp:可直接使用udp协议对应的扩展选项

 [!] –sport port[:port]:匹配报文中的传输层的源端口;可给出多个连接的端口;

 [!]–dport port[:port]:匹配报文中的传输层的目标端口;可给出多个连接的端口;

-p icmp:可直接使用icmp协议对应的扩展选项;

 [!] –icmp-type {type[/code]|typename}

   –icmp-type 8/0:匹配ping请求报文

 –icmp-type  0/0:匹配对ping请求的响应报文

 

显式扩展:必须使用-m选项给出matchname的扩展,而且有些扩展都还存在专用选项;

 1multiport

   以离散或连续的方式定义的多端口匹配条件; Up  to 15 ports can be specified.

[!] –sports port[,port|,port:port]…:指定多个源端口;

[!] –dports port[,port|,port:port]…:指定多个目标端口;

[!] –ports port[,port|,port:port]…:匹配此处指定的源或目标端口;

 

 示例:

   只开放本机防火墙的222380端口给本地网络访问:

   iptables -A INPUT -j DROP

iptables -A OUTPUT -j DROP

iptables -I INPUT -d 192.168.3.5 -p tcp -m multiport –dports 22,23,80,9000.3306 -j ACCEPT

    iptables -I OUTPUT -s 192.168.3.5 -p tcp -m multiport –sports 22,23,80,9000.3306 -j ACCEPT

2iprange

   以连续的ip地址范围指明多地址匹配条件;

[!] –src-range from[-to]

[!] –dst-range from[-to]

   示例:

   -m iprange –src-range 192.168.3.10-192.168.3.20

   -m iprange –dst-range 192.168.3.10-192.168.3.20

3string

  对报文中的应用层数据做字符串匹配检测;

[!] –string pattern

[!] –hex-string pattern

–algo {bm|kmp}:字符串匹配检查算法;

–from offset

–to offset

示例:

  屏蔽掉网站中带有sex”的敏感字符串的响应:

  iptables -A INPUT -j DROP

  iptables -A OUTPUT -j DROP

      iptables -I INPUT -d 192.168.3.5 -p tcp -m multiport –dports 22,23,80 -j ACCEPT

      iptables -I OUTPUT -s 192.168.3.5 -p tcp -m multiport –sports 22,23,80 -j ACCEPT

      iptables -I OUTPUT -p tcp –sport 80 -m string –string "sex" –algo bm -j REJECT    

   4time

   根据报文到达的时间与指定的时间范围进行匹配度检测;

 –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…]

     示例:

       禁止在非工作时间登录防火墙本机telnet服务。

   iptables -A INPUT -j DROP

   iptables -A OUTPUT -j DROP

       iptables -I INPUT  -d 192.168.3.5 -p tcp –dport 23 -m time –weekdays 6,7  -j DROP

       iptables -I INPUT -d 192.168.3.5 -p tcp –dport 23 -m time –timestart 18:00 –timestop 9:00  -j DROP

       iptables -I INPUT -d 192.168.3.5 -p tcp -m multiport –dports 22,23,80 -j ACCEPT

       iptables -I OUTPUT -s 192.168.3.5 -p tcp -m multiport –sports 22,23,80 -j ACCEPT

注意:ntpdate 时间服务器地址,同步时间。

 

  5connlimit

   根据每客户端IP做并发连接数限制,即限制单IP可同时发起连接请求;

–connlimit-upto n:连接数小于等于阈值;

–connlimit-above n:连接数超出阈值;

 

     示例:

       防火墙本机限制ssh服务单ip主机并发连接不能超过3个:

   iptables -A INPUT -j DROP

   iptables -A OUTPUT -j DROP

       Iptables -I INPUT -d 192.168.3.5 -p tcp –dport 22 -m connlimit –connlimit-above 3 -j RJECT

       iptables -I INPUT -d 192.168.3.5 -p tcp -m multiport –dports 22,23,80 -j ACCEPT

       iptables -I OUTPUT -s 192.168.3.5 -p tcp -m multiport –sports 22,23,80 -j ACCEPT

    

      

  ~]# iptables -I INPUT -d 10.1.0.6 -p tcp –dport 22 -m connlimit –connlimit-above 2 -j REJECT

  6limit

 基于收发报文的速率进行匹配;

 –limit rate[/second|/minute|/hour|/day]

     –limit-burst number

 

     示例:

      限制ping防火墙本机为6秒一次:

   iptables -A INPUT -j DROP

   iptables -A OUTPUT -j DROP

       iptables -I INPUT  -d 192.168.3.5 -p icmp –icmp-type 8 -m limit  –limit-burst 5  –limit 10/minute  -j ACCEPT

       iptables -I OUTPUT -s 192.168.3.5 -p icmp –icmp-type 0 -j ACCEPT

     ~]# iptables -A INPUT -d 10.1.0.6 -p icmp –icmp-type 8 -m limit –limit-burst 3 –limit 20/minute -j ACCEPT

 

 7state

状态检测:连接追踪机制(conntrack

NEW:新连接

ESTABLISHED:已建立的连接

RELATED:相关联的连接

INVALID:无法识别的连接,拒绝放行;

UNTRACKED:未被追踪连接;

相关的内核模块:

nf_conntrack

nf_conntrack_ipv4

nf_conntrack_ftp

追踪到的连接:/proc/net/nf_conntrack文件中;

能追踪的最大连接数量定义在:/proc/sys/net/nf_conntrack_max

建议调整至足够大;

不同的协议的连接追踪时长:

/proc/sys/net/netfilter/

 

[!] –state state

如何开放被动模式的ftp服务:

(1) 装载追踪ftp协议的模块;

  # modprobe nf_conntrack_ftp

(2) 放行入站命令连接

# iptables -A INPUT -d SERVER_IP -p tcp –dport 21 -m state –state NEW,ESTABLISHED -j ACCEPT

   (3) 放行入站数据连接

# iptables -A INPUT -d SERVER_IP -p tcp -m state –state RELATED,ESTABLISHED -j ACCEPT

   (4) 放行出站的ESTABLISHED连接

# iptabls -A OUTPUT -s SERVER_IP -m state –state NEW,ESTABLISHED -j ACCEPT

 

 示例:

   在本机防火墙上开放21222380端口服务的访问:

   iptables -A INPUT -j DROP

   iptables -A OUTPUT -j DROP

   iptables -I INPUT -d 192.168.3.5 -m state –state ESTABLISHED,RELATED -j ACCEPT

   iptables -I INPUT 2 -d 192.168.3.5 -p tcp -m multiport –dports 21:23,80 -m state –state NEW  -j ACCEPT

   iptables -I INPUT 3 -d 192.168.3.5 -p icmp –icmp-type 8 -m state –state NEW,ESTABLISHED -j ACCEPT

   iptables -I OUTPUT -s 192.168.3.5 -m state –state NEW,ESTABLISHED -j ACCEPT

 

注意:ftp服务需要手动装载nf_conntrack_ftp连接跟踪ftp协议的模块;

      modprobe  nf_conntrack_ftp

 

 8MAC地址匹配

主要用于检查数据包源MAC地址在,在iptables命令中使用“–mac-source MAC地址”的形式。

例如:拒绝来自MAC地址00:0C:29:7C:0C:37的所有数据包,到本机防火墙。

iptables -I INPUT 4  -d 192.168.3.5 -m mac –mac-source 00:0C:29:7C:0C:37 -j REJECT

 

 

处理动作(跳转目标):

  -j tagetname [per-target-options]

  简单target

  ACCEPTDROP

  扩展target

  REJECTLOG

  –reject-with type

  icmp-net-unreachable, icmp-host-unreachable, icmp-port-unreachable, icmp-proto-unreachable, icmp-net-prohibited, icmp-host-prohibited, or icmp-admin-prohibited,默认为icmp-port-unreachable

  LOG

Turn  on  kernel  logging of matching packets.

–log-level level

     emerg,alert,crit,error, warning, notice, info or debug.

–log-prefix prefix:日志信息的前导信息;

 

示例:注意iptables规则添加的位置

   iptables -I INPUT 2  -d 192.168.3.5 -p tcp –dport 22 -j LOG  –log-prefix "openssh from kernel:"

    

保存和载入规则:

保存:iptables-save > /PATH/TO/SOME_RULE_FILE

重载:iptables-restore < /PATH/FROM/SOME_RULE_FILE

-n, –noflush:不清除原有规则

-t, –test:仅分析生成规则集,但不予提交;

注意:重载文件中的规则,会清除已有规则;

CentOS 6

保存规则:service  iptables  save

保存规则于/etc/sysconfig/iptables,保存操作会清除文件中原有的内容;

重载规则:server iptables restart

默认重载/etc/sysconfig/iptables文件中的规则

脚本配置文件:/etc/sysconfig/iptables-config

         IPTABLES_MODULES=""用于指明要装载的模块;

CentOS 7开机自动生效规则:

(1) firewalld服务;

(2) shell脚本,直接记录iptables命令;

(3) 自定义unit fileinit script

规则优化的思路:

(1) 优先放行双方向状态为ESTABLISHED的报文;

(2) 服务于不同类别的功能的规则,匹配到报文可能性更大的放前面;

(3) 服务于同一类别的功能的规则,匹配条件较为严格的放前面;

(4) 设置默认策略:白名单机制

(a) 可使用iptables -P设定默认策略;

(b) 建议在规则链的最后定义规则做为默认策

 

 Iptables本机防火墙作转发:

   实验环境目的:

   允许内网中的主机去访问外网中的80212223端口服务;

  iptables  -A  FORWARD  -j DROP

  iptables  -I   FORWARD  -m state –state ESTABLISHED,RELATED  -j ACCEPT

  iptables  -I   FORWARD  -s 192.168.3.0/24 -p tcp  -m multiport –dports 21:23 80 -m state –state  NEW  -j ACCEPT

 

 注意:开启本机防火墙上的路由转发功能:

      echo "1" >  /proc/sys/net/ipv4/ip_forward   

      手动装载nf_conntrack_ftp连接跟踪ftp协议的模块;

      modprobe  nf_conntrack_ftp

 

SNAT的配置及应用:

  SNAT只能用于nat表的POSTROUTING链和INPUT链。使用iptables命令设置SNAT策略时,需要结合“SNAT  –to-source  IP地址”选项指定修改后的IP地址。(例如:-j SNAT –to-source 218.29.30.31

 

示例:

iptables -t nat -I POSTROUTING  -s 192.168.3.0/24 -j SNAT –to-source 10.1.0.6-10.1.0.9

 

DNAT的配置及应用:

  DNAT只能用于nat表的PREROUTING链和OUTPUT链,使用iptables命令设置DNAT策略时,需要结合“DNAT  –to-destionation  IP地址”选项指定修改后的IP地址。(例如:-j SNAT –to-destionation 192.168.3.5

 

 示例:

 iptables -t nat -I PREROUTING -d 10.1.0.6  -p tcp –dport 80 -j DNAT –to-destination 192.168.3.5:8080

 

 iptables -t nat -I PREROUTING -d 10.1.0.6  -p tcp –dport 22 -j DNAT –to-destination 192.168.3.6:22

 

REDIRECT端口映射:

  web网站服务器上启用端口映射:

  例如:web网站服务器上监听的是8080端口,IP192.168.3.6

  iptables  -t nat -I PREROUTING -d 192.168.3.6 -p tcp –dport 80 -j REDIRECT  –to-ports 8080

 

MASQUERADE:动态地址转换

  masquerade作用是从服务器的网卡上自动获得当前IP地址做SNAT源地址转换。

  适用于动态获取ip+ADSL拨号则使用

  示例:

   iptables -t nat -A PORTROUTING -s 192.168.3.0/24 -O ppp0 -j MASQUERADE

 

  如此配置的话,不用指定SNAT的目标ip了,不管现在ppp0的出口获得了怎样的动态ipMASQUERADE会自动读取ppp0现在的ip地址然后做SNAT出去,这样就实现了很好的动态SNAT地址转换。

 

用户自定义链:

  iptables -t filter -N icmp_in

  iptables  -I icmp_in -p icmp -j DROP

  Iptables  -I  FORWARD  -s 192.168.3.0/24  -p icmp  -j  icmp_in

 

 删除自定义链:

  1)先删除被引用的链;iptables -D FORWARD 1

  2)清空自定义链中的规则;iptables -F icmp_in

  3)删除自定义链; iptables  -X icmp_in

  

  

原创文章,作者:zhengyibo,如若转载,请注明出处:http://www.178linux.com/59600

(0)
zhengyibozhengyibo
上一篇 2016-11-18
下一篇 2016-11-18

相关推荐

  • 设计模式(六)桥连模式Bridge(结构型)

    1. 概述       在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化,而又不引入额外的复杂度? 例子1:设想如果要绘制矩形、圆形、椭圆、正方形,我们至少需要4个形状类,但是如果绘制的图形需要具有不同的…

    Linux干货 2015-06-26
  • 浅谈HTTP协议以及httpd的十八般武艺

      初识HTTP协议                HTTP(hyper text transfer protocal)作为互联网应用最广泛的协议,任何一个运维人员都无法回避它,HTTP的目的就是提供一种发布和…

    Linux干货 2016-02-14
  • Centos图形界面和命令界面模式切换

    大家都知道,centos有两种用户界面模式,一种是图形界面,也就是我们常说的Xwindows界面;另一种就是命令界面。有时因为方便需要在图形模式下安装一些程序,因图形界面占用的内存等资源较大,影响系统的运行,安装完后需要把系统切换到命令模式下运行,下面就两种模式如何进行切换做一下说明。 CentOS的启动模式共分为7级,分别是: 0-  停机 1-…

    系统运维 2015-07-19
  • DHCP服务

    一、DHCP概述     DHCP全称为Dynamic Host Configuration Protocol,即动态主机配置协议,其主要作用是使用网内的主机可以自动获取到网络相关参数信息,以达到高效管理主机的目的。     DHCP采用C/S架构,即Server/Client。…

    Linux干货 2015-05-11
  • N26_第二周作业

    一、Linux上的文件管理类命令都有哪些,其常用的使用方法及其相关示例演示。 文件管理命令:cp,mv,rm 1、cp命令 功能说明:复制copy语法格式:        单源复制:  cp [OPTION]… [-T] SOURCE DEST  …

    Linux干货 2017-02-21
  • 深入理解java嵌套类和内部类

    一、什么是嵌套类及内部类   可以在一个类的内部定义另一个类,这种类称为嵌套类(nested classes),它有两种类型:静态嵌套类和非静态嵌套类。静态嵌套类使用很少,最重要的是非静态嵌套类,也即是被称作为内部类(inner)。嵌套类从JDK1.1开始引入。其中inner类又可分为三种:  其一、在一个类(外部类)中直接定义的内部类;  其二、在一个方法…

    Linux干货 2015-04-07