实例:
    #iptables -t filter -A INPUT -s 172.16.0.0/16 -d 172.16.100.7 -j DROP 源地址为172.16.0.0网段的,访问172.16.100,7的数据包都丢弃。

    #iptables  -L -n 查看filter表的规则

    #iptables -t nat -L -n 查看nat表中的规则

    #iptables  -A INPUT -m state --state NEW,ESTABLISHED-j ACCEPT 显示扩展,允许连接状态为NEW和ESTABLISHED的数据包进入本机

    1.本机ip为172.16.100.7,有sshd服务,监听在tcp22端口,放行172.16.0.0对本机sshd服务的访问
        #iptables -t filter -A INPUT  -s 172.16.0.0/16 -d 172.16.100.7 -p tcp --dport 22  -j ACCEPT
        #iptables -t filter -A OUTPUT -s 172.16.100.7 -d 172.16.0.0/16 -p tcp --sport 22 -j ACCEPT

    2.修改规则默认策略为DROP,只开放web服务:
        #iptables -P INPUT DROP
        #iptables -P OUTPUT DROP
        #iptables -P FORWARD DROP
        #iptables -I INPUT -d 172.16.100.7 -tcp -dport 80 -j ACCEPT
        #iptables -I OUTPUT -s 172.16.100.7 -tcp -sport 80 -j ACCEPT

    3.允许本地io接口的ping
        #iptables -A INPUT  -s 127.0.0.1 -d 127.0.0.1 -i io -j ACCEPT
        #iptables -A OUTPUT  -s 127.0.0.1 -d 127.0.0.1 -o io -j ACCEPT

    4.允许本机对外ping
        #iptables -A OUTPUT -s 192.168.100.7 -p icmp -icmp-type 8 -j ACCEPT
        #iptables -A INPUT -d 192.168.100.7 -p icmp -icmp-type 0 -j ACCEPT

    5.允许外部ping本机
        #iptables -A INPUT -d 172.16.100.7 -p icmp --icmp-type 8 -J ACCEPT
        #iptables -A OUTPUT -s 172.16.100.7 -p icmp --icmp-type 0 -J ACCEPT

    6.假设在172.16.1007上搭建了DNS服务,开放对应端口提供服务

        为客户端提供DNS解析:

        #iptables -A INPUT -d 172.16.100.7 -p udp -dport 53 -j ACCEPT
        #iptables -A OUTPUT -s 172.16.100.7 -p udp -sport 53 -J ACCEPT


        向其他DNS服务器查询:
        #ptables -A INPUT -d 172.16.100.1 -p udp -sport 53 -j ACCEPT  接受其他DNS的响应,数据包源端口为53
        #ptables -A OUTPUT  -s 172.16.100.7  -p udp -dport 53 -j ACCEPT 向其他DNS发送请求,数据包目标端口为53

        #iptables -A INPUT -d 172.16.100.7 -p tcp -dport 53 -j ACCEPT
        #iptables -A OUTPUT -s 172.16.100.7 -p tcp -sport 53 -J ACCEPT
        #ptables -A INPUT -d 172.16.100.7 -p  tcp -sport 53 -J ACCEPT
        #ptables -A OUTPUT -s 172.16.100.7 -p tcp -dport 53 -J ACCEPT

    7.保存规则到默认配置文件:
        #service iptables save

    8.自定义保存配置文件并装载:
        #iptables-save > /etc/sysconfig/iptables.test
        #iptables-restore < /etc/sysconfig/iptables.test

    9.清空所有规则:
        #iptables -F

    10.使用连接状态检测方式改写sshd和httpd规则
        只有状态为NEW和ESTABLISED的数据包可以进入本机,只有状态为ESTABLISHED的数据包可以从本机出去。其余数据包均丢弃。

        此规则使服务器只能响应客户端请求,不主动发出请求。保证了服务器是被动连接。提高了安全性。

        #iptables -A INPUT -d 172.16.100.7 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT 连接状态为NEW和
        ESTABLISHED的数据包允许进入本机
        #iptables -A OUTPUT -s 172.16.100.7 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT 连接状态为ESTABLISHED的数据包允许从本机出去,其他状态则不允许。

        #iptables -A INPUT -d 172.16.100.7 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
        #iptables -A OUTPUT -s 172.16.100.7 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT

        #iptables -P INPUT DROP 修改默认规则
        #iptables -P OUTPUT DROP

    11.临时修改修改ip_conntrack的max值和缓存时间,否则连接数过大则超过max的连接则会被拒绝。
        #sysctl -w net.ipv4.ip_conntrack_max=65536 默认为32768
        #sysctl -w net.ipv4.ip_conntrack_tpc_timeout_established=86400

    12.永久修改ip_conntrack的相关值
        #vim /etc/sysctl.conf
            net.ipv4.ip_conntrack_max=65536
            net.ipv4.ip_conntrack_tpc_timeout_established=86400

    13.允许外部ping本机:
        #iptables -A INPUT  -d 172.16.100.7 -p icmp --icmp-type 8 -m state --state NEW,ESTABLISHED -j ACCEPT
        #iptables -A OUTPUT  -s 172.16.100.7 -p icmp --icmp-type 0 -m state --state ESTABLISHED -j ACCEPT

    14.合并OUTPUT追踪规则:
        #iptable -I  OUTPUT -s 172.16.100.7  -m state --state ESTABLELISHED -j ACCEPT 只要符合源地址为172.16.100.7并且连接状态为ESTABLISHED的数据包均放行。
        #iptable -D OUTPUT 2 删除其他规则
        #iptable -D OUTPUT 2
        #iptable -D OUTPUT 2
        #iptables -L -n --line-nubmers

    15.假设172.16.100.7上有假设ftp服务器,允许提供ftp服务:

        这里ftp一般设置成主动模式,即开放20,21端口。被动模式开放端口太多,规则不好定义。
        先加载ip_conntrack_ftp 和ip_nat_ftp模块到内核中
        #vim /etc/sysconfig/iptables-config
            IPTABLES_MODULES="ip_nat_ftp ip_conntrack_ftp"

        #iptables -A INPUT -d 172.16.100.7 -p tcp -dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT 允许状态为NEW和ESTABLISHED的,目标地址为172.16.100.7,端口为22的ftp协议数据包进入本机。

        #iptables -I OUTPUT  -s 172.16.100.7 -p tcp  -m state --state ESTABLISHED,RELATED -j ACCEPT 允许状态为ESTABLISHED和RELATED的数据包从本机出去,包括协议和数据。

        #iptables -I INPUT -d 172.16.100.7 -p -tcp -m state --state ESTABLISHED,RELATED -j ACCEPT  允许状态为ESTABLISHED和RELATED的ftp数据包进入本机本机。


        若ftp的账号储存在mysql上,则需要允许io回环,否则无法连接mysql进行账号验证。
        #iptables -A INPUT  -i io -j ACCEPT 
        #iptables -A OUTPUT -o io -j ACCEPT

    16.多端口匹配
        使用多端口匹配可以将多个条目合并,可以提高匹配效率。
        将sshd、vsftpd、httpd进行多端口合并。

        #iptables -F
        #iptables -I INPUT -d 172.16.100.7 -p tcp -m state --state ESTABLISHED,REALTED -j ACCEPT
        #iptables  -I INPUT 2 -d 172.16.100.7 -p tcp -m multiport --destination 21,22,80 -m state --state NEW -j ACCEPT

        #iptables -I OUTPUT  -s 172.16.100.7 -p tcp  -m state --state ESTABLISHED,RELATED -j ACCEPT

        #iptables -A INPUT  -i io -j ACCEPT  
        #iptables -A OUTPUT -o io -j ACCEPT


    17.匹配条件取反
        #iptables -A INPUT -d ! 172.16.100,7 -j ACCEPT 表示除目标地址为172.16.100.7的数据包允许进入本机

    18.指定ip组;
        #iptables -A INPUT  -p tcp -m iprange 172.16.100.3-172.16.100.10 -j ACCEPT

    19.限定连接服务器的tcp连接数为5个:
        #iptables -A INPUT -p tcp -d 172.16.100.7 --dport 80 -m connlimit  ! --connlimit-above 5 -j ACCEPT
        或
        #iptables -A INPUT -p tcp -d 172.16.100.7 --dport 80 -m connlimit  --connlimit-above 5 -j REJECT

    20.限定ping请求的速率:
        #iptables -A OUTPUT  -s 127.16.100.7 -m state --state RELATED,ESTABLISHED -J ACCEPT
        #iptables -I INPUT -p icmp --icmp-type 8   -d 172.16.100.7 -m limit --limit 5/minute [--limit-burst 5] -j ACCEPT 指定进入本机的ping请求为每分钟5个 ,每分钟内最高可以同时请求5个。--limit-burst可以不指定,默认为5。

    21.指定字符串限定用户访问
        #iptables  -I OUTPUT -s 172.16.100.7 -m string --algo kmp --string “test” -j REJECT  响应数据包中包含test字符的都拒绝

    22.自定义日志记录功能
        日志的条目一定要在对应条目的上方才能被正确匹配到。

        以自定义外部主机允许ping为例


        #iptables  -I INPUT 3 -d 172.16.100.7 -p icmp -j LOG  --log-prefix  "ping log" 

        #iptables -I INPUT 4 -d 172.16.100.7 -p icmp --icmp-type 8 -m state --state NEW,ESTABLISHED -j ACCEPT


        #cat /var/log/messages |grep "ping log"

        


    23.使用自定义链
        自定义链名为test。自定义链要放在列表的最前,调用完毕后返回列表继续匹配。
        #iptables -N test 创建自定义链test
        #iptables -A test -d 255.255.255.255 -p icpm -j DROP 添加规则
        #iptables -A test -d 172.16.100.7 -j RETURN  放在最后,跳转回主链

        #iptables -I INPUT 1 -j test 调用test链

    24.防止DOS攻击。

        是使用recent扩展来控制连接数。以sshd服务为例

        #iptables -I INPUT  2 -d 172.116.100.7 -p tcp --dport 22 -m connlimit --connlimit-above 3 -j DROP 将目标地址是172.16.100.7,端口为tcp协议的22号,tcp连接个数大于3的tcp连接都丢弃。
        #iptables -I INPUT 3 -d 172.116.100.7 -p tcp --dport 22 -m recent  --set --name sshconn -m state --state NEW 将目标地址是172,16,100.7,端口为tcp协议的22号,建立名为sshconn的清单,将状态是NEW对应的ip地址记录在sshconn中。
        #iptables -I INPUT 4 -d 172.116.100.7 -p tcp --dport 22 -m recent --update --second 300 --hitconut 3 --name sshconn -j DROP 将目标地址是172,16,100.7,端口为tcp协议的22号,sshconn清单中符合300秒内新建连接数于或等于3的数据包丢弃。即只允许每个ip地址对sshd服务建立2个连接。第3个连接请求将被拒绝。

    25.启用网卡转发
        #vim /etc/sysctl.conf
            net.ipv4.ip_forward = 1
        #sysctl -p


    26.源地址转换。

        假设该网关内有2张网卡,enoin0的IP为192.168.10.1,enoout0的IP为 123.123.0.1,内网为192.168.10.0/24。外网服务器ip为123.123.0.5,内网主机ip为192.168.10.2。

        现允许192.168.10.2访问123.123.0.5。

        #iptables -t nat -A POSTROUTING -o enoout -s 192.168.10.0/24 -j SNAT --to-source 123.123.0.1

        假设网关上有enoout0-enoout3多块网卡,ip地址位123.123.0.1-123.123.0.4。多源地址转换需要配合负载均衡等设备配合才能正常使用,因为数据包出去的端口和回来的端口不一定相同。

        #iptables -t nat -A POSTROUTING -o enoout -s 192.168.10.0/24 -j SNAT --to-source 123.123.0.1-123.123.0.4


    27.禁止内网主机ping网关,同时开放httpd服务。
        对于网关来说,对icmp报文提供转发,不涉及其他表。

        #iptables -A FORWARD -s 192.168.10.0/24 -p icmp -j REJECT
        #iptables -A FORWARD -m state --state ESTABLISHED -j ACCETP
        #iptables -A FORWARD -m state --state NEW -s 192.168.10.0/24 --dport 80 -J ACCEPT

    28.允许内网ping网关。
        #iptables -A FORWARD -s 192.168.10.0/24 -p icmp --icmp-type 8 --m state --state NEW -J ACCEPT

    29.允许访问ftp,提前加载对应内核模块(ip_nat_ftp)
        #iptables -A FORWARD -s 192.168.10.0/24 -p tcp --dport 21 --m state --state NEW -J ACCEPT
        #iptables -R FORWARD 1 -m state --state ESTABLISHED,RELATED -j ACCEPT

    30.目标地址转换。

        网关内有2张网卡,enoin0的IP为192.168.10.1,enoout0的IP为 123.123.0.1,内网为192.168.10.0/24。外网客户端ip为123.123.0.5,内网服务器ip为192.168.10.2,端口为80。

        现允许外网客户端访问内网服务器。

        #iptables -t nat -A PREROUTING -d 123.123.0.1  -p tcp --dport 80 -j DNAT --to-destination 192.168.10.2

    31.端口转换。

        接上题,192.16.10.1的httpd端口为8080。
        #iptables -t nat -R PREROUTING 1 -d 123.123.0.1  -p tcp --dport 80 -j DNAT --to-destination 192.168.10.2:8080

    32.接上题,在网关上使用字符串匹配,丢弃包含test字符串的数据包。
        #iptables -A FORWARD   -m string --algo kmp --string “test” -j DROP

    33.假设192.168.10.2为内网主机,123.123.0.1为外网网关 。

        使用l7扩展在8点到12点禁用qq
        #iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT -to-source 123.123.0.1
        #iptables -A  FORWARD  -s 192.168.10.0/24 -m layer7 --l7proto  qq  -m time --timestart 08:00 --timestop 12:00  -j REJECT