首页 > 代码库 > iptables(2)

iptables(2)


iptables命令的使用格式:

    iptables [-t able] COMMAND chain cretieria [-m -m matchname [per-match-options]]  [-j targetname [per-target-options]]

技术分享


技术分享

匹配条件:

基本匹配条件

扩展匹配条件

    隐式扩展

    显式扩展

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

基本匹配条件:

    条件之前的!表示可以对条件进行取反

    (1)[!] -s, --source address[/mask][,...]:检查报文中的源IP地址是否符合此处指定的地址或地址范围;

        

iptables -I INPUT -s 10.1.0.71 -j REJECT //拒绝来自10.1.0.71的访问
iptables -I INPUT -s 10.1.0.0/16 -j ACCEPT //放行10.1.0.0/16网络中的主机访问
iptables -R INPUT 1 -s 10.1.0.71 -j DROP //来自10.1.0.71的访问的包丢掉
iptables -D INPUT 1 //删除INPUT链中的第一条规则
iptables -D INPUT -s 10.1.0.71 -j DROP //删除明确给出规则的INPUT链规则


    (2)[!] -d, --destination address[/mask][,...]:检查报文中的目标IP地址是否符合此处指定的地址或地址范围;

    

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

         iptables -A INPUT -s 10.1.0.0/16 -d 10.1.0.6 -p tcp -j ACCEPT //开放来自10.1.0.0/16网络中的主机访问10.1.0.6网卡的tcp协议报文

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

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

    

    

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

    -j, --jump target:跳转目标;

     

扩展匹配条件:

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

也可以在给定协议之后使用 -m tcp ,  -m udp ...显式扩展必须给定-m指定

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

    (1)[!] --source-port,--sport port[:port]:匹配报文中的传输层的源端口;可给出多个连接的端口; 

    iptables -A INPUT -s 10.1.0.0/16 -d 10.1.0.67 -p tcp --dport 22 -j ACCEPT //进站

    iptables -A OUTPUT -d 10.1.0.0/16 -s 10.1.0.67 -p tcp --sport 22 -j ACCEPT 

//开放本网段的进入本机22端口的请求报文

    (2)[!] --destination-port,--dport port[:port]:匹配报文中的传输层的目标端口;可给出多个连接的端口;

        (3)[!] --tcp-flags mask comp

  SYN,ACK,FIN,RST,URG,PSH;

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

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

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

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

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

    (1)[!] --source-port,--sport port[:port]:匹配报文中的传输层的源端口;可给出多个连接的端口;

    (2)[!] --destination-port,--dport port[:port]:匹配报文中的传输层的目标端口;可给出多个连接的端口;

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

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

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

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

    技术分享

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

    1、multiport

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

    

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

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

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

    iptables -A INPUT -d 10.1.0.6 -p tcp -m multiport --dport 22,23,80 -j ACCEPT //开放本地的22,23,80端口进站请求

    iptables -A INPUT -s 10.1.0.6 -p tcp -m multiport --sport 22,23,80 -j ACCEPT //允许22,23,80端口回应客户请求

2、iprange

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

    

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

    -m iprange --src-range from 10.1.68.1 to 10.1.68.10

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

3、string

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

    

    [!] --string pattern

    [!] --hex-string pattern

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

    --from offset

    --to offset

    过滤过过程中遇到的问题:当使用httpd启动80端口时回应报文中的敏感词汇可以过滤

         但是当使用nginx启动80端口回应报文时对字符过滤时没有效果

4、time

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

    

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

    --datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]

    时间无法取反

    --timestart hh:mm[:ss]

    --timestop hh:mm[:ss]

    iptables -I INPUT -d 10.1.68.15 -p tcp --dport 23 -m time --timestart 16:00:01 --timestop 09:59:59 --weekdays wed -j REJECT //限制telnet服务在周三的下午四点到早上九点五十九不提供访问

     使用可以起始时间大于开始时间

    -A INPUT -d 10.1.68.9/32 -p tcp -m tcp --dport 23 -m time --timestart 09:00:00 --timestop 18:00:00 --weekdays Mon,Tue,Wed,Thu,Fri  --datestop 2038-01-19T11:14:07 -j ACCEPT //telnet服务只在工作时间提供服务

     [!] --monthdays day[,day...]

     

     [!] --weekdays day[,day...]

     

5、connlimit 

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

    

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

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

    --connlimit-mask 24 :prefix_length

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

6、limit 

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

    

    --limit rate[/second|/minute|/hour|/day] 默认是每小时三个,

    --limit-burst number//默认有令牌桶中有五个令牌。

    如果是使用iptables -I INPUT -p icmp --icmp-type 8 -m limit  -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

 

7、state 

    状态检测:连接追踪机制(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/

    如:我们的服务器由80端口连接别人,正常情况下这种状态是不存在的,如果服务器中木马,控制我们的80端口发出连接出去;我们设置80端口只允许进来为new的请求,出去ESTABLISEHD。;如果OUTPUT规则设置为DROP,我们可以让出去的是ESTABLISEHD状态的放行,可以安全的放行所有连接进入的服务。如果设置ftp能出去,设置RELATED状态的服务准许出去。就能基于状态放行ftp服务

    

    INPUT链默认规则为为DROP

iptables -A INPUT -d 10.1.68.15 -p tcp -m multiport --dports 22,80,23 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -d 10.1.68.15 -p icmp --icmp-type 8 -m state --state NEW,ESTABLISHED -j ACCEPT


 

OUTPUT链默认规则为DROP

iptables -A OUTPUT -s 10.1.68.15  -m state --state ESTABLISHED -j ACCEPT


 

[!] --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 ESTABLISHED -j ACCEPT								


处理动作(跳转目标):

    -j tagetname [per-target-options]

    简单target:

    ACCEPT,DROP

    

    扩展target:

    REJECT:

            --reject-with type

icmp-net-unreachable, icmp-host-unreachable, icmp-port-unreachable, icmp-proto-unreach‐able, icmp-net-prohibited, icmp-host-prohibited, or icmp-admin-prohibited,默认为icmp-port-unreachable;

LOG:

Turn  on  kernel  logging of matching packets.

   --log-level level

   --log-prefix prefix:日志信息的前导信息;即给定日志记录的描述字符串。

保存和载入规则:

    保存: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

        用于指明要装载的模块;

    

    CentOS 7开机自动生效规则:

        (1) firewalld服务;

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

        (3) 自定义unit file或init script;

规则优化的思路:

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

    (2) 服务于不同类别的功能的规则,匹配到报文可能性更大的放前面;//相对服务来说就是服务被访问的比较多的放前面

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

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

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

    (b) 建议在规则链的最后定义规则做为默认策略;//使用这种方式相对于a方案的好处是不需要针对本机访问再做额外定义

    

    练习:基于状态放行telnet, ftp, ssh, http, samba, icmp等服务;

    (1) 对本机的ping请求每分钟不得超出20个;

    (2) 每客户端对本机的ssh的并发连接数不得超过3个;

    (3) 本机的telnet服务仅允许工作时间内访问;

# Generated by iptables-save v1.4.7 on Thu Oct 20 09:32:28 2016
*filter
:INPUT ACCEPT [28:2389]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -d 10.1.68.9/32 -p tcp -m tcp --dport 22 -m connlimit --connlimit-above 3 --connlimit-mask 32 -m limit --limit 3/hour --limit-burst 1 -j DROP 
-A INPUT -d 10.1.68.9/32 -p tcp -m tcp --dport 23 -m time --timestart 09:00:00 --timestop 18:00:00 --weekdays Mon,Tue,Wed,Thu,Fri  --datestop 2038-01-19T11:14:07 -j ACCEPT 
-A INPUT -d 10.1.68.9/32 -p tcp -m state --state NEW,ESTABLISHED -m multiport --dports 22,80,21,3306,139,445 -j ACCEPT 
-A INPUT -d 10.1.68.9/32 -p icmp -m icmp --icmp-type 3 -j ACCEPT 
-A INPUT -d 10.1.68.9/32 -p icmp -m icmp --icmp-type 0 -j ACCEPT 
-A INPUT -d 10.1.68.9/32 -p icmp -m icmp --icmp-type 8 -m limit --limit 20/min --limit-burst 3 -j ACCEPT 
-A INPUT -d 10.1.68.9/32 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT //这一条可以放到最前面,可以去掉上边规则中的ESTABLISEHD状态,加快匹配规则
-A INPUT -d 10.1.68.9/32 -j DROP 
-A OUTPUT -s 10.1.68.9/32 -p tcp -m tcp --dport 80 -j ACCEPT 
-A OUTPUT -s 10.1.68.9/32 -p tcp -m tcp --dport 2049 -j ACCEPT 
-A OUTPUT -s 10.1.68.9/32 -p tcp -m tcp --dport 22 -j ACCEPT 
-A OUTPUT -s 10.1.68.9/32 -p icmp -j ACCEPT 
-A OUTPUT -s 10.1.68.9/32 -m state --state ESTABLISHED -j ACCEPT 
-A OUTPUT -s 10.1.68.9/32 -j DROP 
COMMIT
# Completed on Thu Oct 20 09:32:28 2016


对OUTPUT做一定调整后:

*filter
:INPUT ACCEPT [87:7149]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -d 10.1.68.9/32 -p tcp -m tcp --dport 22 -m connlimit --connlimit-above 3 --connlimit-mask 32 -m limit --limit 3/hour --limit-burst 1 -j DROP 
-A INPUT -d 10.1.68.9/32 -p tcp -m tcp --dport 23 -m time --timestart 09:00:00 --timestop 18:00:00 --weekdays Mon,Tue,Wed,Thu,Fri  --datestop 2038-01-19T11:14:07 -j ACCEPT 
-A INPUT -d 10.1.68.9/32 -p tcp -m state --state NEW,ESTABLISHED -m multiport --dports 22,80,21,3306,139,445 -j ACCEPT 
-A INPUT -d 10.1.68.9/32 -p icmp -m icmp --icmp-type 3 -j ACCEPT 
-A INPUT -d 10.1.68.9/32 -p icmp -m icmp --icmp-type 0 -j ACCEPT 
-A INPUT -d 10.1.68.9/32 -p icmp -m icmp --icmp-type 8 -m limit --limit 20/min --limit-burst 3 -j ACCEPT 
-A INPUT -d 10.1.68.9/32 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT 
-A INPUT -d 10.1.68.9/32 -j DROP 
-A OUTPUT -s 10.1.68.9/32 -m state --state NEW,ESTABLISHED -j ACCEPT 
-A OUTPUT -s 10.1.68.9/32 -j DROP 
COMMIT
# Completed on Thu Oct 20 22:44:31 2016

本文出自 “提着酱油瓶打醋” 博客,请务必保留此出处http://sauce.blog.51cto.com/11880696/1864622

iptables(2)