iptables使用示例

 

iptables应用

 

环境 centos7

  • iptables-services安装

    [root@localhost ~]# yum -y install 1 iptables-services
    #centos7系统中默认存在iptables命令,此命令仅为简单查询及操作命令,不包含配置文件,安装iptablesservices后,将直接生成配置文件,便于配置保存。包含ipv4及ipv6。
  • 设置服务开启

    [root@localhost ~]# systemctl start iptables.service
  • 设置开机自启动

    [root@localhost ~]# systemctl enable iptables.services
  • 查看配置文件

    [root@localhost ~]# rpm -ql iptables-services
  • 保存规则

    [root@localhost ~]# iptables-save > /etc/1 sysconfig/iptables
  • 重载

    [root@localhost ~]#iptables-restore < /etc/sysconfig/iptables
  • 基本配置

    iptables -F
    #删除现有规则
    
    iptables -P INPUT DROP
    iptables -P FORWARD DROP
    iptables -P OUTPUT DROP
    #配置默认链策略
  • 案例:白名单

    [root@localhost ~]# iptables -t filter -F
    [root@localhost ~]# iptables -P INPUT DROP
    [root@localhost ~]# iptables -t filter -I INPUT -p tcp --dport=22 -j ACCEPT
    [root@localhost ~]# iptables -t filter -I INPUT -p tcp --dport=80 -j ACCEPT
  • 案例:黑名单

    [root@localhost ~]# iptables -P INPUT ACCEPT
    [root@localhost ~]# iptables -F
    [root@localhost ~]# iptables -t filter -A INPUT -s 192.168.2.20/24 -p tcp --dport 80 -j DROP
  • 案例:通过lo访问本机数据

    [root@localhost ~]# iptables -I INPUT -d 127.0.0.1 -p tcp --dport=9000 -i lo -j ACCEPT
    [root@localhost ~]# iptables -I INPUT -i lo -j ACCEPT
    #允许通过本地回环网卡访问本机
  • 案例:允许连接态产生衍生态

    [root@localhost ~]# iptables -I INPUT -m state --state ESTABLISHED,1 RELATED -j ACCEPT
  • iptables filter表应用案例

    • 案例1

      [root@localhost ~]# yum -y install httpd vsftpd sshd
      [root@localhost ~]# systemctl start httpd vsftpd sshd
      [root@localhost ~]# iptables -t filter -F
      [root@localhost ~]# iptables -I INPUT -p tcp --dport 80 -j ACCEPT
      [root@localhost ~]# iptables -I INPUT -p tcp --dport 20:21 -j ACCEPT
      [root@localhost ~]# iptables -I INPUT -p tcp --dport 22 -j ACCEPT
      [root@localhost ~]# iptables -A INPUT -j REJECT
      #在存问题
      本机无法访问本机
      例如:ping 127.0.0.1
      解决方法
      [root@localhost ~]# iptables -I INPUT -i lo -j ACCEPT
      本机无法访问其它主机
      例如:ssh remote_host
      解决方法
      [root@localhost ~]# iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
      FTP无法访问 解决方法1: [root@localhost ~]# iptables -I INPUT -p tcp --dport 20:21 -j ACCEPT [root@localhost ~]# vim /etc/vsftpd/vsftpd.conf pasv_min_port=50000 pasv_max_port=60000 [root@localhost ~]# iptables -I INPUT -p tcp --dport 50000:60000 -j ACCEPT 解决方法2:使用连接追踪模块 [root@localhost ~]# iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT [root@localhost ~]# iptables -I INPUT -p tcp --dport 20:21 -j ACCEPT [root@localhost ~]# modprobe nf_conntrack_ftp #临时方法,添加连接追踪模块 [root@localhost ~]# vim /etc/sysconfig/iptables-config IPTABLES_MODULES="nf_conntrack_ftp" #启动服务时加载 #针对数据端口连接时,将三次握手第一次状态由NEW识别为RELATED
    • 案例2:iptables标准流程

      [root@localhost ~]# iptables -F
      [root@localhost ~]# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
      [root@localhost ~]# iptables -A INPUT -i lo -j ACCEPT
      [root@localhost ~]# iptables -A INPUT -s 192.168.2.0/24 -j ACCEPT #允许内网任何访问
      [root@localhost ~]# iptables -A INPUT -p tcp --syn --dport 80 -j ACCEPT
      [root@localhost ~]# iptables -A INPUT -p tcp --syn --dport 22 -j ACCEPT
      [root@localhost ~]# iptables -A INPUT -p tcp --syn --dport 21 -j ACCEPT
      [root@localhost ~]# iptables -A INPUT -j REJECT
      [root@localhost ~]# modprobe nf_conntrack_ftp
      [root@localhost ~]# iptables-save > /etc/sysconfig/iptables
      [root@localhost ~]# vim /etc/sysconfig/iptables-config
      IPTABLES_MODULES="nf_conntrack_ftp"
    • 案例3:扩展匹配

      #-m icmp [root@localhost ~]# iptables -F [root@localhost ~]# iptables -t filter -I INPUT -p icmp -m icmp --icmp-type echo-reply -j ACCEPT #允许ping回应 [root@localhost ~]# iptables -A INPUT -j REJECT
      #-m iprange [root@localhost ~]# iptables -t filter -I INPUT -m iprange --src-range 192.168.2.10-192.168.2.100 -j REJECT
      #-m multiport [root@localhost ~]# iptables -t filter -I INPUT -p tcp -m multiport --dports 20,21,22,25,80,110 -j ACCEPT
      #-m tos 根据ip协议头部 type of service进行过滤 [root@localhost ~]# iptables -F [root@localhost ~]# tcpdump -i eth0 -nn port 22 -vvv
      #抓取远程主机访问本机的ssh数据包,观察TOS值 [root@localhost ~]# tcpdump -i eth0 -nn port 22 -vvv
      #抓取远程从本机rsync或scp复制文件,观察TOS值 #ssh: tos 0x0 0x10 #scp: tos 0x0 0x8 #rsync: tos 0x0 0x8 [root@localhost ~]# iptables -t filter -A INPUT -p tcp --dport 22 -m tos --tos 0x10 -j ACCEPT [root@localhost ~]# iptables -t filter -A INPUT -j REJECT
      #-m tcp 按TCP控制位进行匹配 Flags:SYN ACK FIN RST URG PSH ALL NONE [root@localhost ~]# iptables -t filter -A INPUT -p tcp -m tcp --tcp-flags SYN,ACK,FIN,RST SYN --dport 80 -j ACCEPT [root@localhost ~]# iptables -t filter -A INPUT -p tcp --syn --dport 80 -j ACCEPT
      #--tcp-flags SYN,ACK,FIN,RST SYN 检查四个标记位,只有SYN标记位才匹配,即只允许三次握手中的第一次握手,等价于--syn
      #-m comment 对规则进行备注说明 [root@localhost ~]# iptables -A INPUT -s 192.168.2.250 -m comment --comment "cloudhost" -j REJECT
      #-m mark 使用mangle表的标记方法,配合mangle表使用 [root@localhost ~]# iptables -t filter -A INPUT -m mark 2 -j REJECT

    • 案例4:扩展动作

      #-j LOG 记录至日志中
      [root@localhost ~]# grep 'kern.*' /etc/rsyslog.conf 
      #添加kern.* /var/log/kernel.log
      [root@localhost ~]# systemctl restart rsyslog
      [root@localhost ~]# iptables -j LOG -h
      [root@localhost ~]# iptables -t filter -A INPUT -p tcp --syn --dport 22 -j LOG --logprefix " localhost_ssh "
      [root@localhost ~]# iptables -t filter -A INPUT -p tcp --syn --dport 22 -j ACCEPT
      [root@localhost ~]# iptables -t filter -A INPUT -j REJECT
      
      #-j REJECT
      当访问一个未开启的TCP端口时,应该返回一个带有RST标记的数据包
      当访问一个未开启的UDP端口,结果返回port xxx unreachable
      当访问一个开启的TCP端口,但被防火墙REJECT,结果返回port xxx unreachable
      [root@localhost ~]# iptables -j REJECT -h
      [root@localhost ~]# iptables -t filter -A INPUT -p tcp --dport 22 -j REJECT --rejectwith
      tcp-reset //返回一个自定义消息类型
      
      
      #-j MARK 进行标记,可在LVS调度器中应用
      [root@localhost ~]# iptables -t mangle -L
      [root@localhost ~]# iptables -j MARK -h
      [root@localhost ~]# iptables -t mangle -A PREROUTING -s 192.168.2.110 -j MARK --setmark 1
      [root@localhost ~]# iptables -t mangle -A PREROUTING -s 192.168.2.25 -j MARK --setmark 2
      [root@localhost ~]# iptables -t filter -A INPUT -m mark --mark 1 -j ACCEPT //按照标记匹配
      [root@localhost ~]# iptables -t filter -A INPUT -m mark --mark 2 -j REJECT
  • iptables nat表应用案例

    • nat表作用

      • 导流
    • nat表作用位置

      • KVM或OpenStack中虚拟机或云主机与外部通信
      • Docker管理的容器与外部通信
    • nat表规则动作所对应的链

      • SNAT 源地址转换 应用于出口POSTROUTING
      • MASQUERADE 源地址转换 应用于出口POSTROUTING
      • DNAT 目标地址转换 应用于进口PREROUTING
      • REDIRECT 端口重定向 应用于进口PREROUTING
    • 开启路由转发功能

      [root@localhost ~]# sysctl -a | grep ip_forward
      net.ipv4.ip_forward = 1
      [root@localhost ~]# cat /proc/sys/net/ipv4/ip_forward
      1
      #以上为开启
      #以下为关闭
      [root@localhost ~]# echo 0 > /proc/sys/net/ipv4/ip_forward
      [root@localhost ~]# cat /proc/sys/net/ipv4/ip_forward
      0
上一篇:netfilter 和一般网络中的数据包流


下一篇:Blog.043 Linux 防火墙① iptables