iptables

一. 防火墙概述
    1. 防火墙简介
    Linux防火墙全称:netfilter/iptables
    netfilter/iptables是unix/Linux(2.4版本内核后)自带的一款优秀且免费的基于包过滤的防火墙工具。
 
    netfilter组件也称为内核空间(kernelspace),是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。
 
    iptables是一种组件工具,也称为用户空间(userspace),它使插入、修改和除去信息包过滤表中的规则变得容易。
 
    2. 包过滤防火墙
    在网络层对数据包进行控制,主要对数据包所使用的协议、端口、源地址、目标地址等参数来进行过滤。
 
二. iptables基本概念和使用
    1. iptables简介
    iptables有3个表:
 
表名:       包过滤filter          网络地址转换nat        数据包打标记mangle   
表动作          INPUT              PREROUTING               PREROUTING              
              FORWARD             POSTROUTING              INPUT                    
             OUTPUT               OUTPUT                  FORWARD
                                                      OUTPUT
                                                       POSTROUTING
 
 2. iptables命令参数
        -A  增加一条规则,默认就是在后面增加,append追加
        -D  删除
        -L  列出规则 
        -n   以数值显示 
        -I   在最前面插入规则 
        -v   显示统计数据,与-L  -n一起用,看到的信息更多
         
        -F  清空规则
        -t   后接表名
        -P   policy,默认策略
        -p   后接协议名  tcp  udp  icmp
 
        --dport     目标端口
        --sport     源端口
        -d  目标地址
        -s  源地址
 
 
        -i  接网卡接口, 进入的网卡接口
        -o  接网卡接口, 出去的网卡接口
        -j  后接动作
 
        动作的分类
        ACCEPT      接收数据包
        DROP        丢弃数据包
        REJECT      拒绝数据包,和DROP的区别就是REJECT会返回错误信息,DROP不会
        MASQUEREAD  IP地址伪装,使用NAT转换成外网IP,可以PPP拔号(外网IP不固定情况)
        SNAT        源地址转换,它与MASQUEREAD的区别是SNAT是接一个固定IP
        DNAT            目标地址转换
        LOG         记录日志
 
    iptables -A参数  -p 协议 -j 动作
 
3. 查看配置规则
    iptables -n -v -L --line-number -t filter
    iptables -n -v -L --line-number -t nat
    iptables -n -v -L --line-number -t mangle
     
    --line-number 可以简写成 --line
     
    如果执行iptables命令时不接 -t 表名,防火阅默认使用filter表
 
    参数说明:
    -n ip地址以数值显示
    -v 详细信息
    -L --list,列表
    --line-number   规则的行号
    --line
    -t 表,表有:filter、nat、mangle三个表
 
 4. 添加规则
      -A            追加规则
      -I            在最前面插入
 
    例:对ping的控制
 
    ICMP协议传输过程是双向的,可以对其input或ouput都可以控制
 
    # iptables  -A INPUT -p icmp -j REJECT              --可以不加-t filter,默认就是对此表进行操作
    # iptables -t filter -A INPUT -p icmp -j REJECT         --拒绝ping,但别人ping你有返回信息,会告诉他你拒绝了
    # iptables -t filter -A OUTPUT -p icmp -j REJECT        --拒绝ping,但你ping出去时会返回信息,会告诉你拒绝ping
    # iptables -t filter -A INPUT -p icmp -j DROP           --拒绝ping,无论是你ping出去,还是别人ping进来都没有返回信息
    # iptables -t filter -A OUTPUT -p icmp -j DROP          --拒绝ping
    --以上的操作没有写针对谁来控制,默认是所有人
     
 
    # iptables -t filter -A INPUT -p icmp -s 192.168.1.0/24 -j DROP
    # iptables -t filter -A OUTPUT -p icmp -d 192.168.1.0/24 -j DROP
    --这两条其中任意一条都是可以控制192.168.1.0/24这个网段ping不通本机
 
 
 
 
    只允许 192.168.1.70 ping本地,其它都拒绝
    # iptables -t filter -A INPUT -p icmp -j REJECT
    # iptables -t filter -A INPUT -s 192.168.1.70 -p icmp -j ACCEPT
        --错误写法,因这里是写先拒绝所有,再允许192.168.1.79ping,这是错误的
 
 
    # iptables -t filter -A INPUT -s 192.168.1.70 -p icmp -j ACCEPT
    # iptables -t filter -A INPUT -p icmp -j REJECT
        --正确写法,要先允许谁,再拒绝所有
 
 
    --如果要把一条规则加到前面,使用 -I参数  
    # iptables -t filter -A INPUT -p icmp -j REJECT
    # iptables -t filter -I INPUT -s 192.168.1.70 -p icmp -j ACCEPT
        --正确写法
 
 
    # iptables -t filter -I INPUT 2 -s 192.168.1.36 -p icmp -j ACCEPT
    --把这一条加为第2条(指定数字为第几条)
 
    ------------------------------------------------
    规则就是一个访问控制列表(ACL),读取的顺序是从上往下一条一条匹配,匹配一条就不继续往下匹配,所以正确写法应该是把刚才允许192.168.1.70的写到最前面
    -----------------------------------------------
 
5. 删除规则
    方法一:
    # iptables -t filter -D  INPUT -s 192.168.1.35  -p icmp -j ACCEPT
        --加的时候怎么写,删除时就要怎么写  A 参数换成 D就可以
    方法二;  
    # iptables -L -n  --line            
    # iptables  -D INPUT  2
    --在规则比较多或者不好写规则的情况下,可以先用--line或者--line-number列出行号,再用行号删除
 
    方法三:
    # iptables -t filter -F   
    --直接清空filter表的所有规则
 
 
6. 修改规则(用的少)
    将第三行规则改为ACCEPT
    # iptables -R INPUT 3 -j ACCEPT
 
 
 
7. 规则的保存与还原
    # /etc/init.d/iptables save         --这样是默认保存到/etc/sysconfig/iptables
    # iptables-save > /etc/sysconfig/iptables        --将当前规则保存到这个文件,文件可以自定义
 
    # iptables -F
    --清空filter表,如果别的表也要清空的话,就加-t 表名都清一次
 
    # iptables-restore < /etc/sysconfig/iptables --把保存的规则还原回去
 
    重启iptables服务,会加载/etc/sysconfig/iptables,
 
 8. 修改默认策略
    # iptables -P INPUT DROP    --INPUT键默认策略改为DROP,改回来把DROP换成ACCEPT就行了
    # iptables -P OUTPUT DROP   --OUTPUT键默认策略改为DROP
     
     
    下面两条定义允许ssh进来
    # iptables -A INPUT -p tcp  -s 192.168.1.70 --dport 22 -j ACCEPT
               进来      协议    从哪来              连接本机的22端口      接受
 
    下面两条定义允许ssh出去
    # iptables -A OUTPUT -p tcp -d 192.168.1.70 --sport 22 -j ACCEPT
               出去      协议    到哪去          本机的22端口出去     接受
 
    示例:在上例的基础上允许ping自己的IP,本地回环127.0.0.1和192.168.1.151
 
    下面两条自己ping通自己
    # iptables -A INPUT -i lo -p icmp -j ACCEPT
    # iptables -A OUTPUT -o lo -p icmp -j ACCEPT   
 
 
    下面两条定义此服务器和70这台机器可以互ping
    # iptables -A INPUT -p icmp -s 192.168.1.70 -j ACCEPT
    # iptables -A OUTPUT -p icmp -d 192.168.1.70 -j ACCEPT
 
    示例:在上面的基础上再加上只允许192.168.1.0/24这个网段访问你的httpd服务
    iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 80 -j ACCEPT
    iptables -A OUTPUT -p tcp -d 192.168.1.0/24 --sport 80 -j ACCEPT
 
    示例:在上面的基础上再加上允许别人访问本台服务器的8080端口
    只需要做udp的53端口就可以了,不用写tcp 53(因为tcp 53主要是用于主从DNS服务器同步的)
    iptables -A INPUT -p udp -s 192.168.1.0/24 --dport 53 -j ACCEPT
    iptables -A OUTPUT -p udp -d 192.168.1.0/24 --sport 53 -j ACCEPT
 
 9. 规则特殊的写法
    连续端口
    iptables -A INPUT -p tcp --dport 1:1000 -j ACCEPT           --端口1到1000都接受
    iptables -A INPUT -p tcp -m multiport  --dport 22,80,110 -j ACCEPT  -- m参数,接受多个端口
 
    硬件地址   
    iptables -A INPUT -m mac --mac-source 00:23:CD:95:DA:0B -p all  --dport 80 -j ACCEPT
    iptables -A OUTPUT -p tcp -d 192.168.1.0/24 --sport 80 -j ACCEPT
    mac-source不能用于OUTPUT链
 
 10. 示例
    示例:FTP
    主动  被动
 
    用iptables实现ftp的主动模式能够访问
 
    下面两句实现的是命令端口的连接
    # iptables -A INPUT -p tcp --dport 21 -j ACCEPT
    # iptables -A OUTPUT -p tcp --sport 21 -j ACCEPT
        --不加这两句,客户端访问时都不能登录,加了后可以登录,但用ls列出ftp的共享信息的话就发现不行,这是因为20的数据端口还没有做规则
 
    # iptables -A INPUT -p tcp --dport 20 -j ACCEPT
    # iptables -A OUTPUT -p tcp --sport 20 -j ACCEPT
        --主动模式是20端口去主动连接,所以上面两条,实现了主动模式的连接,注意:如果使用linux的ftp命令来做实验的话,注意登录后使用passive命令关掉被动模式再试验
 
    被动模式
    客户端连接服务器的随机端口
 
    vim /etc/vsftpd/vsftpd.conf
    在最后加上
    pasv_enable=YES
    pasv_min_port=3000
    pasv_max_port=3100      --最小端口范围和最大端口范围可以自定义
 
    /etc/init.d/vsftpd  restart  --重启服务
 
    下面两句就是针对上面的被动配置来设置的允许规则
    # iptables -A INPUT -p tcp --dport 3000:3100 -j ACCEPT 
    # iptables -A OUTPUT -p tcp --sport 3000:3100 -j ACCEPT 
 
     
    示例:nfs
    --因为nfs用到rpc调用,端口不固定,所以需要把端口给固定起来.nis服务也会用到rpc调用,也需要做端口绑定
 
    vim /etc/sysconfig/nfs     --在此文件里加上下面四句
    LOCKD_TCPPORT=3000
    LOCKD_UDPPORT=3000
    MOUNTD_PORT=3001
    STATD_PORT=3002
 
    /etc/init.d/nfs restart
    /etc/init.d/portmap restart --这里先把默认策略改成ACCEPT,再启动就可以启动起来,然后再把默认策略改回成DROP,再继续做下面的实验
 
    netstat -ntl |grep 300   去查看,看到rpc.的守护进程的端口为自己绑定的端口
 
 
    iptables -A INPUT -p tcp  --dport 3000:3002 -j ACCEPT
    iptables -A OUTPUT -p tcp  --sport 3000:3002 -j ACCEPT
    iptables -A INPUT -p udp  --dport 3000:3002 -j ACCEPT
    iptables -A OUTPUT -p udp  --sport 3000:3002 -j ACCEPT
 
 
 
    还要加上2049(nfs)和111(rpcbind)的端口的规则
 
 
    iptables -A  INPUT -p tcp  --dport 2049 -j ACCEPT
    iptables -A  OUTPUT -p tcp  --sport 2049 -j ACCEPT
    iptables -A  INPUT -p udp  --dport 2049 -j ACCEPT
    iptables -A  OUTPUT -p udp  --sport 2049 -j ACCEPT
 
 
    iptables -A  INPUT -p tcp  --dport 111 -j ACCEPT
    iptables -A  OUTPUT -p tcp  --sport 111 -j ACCEPT
    iptables -A  INPUT -p udp  --dport 111 -j ACCEPT
    iptables -A  OUTPUT -p udp  --sport 111 -j ACCEPT

  

posted @ 2019-12-18 21:55  MlxgzZ  阅读(731)  评论(0编辑  收藏  举报