iptables入门到进阶

netfilter/iptables:


       netfilter是存在于内核中的一个防火墙框架,用来管理网络数据包,netfilterIP数据包处理流程中的5个关键位置放置了5个钩子(hook)函数,当数据包流经相应的位置时,相应的钩子函数会被调用,每个对应的钩子上有对应的表,表中有对应的规则链,链中存放着对应的规则,最终形成了对数据包处理规则的实现;

       iptables是运行于用户空间中的进程,通过控制netfilter来实现对数据包的管理、维护与检查;

net filter功能:

       filter包过滤;

       NAT网络地址转换(Network Address Translation);

       mangle拆解报文,做出修改,而后重新封装;

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

钩子函数(hook function):

1、 prerouting

2、 input

3、 forward

4、 output

5、 postrouting

 

每张表可以放置对应的钩子:

       filterinput 
forward  output

       natprerouting 
output  postrouting

       mangleprerouting 
input  forward  output 
postrouting

       rawprerouting  output

iptables:内置的链

1、 PREROUTING

2、 INPUT

3、 FORWARD

4、 OUTPUT

5、 POSTROUTING

注:允许用户自定义规则链,它们需要手动关联至指定的“钩子”;
各表的优先级:raw à mangle à nat à filter

iptables规则的组成:

匹配条件:

网络层首部:源地址、目标地址

传输层首部:源端口、目标端口、TCP Flags…

       以及一些扩展模块引入的检查机制;

跳转目标:-j  target

targetDROP  ACCEPT  REJECT  SNAT 
DNAT  MASQUERADE LOG ….

 

iptables命令的基本格式:

       iptables [-t table] {-A|-C|-D} chain
rule-specification

      
ip6tables [-t table] {-A|-C|-D} chain rule-specification

      
iptables [-t table] -I chain [rulenum] rule-specification   

      
iptables [-t table] -R chain rulenum rule-specification

      
iptables [-t table] -D chain rulenum

      
iptables [-t table] -S [chain [rulenum]]

      
iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options…]

      
iptables [-t table] -N chain

      
iptables [-t table] -X [chain]

      
iptables [-t table] -P chain target

      
iptables [-t table] -E old-chain-name new-chain-name

      
rule-specification = [matches…] [target]

      
match = -m matchname [per-match-options]

      
target = -j targetname [per-target-options]

COMMANDs

链管理:

       -N,
–new-chain chain
:新建一个自定义的规则链;

       -X,
–delete-chain [chain]
:删除用户自定义的引用计数为0的空链;

       -F,
–flush [chain]
:清空指定的规则链上的规则;

       -E,
–rename-chain old-chain new-chain
:重命名链;

       -Z, –zero
[chain [rulenum]]
:置零计数器;

              注意:每个规则都有两个计数器

                     packets:被本规则所匹配到的所有报文的个数;

                     bytes:被本规则所匹配到的所有报文的大小之和;

       -P,
–policy chain target
:定义指定链的默认target

规则管理:

              -A–append
chain rule-specification
:向指定链的尾部追加规则;

              -D–delete
chain rulenum
:删除指定链中的某条规则;

              -I–insert
chain rulenum
:向指定链中的指定位置插入规则,默认为首部;

              -R –replace chain rulenum:替换指定链中的某条规则;

              -L –list [chain]:列出指定链中的所有规则;

                            –line-numbers:显示链中规则的序号;

              -S –list-rules [chain]:列出指定链中的所有规则;

              -F:清除指定链的所有规则;

PARAMETERS

       通用匹配:

              [!] -s ,–source address[/mask][,..]:检查报文的源地址是否符合或等于此处的地址;

              [!] -d ,–destination
address[/mask][,..]
:检查报文的目标地址是否符合或等于此处的地址;

              [!] -p ,–rotocol protocol:匹配报文中的协议,可用值tcp, udp,  udplite, icmp,  icmpv6,esp, 
ah, sctp, mh
或者 “all”, 亦可以数字格式指明协议

              [!] -i ,–in-interface name :限定报文仅能够从指定的接口流入;only for packets entering the INPUT, FORWARD  and 
PREROUTING  chains;

           [!] -o, –out-interface name:限定报文仅能够从指定的接口流出;for packets entering the FORWARD, OUTPUT and POSTROUTING chains.

              -m –match match:调用指定的扩展模块,来扩展匹配条件;

       扩展匹配:

              -m tcp

                     –sport   –dport

 

基础使用:
       1
、创建一条新链,添加规则并关联至指定的钩子上:

              iptables -N Test_Chain

              iptables -A Test_Chain -d
172.18.54.3  -j REJECT

              iptables -A INPUT -j Test_Chain

       删除自定义链:

              iptables -D INPUT 1 (此处的1为自定义链在引用链中所处的规则条目,如果引用多次,需要逐个删除;)

              iptables -Z Test_Chain

              iptables -X Test_Chain

       重命名链:

              iptables -E Test_Chain  New_Chain_Name

       清空链上的规则:

              iptables
-F
(不指明链名,默认清空filter表上的所有链上的规则)

       删除规则:

              iptables -D INPUT Number

       插入规则:

              iptables -I INPUT -j REJECT (默认插入首部)

       改变规则链默认策略:

              iptables -P INPUT DROP

rule-specification
= [matches…] [target]

              matches:匹配条件

              target:跳转目标

 

1、开放本机的所有tcp服务给所有主机;

                            # iptables -I INPUT  -p
tcp -j ACCEPT

                            # iptables -I OUTPUT
-p tcp -j ACCEPT

2、开放本机的所有udp服务给172.16.0.0/16网络中的主机,但不包含172.16.0.200

                            # iptables -I INPUT
2 -s 172.18.0.200 -p udp -j REJECT

                            # iptables -I INPUT
3  -s 172.18.0.0/16 -p udp -j ACCEPT

                            #
iptables -I OUTPUT 2 -s 172.18.0.67 -d 172.18.0.0/16 -p udp -j ACCEPT

3、默认策略为REJECT

                            # iptables -A INPUT
-j REJECT

扩展:

1、 仅开放本机的ssh服务给172.16.0.0/16中的主机,而且不包含172.16.0.200;

# iptables -s
172.16.0.200  -p tcp –dport 22 -j  REJECT

# iptables -s
172.16.0.0/16 -p tcp –dport 22 -j ACCEPT

 

扩展条件匹配:

    隐式扩展:

       -p tcp:可直接使用tcp扩展模块的专用选项;

            [!] –source-port,–sport
port[:port] 
匹配报文源端口;可以给出多个端口,但只能是连续的端口范围

            [!]
–destination-port,–dport port[:port]  
匹配报文目标端口;可以给出多个端口,但只能是连续的端口范围

            [!] –tcp-flags mask
comp 
匹配报文中的tcp协议的标志位;Flags are: SYN ACK FIN RST URG PSH ALL NONE

                 mask:要检查的FLAGS list,以逗号分隔;

                 comp:在mask给定的诸多的FLAGS中,其值必须为1FLAGS列表,余下的其值必须为0

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

                     –tcp-flags
ALL ALL

                      –tcp-flags
ALL NONE

            [!] –syn    –tcp-flags
SYN,ACK,FIN,RST  SYN

                                  

              -p udp:可直接使用udp协议扩展模块的专用选项:

                     [!] –source-port,–sport
port[:port]

                     [!]
–destination-port,–dport port[:port]

                                  

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

                            0/0 echo reply

                            8/0echo request

                                  

   显式扩展:必须使用-m选项指明要调用的扩展模块的扩展机制;

       1multiport

            以离散或连续的 方式定义多端口匹配条件,最多15个;

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

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

                  # iptables -I INPUT 
-d 172.16.0.7 -p tcp -m multiport –dports 22,80,139,445,3306 -j ACCEPT
                      

       2iprange

                以连续地址块的方式来指明多IP地址匹配条件;

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

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

               # iptables -I INPUT -d
172.16.0.7 -p tcp -m multiport –dports 22,80,139,445,3306 -m iprange
–src-range 172.16.0.61-172.16.0.70 -j REJECT
                          

       3time

               –timestart hh:mm[:ss]

               –timestop hh:mm[:ss]

              [!] –weekdays
day[,day…]

      [!] –monthdays day[,day…]

                       –datestart
YYYY[-MM[-DD[Thh[:mm[:ss]]]]]

                       –datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]    –kerneltz:使用内核配置的时区而非默认的UTC

      4string

              –algo {bm|kmp}

               [!] –string pattern

               [!] –hex-string
pattern

                        –from offset

                        –to offset

                 # iptables -I OUTPUT
-m string –algo bm –string “gay” -j REJECT

      5connlimit

                 –connlimit-upto n

                 –connlimit-above n

                  # iptables -I INPUT
-d 172.16.0.7 -p tcp –syn –dport 22 -m connlimit –connlimit-above 2 -j
REJECT

     6limit                            

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

                  –limit-burst number

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

      7state

                   [!] –state state

                       INVALID,
ESTABLISHED, NEW, RELATED or UNTRACKED.

                           NEW: 新连接请求;

                           ESTABLISHED:已建立的连接;

                           INVALID:无法识别的连接;

                           RELATED:相关联的连接,当前连接是一个新请求,但附属于某个已存在的连接;

                           UNTRACKED:未追踪的连接;

                           state扩展:

                                 内核模块装载:

                                        nf_conntrack

                                        nf_conntrack_ipv4

                                  手动装载:

                                        modprobe  nf_conntrack_ftp        

                     追踪到的连接:

                            /proc/net/nf_conntrack       

                     调整可记录的连接数量最大值:

                            /proc/sys/net/nf_conntrack_max

                     超时时长:

                            /proc/sys/net/netfilter/*timeout*

处理动作(跳转目标):

       -j targetname [per-target-options]

              简单target

                     ACCEPT DROP                 

              扩展target

                     REJECT

                            –reject-with type

                                   type   icmp-net-unreachable,
icmp-host-unreachable

icmp-port-unreachable,icmp-proto-unreachable

icmp-net-prohibited

icmp-host-prohib‐ited, or
icmp-admin-prohibite
                                                                     

                            LOG

                                   –log-level

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

                                   –log-prefix:定义日志前缀;

保存和载入规则:

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

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

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

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

CentOS
6

       保存规则:

              service iptables save

              保存规则于/etc/sysconfig/iptables文件,覆盖保存;

       重载规则:

              service iptables restart

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

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

CentOS 7

              (1) 自定义Unit
File
,进行iptables-restore

              (2) firewalld服务;

              (3) 自定义脚本;

       规则优化的思路:

              使用自定义链管理特定应用的相关规则,模块化管理规则;

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

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

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

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

                     (a) iptables -P,不建议;

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

iptables/netfilter网络防火墙:

              (1) 网关;

              (2) filter表的FORWARD链;

              要注意的问题:

                     (1) 请求响应报文均会经由FORWARD链,要注意规则的方向性;

                     (2) 如果要启用conntrack机制,建议将双方向的状态为ESTABLISHED的报文直接放行;        

              NAT: Network Address Translation

                     请求报文:由管理员定义;

                     响应报文:由NATconntrack机制自动实现;

                     请求报文:

                            改源地址:SNAT

                            改目标地址:DNAT

                           

               iptables/netfilter

                     NAT定义在nat表;

                            PREROUTINGINPUTOUTPUTPOSTROUTING


                            SNATPOSTROUTING

                            DNATPREROUTING                     

              target

                     SNAT

                            –to-source
[ipaddr[-ipaddr]]

                     #
iptables -t nat -I POSTROUTING -j SNAT –to-source 172.18.54.3

                           

                     DNAT

                            –to-destination
[ipaddr[-ipaddr]][:port[-port]]

                     # iptables -t nat -I
PREROUTING -j DNAT –to-destination 172.18.54.2

                           

                      MASQUERADE

                            SNAT场景中应用于POSTROUTING链上的规则实现源地址转换,但外网地址不固定时,使用此target

       

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