zoukankan      html  css  js  c++  java
  • iptables服务器主机防火墙

    iptables参数说明:

    Commands:
    Either long or short options are allowed.
      --append  -A chain                       链尾部追加一条规则
      --delete  -D chain                       从链中删除能匹配到的规则
      --delete  -D chain rulenum               从链中删除第几条链,从1开始计算
      --insert  -I chain [rulenum]             向链中插入一条规则使其成为第rulenum条规则,从1开始计算
      --replace -R chain rulenum               替换链中的地rulenum条规则,从1开始计算
      --list    -L [chain [rulenum]]           列出某条链或所有链中的规则
      --list-rules -S [chain [rulenum]]        打印出链中或所有链中的规则
      --flush   -F [chain]                     删除指定链或所有链中的所有规则
      --zero    -Z [chain [rulenum]]           置零指定链或所有链的规则计数器
      --new     -N chain                       创建一条用户自定义的链
      --delete-chain  -X [chain]               删除用户自定义的链
      --policy  -P chain target                设置指定链的默认策略(policy)为指定的target
      --rename-chain  -E old new               重命名链名称,从old到new
    
    Options:
    [!] --proto  -p proto                      指定要检查哪个协议的数据包:可以是协议代码也可以是协议名称,
                                               如tcp,udp,icmp等。协议名和代码对应关系存放在/etc/protocols中
                                               省略该选项时默认检查所有协议的数据包,等价于all和协议代码0
    [!] --source -s address[/mask][...]        指定检查数据包的源地址,或者使用"--src"
    [!] --destination -d address[/mask][...]   指定检查数据包的目标地址,或者使用"--dst"
    [!] --in-interface  -i input name[+]       指定数据包流入接口,若接口名后加"+",表示匹配该接口开头的所有接口
    [!] --out-interface -o output name[+]      指定数据包流出接口,若接口名后加"+",表示匹配该接口开头的所有接口
      --jump        -j target                  为规则指定要做的target动作,例如数据包匹配上规则时将要如何处理
      --goto        -g chain                   直接跳转到自定义链上
      --match       -m match                   指定扩展模块
      --numeric     -n                         输出数值格式的ip地址和端口号。默认会尝试反解为主机名和端口号对应的服务名
      --table       -t table                   指定要操作的table,默认table为filter
      --verbose     -v                         输出更详细的信息
      --line-numbers                           当list规则时,同时输出行号
      --exact       -x                         默认统计流量时是以1000为单位的,使用此选项则使用1024为单位
    
    -p tcp 子选项
      子选项:
        [!] --source-port,--sport port[:port]
              指定源端口号或源端口范围。指定端口范围时格式为"range_start:range_end",最大范围为0:65535。
        [!] --destination-port,--dport port[:port]
              指定目标端口号或目标端口号范围。
        [!] --tcp-flags mask comp
              匹配已指定的tcp flags。mask指定的是需要检查的flag列表,comp指定的是必须设置的flag。
              有效的flag值为:SYN ACK FIN RST URG PSH ALL NONE。
              如果以0和1来表示,意味着mask中comp指定的flag必须为1其余的必须为0。
              例如:iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST SYN
              表示只匹配设置了SYN=1而ACK、FIN和RST都为0数据包,也即只匹配TCP三次握手的第一次握手。
        [!] --syn
             是"--tcp-flags SYN,ACK,FIN,RST SYN"的简写格式。
     
    -p udp 子选项
      子选项:
        [!] --source-port,--sport port[:port]
              指定源端口号或源端口范围。指定端口范围时格式为"range_start:range_end",最大范围为0:65535。
        [!] --destination-port,--dport port[:port]
              指定目标端口号或目标端口号范围。
     
    -p icmp 子选项
      子选项:
        [!] --icmp-type {type[/code]|typename}
              用于指定ICMP类型,可以是ICMP类型的数值代码或类型名称。有效的ICMP类型
              可由iptables -p icmp -h获取。常用的是"echo-request"和"echo-reply",分别
              表示ping和pong,数值代号分别是8和0
              ping时先请求后响应:ping别人先出去8后进来0;别人ping自己,先进来8后出去0

    注意:

    "-m"选项指定的是显式扩展。其实隐式扩展也是要指定扩展名的,只不过默认已经知道所使用的扩展,于是可以省略。例如:-p tcp --dport =  -p tcp -m tcp --dport。

    常用的扩展和它们常用的选项如下:

    (1).iprange:匹配给定的IP地址范围。

    [!] --src-range from[-to]:匹配给定的源地址范围
    [!] --dst-range from[-to]:匹配给定的目标地址范围

    (2).multiport:离散的多端口匹配模块,如将212280三个端口的规则合并成一条。

    最多支持写15个端口,其中"555:999"算2个端口。只有指定了-p tcp或-p udp时该选项才生效。

    [!] --source-ports,--sports port[,port|,port:port]...
    [!] --destination-ports,--dports port[,port|,port:port]...
    [!] --ports port[,port|,port:port]... :不区分源和目标,只要是端口就行

    (3).state:状态扩展。结合ip_conntrack追踪会话的状态。

    [!] --state state

    其中state有如下4种:

      INVALID:非法连接(如syn=1 fin=1)
      ESTABLISHED:数据包处于已建立的连接中,它和连接的两端都相关联
      NEW:新建连接请求的数据包,且该数据包没有和任何已有连接相关联
      RELATED:表示数据包正在新建连接, 但它和已有连接是相关联的(如被动模式的ftp的命令连接和数据连接)

    例如:-m state --state NEW,ESTABLISHED -j ACCEPT

    关于这4个状态,在下文还有更详细的描述。

    (4).string:匹配报文中的字符串。

    --algo {kmp|bm}:两种算法,随便指定一种
    --string "string_pattern"

    如:

    iptables -A OUTPUT -m string --algo bm --sting "taobao.com" -j DROP

    (5).mac:匹配MAC地址,格式必须为XX:XX:XX:XX:XX:XX

    [!] --mac-source address

    (6).limit:使用令牌桶(token bucket)来限制过滤连接请求数。

    --limit RATE[/second/minute/hour/day]:允许的平均数量。如每分钟允许10次ping,即6秒一次ping。默认为3/hour。
    --limit-burst:允许第一次涌进的并发数量。第一次涌进超出后就按RATE指定数来给出响应。默认值为5。

    例如:允许每分钟6次ping,但第一次可以ping 10次。10次之后按照RATE计算。所以,前10个ping包每秒能正常返回,从第11个ping包开始,每10秒允许一次ping:iptables -A INPUT -d ServerIP -p icmp --icmp-type 8 -m limit --limit 6/minute --limit-burst 10 -j ACCEPT

    (7).connlimit:限制每个客户端的连接上限。

    --connlimit-above n:连接数量高于上限n个时就执行TARGET

    如最多只允许某ssh客户端建立3个ssh连接,超出就拒绝。两种写法:

    iptables -A INPUT -d ServerIP -p tcp --dport 22 -m connlimit --connlimit-above 3 -j DROP
    iptables -A INPUT -d ServerIP -p tcp --dport 22 -m connlimit ! --connlimit-above 3 -j  ACCEPT

    这个模块虽然限制能力不错,但要根据环境计算出网页正常访问时需要建立的连接数,另外还要考虑使用NAT转换地址时连接数会翻倍的问题。

    "-j"是指定的target,target表示对匹配到的数据包要做什么处理,比如丢弃DROP、拒绝REJECT、接受ACCEPT等,除这3个target外,还支持很多种target。以下是其中几种:

    DNAT:目标地址转换
    SNAT:源地址转换
    REDIRECT:端口重定向
    MASQUERADE:地址伪装(其实也是源地址转换)
    RETURN:用于自定义链,自定义链中匹配完毕后返回到自定义的前一个链中继续向下匹配
    

    iptables命令实战:

    企业服务器主机配置防火墙(filter表:INPUT,OUTPUT,FORWARD链步骤

    1.置零所有规则和计数器:

    iptables -F
    iptables -X
    iptables -Z
    

    2.根据企业实际情况配置好允许规则,并允许回环接口 lo(-i/-o),如下:

    iptables -t filter -A INPUT -p tcp --dport 22 -s 10.0.0.0/24 -j ACCEPT
    iptables -t filter -A INPUT -i lo -j ACCEPT
    iptables -t filter -A OUTPUT -o lo -j ACCEPT  

    3.设置默认的防火墙允许和禁止规则(使用-P或--policy参数设置默认规则):

     iptables -P INPUT DROP            #<== -P参数是添加默认规则至最后
     iptables -P OUTPUT ACCEPT 
     iptables -P FORWARD DROP

    4.使用 iptables-save命令将内存中配置写入配置文件(直接编辑配置文件/etc/sysconfig/iptables也可以)

    iptables-save       #<==保存规则
    /etc/init.d/iptables restart
    iptables-restore    #<==恢复规则,后面可以用文件标准输入 <文件
    iptables -L -n --line-number

    提示:更好的方法是,第一次使用iptables时,将脚本所有需要用到的规则添加至文件 /etc/sysconfig/iptables,以后就直接编辑文件修改使用即可。

    iptables脚本参考,生产环境根据实际调整使用(来自老男孩老师QQ49000448):

    #!/bin/bash
    #this is a server firewall created by oldboy 17:03 2006-7-26
    #updated by oldboy on 10:30 2009-6-23
    #http://blog.etiantian.org
    #qq:49000448
    #define variable PATH
    
    IPT=/sbin/iptables
    
    #Remove any existing rules
    $IPT -F
    $IPT -X
    $IPT -Z
    #setting default firewall policy
    $IPT --policy OUTPUT ACCEPT
    $IPT --policy FORWARD DROP
    $IPT -P INPUT DROP
    
    #setting for loopback interface
    $IPT -A INPUT -i lo -j ACCEPT
    $IPT -A OUTPUT -o lo -j ACCEPT
    
    # Source Address Spoofing and Other Bad Addresses
    $IPT -A INPUT -i eth0 -s 172.16.0.0/12 -j DROP
    $IPT -A INPUT -i eth0 -s 0.0.0.0/8 -j DROP
    $IPT -A INPUT -i eth0 -s 169.254.0.0/16 -j DROP
    $IPT -A INPUT -i eth0 -s 192.0.2.0/24 -j DROP
    
    # prevent all Stealth Scans and TCP State Flags
    $IPT -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
    # All of the bits are cleared
    $IPT -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
    $IPT -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
    #SYN and RST are both set
    $IPT -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
    # SYN and FIN are both set
    $IPT -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
    # FIN and RST are both set
    $IPT -A INPUT -p tcp --tcp-flags FIN,RST FIN,RST -j DROP
    # FIN is the only bit set, without the expected accompanying ACK
    $IPT -A INPUT -p tcp --tcp-flags ACK,FIN FIN -j DROP
    # PSH is the only bit set, without the expected accompanying ACK
    $IPT -A INPUT -p tcp --tcp-flags ACK,PSH PSH -j DROP
    # URG is the only bit set, without the expected accompanying ACK
    $IPT -A INPUT -p tcp --tcp-flags ACK,URG URG -j DROP
    
    #setting access rules
    #one,ip access rules,allow all the ips of 
    $IPT -A INPUT -s 202.81.17.0/24 -p all -j ACCEPT
    $IPT -A INPUT -s 202.81.18.0/24 -p all -j ACCEPT
    $IPT -A INPUT -s 124.43.62.96/27 -p all -j ACCEPT
    $IPT -A INPUT -s 192.168.1.0/24 -p all -j ACCEPT
    $IPT -A INPUT -s 10.0.0.0/24 -p all -j ACCEPT
    
    #second,port access rules
    #nagios
    $IPT -A INPUT -s 192.168.1.0/24 -p tcp --dport 5666 -j ACCEPT
    $IPT -A INPUT -s 202.81.17.0/24 -p tcp --dport 5666 -j ACCEPT
    $IPT -A INPUT -s 202.81.18.0/24 -p tcp --dport 5666 -j ACCEPT
    
    #db
    $IPT -A INPUT -s 192.168.1.0/24 -p tcp --dport 3306 -j ACCEPT
    $IPT -A INPUT -s 192.168.1.0/24 -p tcp --dport 3307 -j ACCEPT
    $IPT -A INPUT -s 192.168.1.0/24 -p tcp --dport 3308 -j ACCEPT
    $IPT -A INPUT -s 192.168.1.0/24 -p tcp --dport 1521 -j ACCEPT
    
    #ssh difference from other servers here.>>
    $IPT -A INPUT -s 202.81.17.0/24 -p tcp --dport 52113 -j ACCEPT
    $IPT -A INPUT -s 202.81.18.0/24 -p tcp --dport 52113 -j ACCEPT
    $IPT -A INPUT -s 124.43.62.96/27 -p tcp --dport 52113 -j ACCEPT
    $IPT -A INPUT -s 192.168.1.0/24 -p tcp --dport 52113 -j ACCEPT
    $IPT -A INPUT -p tcp --dport 22 -j ACCEPT
    #ftp
    #$IPT -A INPUT -p tcp --dport 21 -j ACCEPT
    
    #http
    $IPT -A INPUT -p tcp --dport 80 -j ACCEPT
    $IPT -A INPUT -s 192.168.1.0/24 -p tcp -m multiport --dport 8080,8081,8082,8888,8010,8020,8030,8150 -j ACCEPT
    $IPT -A INPUT -s 202.81.17.0/24 -p tcp -m multiport --dport 8080,8081,8082,8888,8010,8020,8030,8150 -j ACCEPT
    $IPT -A INPUT -s 124.43.62.96/27 -p tcp -m multiport --dport 8080,8081,8082,8888,8010,8020,8030,8150 -j ACCEPT
    
    #snmp
    $IPT -A INPUT -s 192.168.1.0/24 -p UDP --dport 161 -j ACCEPT 
    $IPT -A INPUT -s 202.81.17.0/24 -p UDP --dport 161 -j ACCEPT 
    $IPT -A INPUT -s 202.81.18.0/24 -p UDP --dport 161 -j ACCEPT
    
    #rsync
    $IPT -A INPUT -s 192.168.1.0/24 -p tcp -m tcp --dport 873 -j ACCEPT
    $IPT -A INPUT -s 202.81.17.0/24 -p tcp -m tcp --dport 873 -j ACCEPT
    $IPT -A INPUT -s 202.81.18.0/24 -p tcp -m tcp --dport 873 -j ACCEPT
    $IPT -A INPUT -s 124.43.62.96/27 -p tcp -m tcp --dport 873 -j ACCEPT
    
    #nfs 2049,portmap 111
    $IPT -A INPUT -s 192.168.1.0/24 -p udp -m multiport --dport 111,892,2049 -j ACCEPT 
    $IPT -A INPUT -s 192.168.1.0/24 -p tcp -m multiport --dport 111,892,2049 -j ACCEPT
    
    #icmp
    #$IPT -A INPUT -p icmp -m icmp --icmp-type any -j ACCEPT
    $IPT -A INPUT -s 124.43.62.96/27 -p icmp -m icmp --icmp-type any -j ACCEPT
    $IPT -A INPUT -s 192.168.1.0/24 -p icmp -m icmp --icmp-type any -j ACCEPT
    #others RELATED
    $IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
    $IPT -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

    注意:ftp服务器配置防火墙需允许关联的状态包通过.,并且需安装模块 nf_conntrack_ftp(写入配置文件/etc/rc.local 中最好,开机就自动加载)

    modprobe nf_conntrack_ftp      #<==此模块与state状态相关
    iptables -A INPUT -d 10.0.0.2 -p tcp --dport 21 -m state --state=NEW,ESTABLISHED -j ACCEPT                
    iptables -A OUTPUT -s 10.0.0.2 -m state --state=ESTABLISHED -j ACCEPT 
    

     更多iptables知识,原理以及TCP协议三次握手,四次挥手,如需深入了解,可参考博客

    http://www.cnblogs.com/f-ck-need-u/p/7397146.html

    https://www.cnblogs.com/kevingrace/p/6265113.html

  • 相关阅读:
    java解析xml实例——获取天气信息
    Wordpress可以用来做什么?
    Unity3D 快捷键
    Unity3D 快捷键
    OAuth和OpenID的区别
    OAuth和OpenID的区别
    PHP中require和include的区别
    PHP中require和include的区别
    iOS检测QQ是否安装
    iOS检测QQ是否安装
  • 原文地址:https://www.cnblogs.com/blog-tim/p/10274124.html
Copyright © 2011-2022 走看看