• 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

  • 相关阅读:
    Java Web 网络留言板2 JDBC数据源 (连接池技术)
    Java Web 网络留言板3 CommonsDbUtils
    Java Web ConnectionPool (连接池技术)
    Java Web 网络留言板
    Java Web JDBC数据源
    Java Web CommonsUtils (数据库连接方法)
    Servlet 起源
    Hibernate EntityManager
    Hibernate Annotation (Hibernate 注解)
    wpf控件设计时支持(1)
  • 原文地址:https://www.cnblogs.com/EasonJim/p/8339162.html
Copyright © 2020-2023  润新知