• iptables最常用的规则示例


    iptables v1.4.21

    iptables基础

    规则(rules)其实就是网络管理员预定义的条件,规则一般的定义为“如果数据包头符合这样的条件,就这样处理这个数据包”。规则存储在内核空间的信息包过滤表中,这些规则分别指定了源地址、目的地址、传输协议(如TCP、UDP、ICMP)和服务类型(如HTTP、FTP和SMTP)等。当数据包与规则匹配时,iptables就根据规则所定义的方法来处理这些数据包,如放行(accept)、拒绝(reject)和丢弃(drop)等。配置防火墙的主要工作就是添加、修改和删除这些规则。

    iptables和netfilter的关系:

    Iptables和netfilter的关系是一个很容易让人搞不清的问题。很多的知道iptables却不知道netfilter。其实iptables只是Linux防火墙的管理工具而已,位于/sbin/iptables。真正实现防火墙功能的是netfilter,它是Linux内核中实现包过滤的内部结构。

    iptables传输数据包的过程:    

    可以简单理解为:

    1.若数据包是发送到本机,则经过PREROUTING-->INPUT;

    2.若数据包是需要本机转发,则经过PREROUTING-->FORWORD-->POSTROUTING;

    3.若数据包是本机发出的,则要经过OUTPUT-->POSTROUTING.

    iptables的规则表和链:

    表(tables)提供特定的功能,iptables内置了4个表,即filter表、nat表、mangle表和raw表,分别用于实现包过滤,网络地址转换、包重构(修改)和数据跟踪处理。

    链(chains)是数据包传播的路径,每一条链其实就是众多规则中的一个检查清单,每一条链中可以有一条或数条规则。当一个数据包到达一个链时,iptables就会从链中第一条规则开始检查,看该数据包是否满足规则所定义的条件。如果满足,系统就会根据该条规则所定义的方法处理该数据包;否则iptables将继续检查下一条规则,如果该数据包不符合链中任一条规则,iptables就会根据该链预先定义的默认策略来处理数据包。

    规则表与链的关系

    1.filter表——三个链:INPUT、FORWARD、OUTPUT

    作用:过滤数据包  内核模块:iptables_filter.

    2.Nat表——三个链:PREROUTING、POSTROUTING、OUTPUT

    作用:用于网络地址转换(IP、端口) 内核模块:iptable_nat

    3.Mangle表——五个链:PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD

    作用:修改数据包的服务类型、TTL、并且可以配置路由实现QOS内核模块:iptable_mangle(别看这个表这么麻烦,咱们设置策略时几乎都不会用到它)

    4.Raw表——两个链:OUTPUT、PREROUTING

    作用:决定数据包是否被状态跟踪机制处理  内核模块:iptable_raw

    表的一般顺序:Raw——mangle——nat——filter。

    Commands:
      --append          -A chain                    Append to chain
      --check            -C chain                    Check for the existence of a rule
      --delete            -D chain                    Delete matching rule from chain
      --delete            -D chain rulenum           Delete rule rulenum (1 = first) from chain
      --insert             -I chain [rulenum]         Insert in chain as rulenum (default 1=first)
      --replace           -R chain rulenum          Replace rule rulenum (1 = first) in chain
      --list                 -L [chain [rulenum]]         List the rules in a chain or all chains
      --list-rules        -S [chain [rulenum]]      Print the rules in a chain or all chains
      --flush              -F [chain]                      Delete all rules in  chain or all chains
      --zero                -Z [chain [rulenum]]     Zero counters in chain or all chains
      --new                -N chain                       Create a new user-defined chain
      --delete-chain    -X [chain]                     Delete a user-defined chain
      --policy              -P chain target                 Change policy on chain to target
      --rename-chain  -E old-chain new-chain      Change chain name, (moving any references)
    
      Options:
        --ipv4                  -4                           Nothing (line is ignored by ip6tables-restore)
        --ipv6                  -6                           Error (line is ignored by iptables-restore)
    [!] --protocol           -p proto                   protocol: by number or name, eg. `tcp',‘udp’
    [!] --source             -s address[/mask][...]    source specification
    [!] --destination      -d address[/mask][...]    destination specification
    [!] --in-interface      -i input name[+]           network interface name ([+] for wildcard)
        --jump                -j target                    target for rule (may load target extension:ACCEPT, DROP, QUEUE, RETURN,MASQUERADE)
        --goto                -g chain                      jump to chain with no return
        --match             -m match                   extended match (may load extension)
        --numeric          -n                            numeric output of addresses and ports
    [!] --out-interface   -o output name[+]         network interface name ([+] for wildcard)
        --table               -t table                    table to manipulate (default: `filter')
        --verbose           -v                            verbose mode
        --wait                -w [seconds]               wait for the xtables lock
        --line-numbers                                print line numbers when listing
        --exact               -x                           expand numbers (display exact values)
    [!] --fragment        -f                            match second or further fragments only
        --modprobe=<command>                      try to insert modules using this command
        --set-counters PKTS BYTES                   set the counter during insert/append
    [!] --version           -V                            print package version.

    语法:

    iptables [-t 表名] 选项 [链名] [条件] [-j 控制类型] 参数
    -P 设置默认策略:iptables -P INPUT (DROP|ACCEPT)
    -F 清空规则链
    -L 查看规则链
    -A 在规则链的末尾加入新规则
    -I num 在规则链的头部加入新规则
    -D num 删除某一条规则
    -s 匹配来源地址IP/MASK,加叹号"!"表示除这个IP外。
    -d 匹配目标地址
    -i 网卡名称 匹配从这块网卡流入的数据
    -o 网卡名称 匹配从这块网卡流出的数据
    -p 匹配协议,如tcp,udp,icmp
    --dport num 匹配目标端口号
    --sport num 匹配来源端口号

    示例:

    1、删除现有规则

    在开始建立新的规则之前,您可能需要清理所有默认规则和现有规则。使用iptables如下所示的命令来做这个。

    iptables -F       #警告:当前命令后将切断linux对外的一切端口请求,请确保你还能连接到vnc或主机上
    (or)
    iptables --flush

    2、设置默认链策略

    默认的iptables策略是ACCEPT。将此更改为如下所示。

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

    当将INPUT和OUTPUT默认策略作为DROP时,对于每一个防火墙规则要求都应该定义两条规则。即一个INPUT和一个OUTPUT。
    如果信任内部用户,则可以忽略上面OUTPUT的设置。默认情况下,不要丢弃所有OUTPUT的数据包。在这种情况下,对于每一个防火墙规则的要求,你只需要定义一个规则。即定义规则传入,因为传出是接受所有数据包。

    3、阻止一个特定的IP地址

    在我们做其他规则前,如果你想阻止一个特定的IP地址,你应该先做如下所示。当您在日志文件中找到特定的IP地址时发现一些奇怪的活动,并希望在进一步研究时暂时阻止该IP地址,这将很有帮助。

    BLOCK_THIS_IP="192.168.1.108"
    iptables -A INPUT -s "$BLOCK_THIS_IP" -j DROP

    你也可以使用下面的一种规则。

    iptables -A INPUT -i eth0 -s "$BLOCK_THIS_IP" -j DROP           //规则禁止这个IP地址对我们服务器eth0网卡的所有连接
    iptables -A INPUT -i eth0 -p tcp -s "$BLOCK_THIS_IP" -j DROP   //规则只禁止这个IP地址对我们服务器eth0网卡的tcp协议的连接

    4.允许所有传入SSH

    以下规则允许eth0接口上的所有传入的SSH连接。

    iptables -A INPUT  -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
    iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

    5.只能从一个特定的网络允许传入的SSH

    下面的规则只允许从网络192.168.100.X传入SSH连接。

    iptables -A INPUT  -i eth0 -p tcp -s 192.168.100.0/24 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
    iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

    6.允许传入的HTTP和HTTPS

    以下规则允许所有传入的网络流量。即HTTP流量的端口80。

    iptables -A INPUT  -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
    iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT

    下面的规则允许所有传入安全的网络流量。即HTTPS流量的端口443。

    iptables -A INPUT  -i eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
    iptables -A OUTPUT -o eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT

    7.相结合多个规则使用多端口

    当你不是写为每个端口单独的规则,而是从外面的世界多个端口传入的连接,可以在一起使用多端口扩展。

    下面的示例允许所有传入SSH,HTTP和HTTPS流量。

    iptables -A INPUT  -i eth0 -p tcp -m multiport --dports 22,80,443 -m state --state NEW,ESTABLISHED -j ACCEPT
    iptables -A OUTPUT -o eth0 -p tcp -m multiport --sports 22,80,443 -m state --state ESTABLISHED -j ACCEPT

    8.允许OUTPUT SSH

    以下规则允许传出ssh连接。也就是说当你从内ssh到外部服务器。

    iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT  //允许双方新建立的OUTPUT链通信
    iptables -A INPUT  -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT      //只允许双方已经建立的INPUT链通信 

    9.允许拨出SSH到特定网络

    下面的规则只允许特定的网络传出的ssh连接。即你的SSH只有从内部网络192.168.100.0/24。

    iptables -A OUTPUT -o eth0 -p tcp -d 192.168.100.0/24 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
    iptables -A INPUT  -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

    10.允许拨出HTTPS

    以下规则允许传出安全的Web流量。当你想允许互联网流量的用户,这是很有帮助。在服务器上,当你想使用wget从外部下载一些文件,这些规则也有帮助。

    iptables -A OUTPUT -o eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
    iptables -A INPUT  -i eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT

    注:对于传出HTTP Web流量,增加两个额外的规则就像上面,并改变443 80。

    11.负载均衡传入的Web流量

    您也可以加载使用iptables防火墙规则平衡传入的网络流量。

    This uses the iptables nth extension. The following example load balances the HTTPS traffic to three different ip-address. 
    For every 3th packet, it is load balanced to the appropriate server (using the counter 0). iptables -A PREROUTING -i eth0 -p tcp --dport 443 -m state --state NEW -m nth --counter 0 --every 3 --packet 0 -j DNAT --to-destination 192.168.1.101:443 iptables -A PREROUTING -i eth0 -p tcp --dport 443 -m state --state NEW -m nth --counter 0 --every 3 --packet 1 -j DNAT --to-destination 192.168.1.102:443 iptables -A PREROUTING -i eth0 -p tcp --dport 443 -m state --state NEW -m nth --counter 0 --every 3 --packet 2 -j DNAT --to-destination 192.168.1.103:443

    12.允许从外部到内部Ping

    以下规则允许外部用户能够ping您的服务器。

    iptables -A INPUT  -p icmp --icmp-type echo-request -j ACCEPT
    iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT

    13.允许从内部到外部ping

    以下规则允许您从内部ping到任何外部服务器。

    iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
    iptables -A INPUT  -p icmp --icmp-type echo-reply -j ACCEPT

    14.允许环回访问

    您应该允许在服务器上进行完全环回访问。即使用127.0.0.1访问

    iptables -A INPUT -i lo -j ACCEPT
    iptables -A OUTPUT -o lo -j ACCEPT

    15.允许内部网络到外部网络

    在防火墙服务器上,一个以太网卡连接到外部网络,另一个以太网卡连接到内部服务器,请使用以下规则允许内部网络与外部网络通信。

    //在此示例中,eth1连接到外部网络(互联网),eth0连接到内部网络(例如:192.168.1.x)。
    iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT

    16.允许出站DNS

    以下规则允许传出DNS连接。

    iptables -A OUTPUT -p udp -o eth0 --dport 53 -j ACCEPT
    iptables -A INPUT  -p udp -i eth0 --sport 53 -j ACCEPT

    17.允许NIS连接

    如果您正在运行NIS(网络信息服务)来管理您的用户帐户,您应该允许NIS连接。即使允许SSH连接,如果您不允许NIS相关的ypbind连接,用户将无法登录。

    NIS端口是动态的。即当ypbind启动时,它分配端口。(ypbind是定义NIS服务器的客户端进程。)

    //首先做一个rpcinfo -p如下所示并获取端口号。在此示例中,它使用端口853和850。
    rpcinfo -p | grep ypbind
    
    //现在允许到端口111的入站连接,以及ypbind使用的端口。
    iptables -A INPUT -p tcp --dport 111 -j ACCEPT
    iptables -A INPUT -p udp --dport 111 -j ACCEPT
    iptables -A INPUT -p tcp --dport 853 -j ACCEPT
    iptables -A INPUT -p udp --dport 853 -j ACCEPT
    iptables -A INPUT -p tcp --dport 850 -j ACCEPT
    iptables -A INPUT -p udp --dport 850 -j ACCEPT

    以上不会工作,当你重新启动ypbind,因为它在不同的时间会有不同的端口号。

    有两个解决方案:1)使用静态ip地址为您的NIS,或2)使用一些聪明的shell脚本技术来自动抓取动态端口号从“rpcinfo -p”命令输出,并使用上述iptables规则。

    18.允许Rsync来自特定网络

    以下规则仅允许来自特定网络的rsync。

    iptables -A INPUT  -i eth0 -p tcp -s 192.168.101.0/24 --dport 873 -m state --state NEW,ESTABLISHED -j ACCEPT
    iptables -A OUTPUT -o eth0 -p tcp --sport 873 -m state --state ESTABLISHED -j ACCEPT

    19.仅允许来自特定网络的MySQL连接

    如果你正在运行MySQL,通常你不想允许从外部直接连接。在大多数情况下,您可能在运行MySQL数据库的同一服务器上运行Web服务器。

    但是DBA和开发人员可能需要使用MySQL客户端从他们的笔记本电脑和桌面直接登录到MySQL。在这种情况下,您可能希望允许内部网络直接与MySQL通信,如下所示。

    iptables -A INPUT  -i eth0 -p tcp -s 192.168.100.0/24 --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT
    iptables -A OUTPUT -o eth0 -p tcp --sport 3306 -m state --state ESTABLISHED -j ACCEPT

    20.允许Sendmail或Postfix流量

    以下规则允许邮件通信。它可以是sendmail或postfix。

    iptables -A INPUT  -i eth0 -p tcp --dport 25 -m state --state NEW,ESTABLISHED -j ACCEPT
    iptables -A OUTPUT -o eth0 -p tcp --sport 25 -m state --state ESTABLISHED -j ACCEPT

    21.允许IMAP和IMAPS

    以下规则允许IMAP / IMAP2流量。

    iptables -A INPUT -i eth0 -p tcp --dport 143 -m state --state NEW,ESTABLISHED -j ACCEPT
    iptables -A OUTPUT -o eth0 -p tcp --sport 143 -m state --state ESTABLISHED -j ACCEPT

    以下规则允许IMAPS流量。

    iptables -A INPUT -i eth0 -p tcp --dport 993 -m state --state NEW,ESTABLISHED -j ACCEPT
    iptables -A OUTPUT -o eth0 -p tcp --sport 993 -m state --state ESTABLISHED -j ACCEPT

    22.允许POP3和POP3S

    以下规则允许POP3访问。

    iptables -A INPUT  -i eth0 -p tcp --dport 110 -m state --state NEW,ESTABLISHED -j ACCEPT
    iptables -A OUTPUT -o eth0 -p tcp --sport 110 -m state --state ESTABLISHED -j ACCEPT

    以下规则允许POP3S访问。

    iptables -A INPUT  -i eth0 -p tcp --dport 995 -m state --state NEW,ESTABLISHED -j ACCEPT
    iptables -A OUTPUT -o eth0 -p tcp --sport 995 -m state --state ESTABLISHED -j ACCEPT 

    23.防止DoS攻击

    以下iptables规则将帮助您防止对您的Web服务器的拒绝服务(DoS)攻击。

    iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT

    在上面的例子中:
      -m limit:这使用限制iptables扩展
      -limit 25 /分钟:每分钟最多只能连接25个请求包。根据您的具体要求更改此值
      -limit-burst 100:此值指示仅在连接的总数达到limit之后才实施限制/分钟

    注意“-m limit”只匹配数据包而不是连接,所以上方例子中你将匹配25包每分钟。

    如果是想限制每分钟下connect次数呢。限制连接数的解决方案是使用connlimit匹配。

    iptables -A INPUT -p tcp –syn –dport 80 -m connlimit –connlimit-above 15 –connlimit-mask 32 -j REJECT –reject-with tcp-reset

    它将拒绝来自一个源IP的15以上的连接 - 一个很好的规则来保护Web服务器。

    此外,当与“hashlimit” 结合后在保护免受DDoS攻击时效果更好。

    使用“limit”匹配,您可以限制每个时间间隔的数据包的全局速率,但是使用“hashlimit”,您可以限制每个IP,每个组合IP +端口等。

    所以一个Web服务器的例子将是这样:

    iptables -A INPUT -p tcp –dport 80 -m hashlimit –hashlimit 45/sec –hashlimit-burst 60 
    –hashlimit-mode srcip–hashlimit-name DDOS
    –hashlimit-htable-size 32768
    –hashlimit-htable-max 32768
    –hashlimit-htable-gcinterval 1000
    –hashlimit-htable-expire 100000
    -j ACCEPT

    24. 端口转发

    例:将来自422端口的流量全部转到22端口。

    这意味着我们既能通过422端口又能通过22端口进行ssh连接。启用DNAT转发。

    iptables -t nat -A PREROUTING -p tcp -d 192.168.102.37 --dport 422 -j DNAT --to 192.168.102.37:22

    除此之外,还需要允许连接到422端口的请求

    iptables -A INPUT -i eth0 -p tcp --dport 422 -m state --state NEW,ESTABLISHED -j ACCEPTiptables -A OUTPUT 
    -o eth0 -p tcp --sport 422 -m state --state ESTABLISHED -j ACCEPT

    25. 记录丢弃的数据表

    iptables -N LOGGING   //1.新建名为LOGGING的链
    iptables -A INPUT -j LOGGING  //2.将所有来自INPUT链中的数据包跳转到LOGGING链中
    iptables -A LOGGING -m limit --limit 2/min -j LOG --log-prefix "IPTables Packet Dropped: " --log-level 7  
    //3.为这些包自定义个前缀,命名为”IPTables Packet Dropped” iptables -A LOGGING -j DROP //4.丢弃这些数据包 

    参考:

    http://www.linuxidc.com/Linux/2014-03/99159p2.htm

    http://blog.csdn.net/yeqihong/article/details/1489407

    https://www.cnblogs.com/bill1015/p/6847841.html

  • 相关阅读:
    【spring data jpa】jpa中criteria拼接in查询
    【spring boot】spring boot中使用@RestController不起作用,不返回json,依旧去找访问接口的请求地址对应的页面
    【mysql】mysql查询 A表B表 1对多 统计A表对应B表中如果有对应,则返回true否则false作为A表查询结果返回
    【redis】spring boot中 使用redis hash 操作 --- 之 使用redis实现库存的并发有序操作
    【多线程】java多线程Completablefuture 详解【在spring cloud微服务之间调用,防止接口超时的应用】【未完成】
    【docker】docker network常用命令参数
    【mysql】二级索引----聚簇索引和非聚簇索引-----
    【mysql】mysql统计查询count的效率优化问题
    SpringUtils
    idea激活
  • 原文地址:https://www.cnblogs.com/EasonJim/p/8339162.html
Copyright © 2020-2023  润新知