一、简介

    iptables是可以实现netfilter框架的一个命令,通过调用syscall使内核空间的防火墙规则和用户空间交互。

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

            /etc/sysconfig/iptables

二、四表五链模型

iptables默认的五种规则链 iptables 规则链_iptables默认的五种规则链

【结合不同的扩展】iptables可以针对OSI二、三、四、七层进行报文进行规则匹配

    iptables四表:filter(default)、nat、mangle、raw

        五链:INPUT OUTPUT FORWARD PREROUTING POSTROUTING.(亦可以自定义链)

        四表处理优先级:raw mangle nat filter

【各个表在链上的功能实现如图】

iptables默认的五种规则链 iptables 规则链_IP_02

三、iptables命令简介

  iptables [-t tables] COMMAND CHAIN [NUM] 匹配标准 -j 处理办法

-t 指定表类型

COMMAND:

       1>.管理规则

        -A 附加一条规则(默认添加在链的尾部)

        -I CHAIN [NUM] 插入一条规则,插入到对应的第num条

        -D CHAIN [NUM] 删除指定链中的第num条规则

        -R CHAIN [NUM] 替换第num条规则

       2>.管理链

        -F [CHAIN] 清空指定规则链,若省略则清空表中所有链

        -P CHAIN 设定指定连的默认策略(例1)

        -N <CHAIN_NAME> 自定义一个新链

        -X <CHAIN_NAME> 删除一个自定义空链

        -Z 置零指定连中所有规则的计数器(计数器记录被匹配的报文个数个大小之和)

        -E old_chain_name new_chain_name 重命名自定义链

       3>.查看类

        -L 显示指定表中的规则

        -n 以数字格式显示主机地址和端口号

        -v 显示详细的规则

匹配标准:

        1>.通用匹配

          -s --src 指定源IP

          -d --dst 指定目的IP

          -p {tcp|udp|icmp}

          -i INTERFACE 指定数据报文流入的接口(例2)

            可用于定义的链:PREROUTING,INPUT,FORWARD

          -o INTERFACE 指定输入报文流入的接口

            可用于定义的链:OUTPUT,POSTROUTING,FORWARD

        2>.扩展匹配

          -p tcp

            --sport PORT[-PORT] 源端口(例3)

            --dport PORT[-PORT] 目的端口

            --tcp-flags mark comp 检查mark指定的标志位(例4)

          -p icmp

            --icmp-type(例5)

              0: echo-reply

              8: echo-request 

          -p udp

            --sport

            --dport

          -m state --state 状态扩展(NEW,ESTABLIESHED,INVALID,RELATED)(例子6

例11)

          -m multiport 离散多端口匹配

            --source-ports

            --destination-ports

            --portse(例子7)

          -m iprange 范围

            --src-range

            --dst-range(例子8)

          -m connlimit 连接数限定

            --connlimit-ablove n (例子9)

          -m limite   

            --limit RATE     控制单位时间内可连接的速度(没分钟提供3个连接)

            --limit-burst num   每批连接只能进num个

例10)任何服务包含该字符串就屏蔽

            --algo {kmp|bm}

            --string "STRING"

处理办法:

          -j TARGET

            ACCEPT

            DROP

            REJECT

例13

例14

            REDIRECT 重定向

            MASQUERADE 地址伪装(例13)(相当于原地址转换,多用于地址是自动获取的地址)

例12

            MARK   为报文打标记

用到的命令

iptstate -t 显示连接个数



四、filter表上常用规则

例1:设置iptables默认策略为DROP



#iptables -P INPUT DROP
#iptables -P OUTPUT DROP
#iptables -P FORWARD DROP
 
  

例2:放行自己对环回口的ping报文
 
  
#iptables -I INPUT -s 127.0.0.1 -d 127.0.0.1 -i lo -j ACCEPT
#iptables -I OUTPUT -s 127.0.0.1 -d 127.0.0.1 -o lo -j ACCEPT
 
  

例3:放行192.168.0.0网段对192.168.1.11的ssh服务的访问
 
  
#iptables -t filter -A INPUT -s 192.168.0.0/16 -d 192.168.1.11 -p tcp --dport 22 -j ACCEPT
#iptables -t filter -A OUTPUT -s 192.168.1.11 -d 192.168.0.0/16  -p tcp --sport 22 -j ACCEPT
 
  

例4:放行所有的syn=1,ack=0,fin=0,rst=0的报文

 
  
#iptables -t filter -A INPUT -p tcp --sport --tcp-flags SYN,ACK,FIN,RST SYN -j ACCEPT
 
  

例5:允许自己ping其他主机,不允许别人ping自己
 
  
#iptables -t filter -A OUTPUT -s 192.168.1.11 -p icmp --icmp-type 8 -j ACCEPT
#iptables -t filter -A INPUT -d 192.168.1.11 -p icmp --icmp-type 0 -j ACCEPT
 
  

例6:防止反弹******web,禁止非响应式连接
iptables_conntrack(强烈建议关闭)
    /proc/net/ip_conntrack 当前连接的保存位置使用iptstate -t可以查看
    /proc/net/ipv4/ip_conntrack_max 最大的连接个数,如果连接个数超过限制条目,其他的请求一律被丢弃
 
  
#iptables -t filter -A INPUT -d 192.168.1.11 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
#iptables -t filter -A OUTPUT -s 192.168.1.11 -p tcp --dport 80 -m state --state ESTABLISHED -j ACCEPT
 
  
    上一条也可以这样写
 
  
#iptables -t filter -I OUTPUT -s 192.168.1.11 -m state --state ESTABLISHED -j ACCEPT
 
  

例7:离散多端口匹配
 
  
#iptables -I INPUT 2 -d 192.168.1.11 -p tcp -m multiport --destination-ports 21,22,80 -m state --state NEW -j ACCEPT
 
  

例8:IP地址范围匹配
 
  
#iptables -t filter -A INPUT -p tcp -m iprange --src-range 192.168.1.5-192.168.1.15 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
 
  

例9:连接数限定(用于限定同一个客户端地址最多允许同时发起多少个请求的),表示不高于8个就允许,多于8个就禁止
 
  
#iptables -t filter -A INPUT -d 192.168.1.11 -p --dport 80 -m connlimit ! --connlimit-above 8 -j ACCEPT
 
  

例10:任何服务只要包含指定字符串就屏蔽该网页(此处应该注意数据包的流向,在客户端拒绝,拒绝的应该是来自服务器出去的报文)一定做到OUTPUT上
 
  
#iptables -t filter -I OUTPUT -s 192.168.1.11 -m string --algo kmp --string "Alex" -j REJECT
 
  
例11:允许FTP协议的链接。
    对于ftp等双层协议来说,链接状态有控制链接和数据链接之分,ftp能够通过放行NEW,ESTABLISHED来和对端连接,但是不能够传输数据,必须使用RELATED状态标记该链接,表示允许(或禁止)相关联的数据链接,对此必须先加载ip_conntrack_ftp,和ip_nat_ftp模块。模块加载见:
 
  
#iptables -A INPUT -p tcp -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
#iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
 
  
允许已经行的请求,已建立和相关的数据包进入
允许已经建立和相关的数据包出去

五、nat表上常用规则(以下地址是192.168.10.X就简写为10.X)
    打开主机的转发功能
    echo 1 > /etc/sys/net/ipv4/ip_forward
    vim /etc/sysctl.conf
      net.ipv4.ip_forward = 1
    sysctl -p 直接生效上面
例12:-j LOG 记录日志
 
  
#iptables -t filter -I INPUT 4 -d 192.168.1.11 -p icmp --icmp-type 8 -j LOG --log-prefix "--firewall on icmp-- "
(与DROP,ACCEPT,REJECT同用时,应放置与该操作的上面这里我置于第四条)只要每一个客户端ping我主机就记录该客户端的信息,并且打上"--Firewall on icmp--"标签



例13:-j SNAT --to-source 源地址转换

适用场景:(在POSTROUTING上做规则)

iptables默认的五种规则链 iptables 规则链_源地址_03

场景结构:边10.8和10.9通过firewall共享互联网,且使用的是私有地址;间防火墙两块网卡,一个(10.10)为内网IP,一个(100.7)为对外公网IP;边是互联网。

假设10.9主机请求100.6,发往100.6,但是回来的时候100.6并不知道10.9在哪里,收不到回复请求。

目的:10.9能请求到100.6并且它能够回复给10.9

实现


#echo 1 > /etc/sys/net/ipv4/ip_forward
#iptbles -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT --to-source 172.16.100.7


    打开地址转发功能(也可以编辑/etc/sysctl.conf文件对转发选项置1),编写防火墙源地址转换规则,对所有来自192.168.10.0网段的地址实施源地址转换,转换为172.16.100.7。

注:源地址转换的返回时的目的地址转换是由firewall自动完成的,如果公网是固定IP就用SNAT,如果公网接口采用ppp0或者ppp1的ADSL拨号连接,则将SNAT转换为MASQUERADE即可


例14:-j DNAT --to-destination 目标地址转换

适用场景:(在PREROUTING上做规则)

iptables默认的五种规则链 iptables 规则链_iptables默认的五种规则链_04

场景结构:左边我的webserver想发布至公网,但是我只有一个私有地址。中间防火墙两块网卡,一个(10.10)为内网网关,一个(100.7)为对外公网IP,开启ip_forward功能;右边是互联网。


目的:所有对100.7的web访问都转发至内网的10.9的为webserver上。

实现:


#echo 1 > /etc/sys/nat/ipv4/ip_forward
#iptables -t nat -A PREROUTING -d 172.16.100.7 -p tcp --dport 80 -j DNAT --to-destination 192.168.10.9


注:做目的地址转换的firewall对于某请求的响应报文,其源地址转换是自动完成的。

例15:iptables 命令的保存



#service iptables save
#iptables-save > /etc/iptables/iptables_20150725
#iptables-restore < /etc/iptables/iptables_20150725