zoukankan      html  css  js  c++  java
  • iptables 命令记录

    安装

    原理

    基本命令

    实践

    脚本

    1.安装

    以centos 7为例子
    安装 yum install -q -y iptables-services
    配置 iptables [-t table] command [match] [target]
    eg:

    ```
    iptables -A INPUT -p tcp --dport 22 -j ACCEPT
    iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT

    ```
    保存 service iptables save
    重启 systemctl restart iptables.service
    开机启动 systemctl enable iptables.service
    说明
    1.默认的规则保存在/etc/sysconfig/iptables

    2.原理

    iptbale 作为linux下的应用程序和网络内核的netfileter模块相配合,netfileter提供了四表五链(filter, nat, manage, raw)的结构,提供包过滤和包跟踪,NAT转换的功能.以下面的命令使用
    iptables [-t table] command [match] [target]
    如果没有制定表,默认的会添加到filter表中.

    3.基本命令


    查看iptales --help
    添加规则
    --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

    创建产

    ```

    -N chan

    ```

    删除链

    ```
    --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)

    4.实践命令

    1. 删除规则
    在开始创建iptables规则之前,你也许需要删除已有规则。命令如下:
    iptables -F
    (or)
    iptables –flush
    [root@localhost opt]# iptables -L matrix
    Chain matrix (2 references)
    target prot opt source destination
    ACCEPT tcp -- anywhere anywhere tcp dpt:cbt
    [root@localhost opt]# iptables -F matrix
    [root@localhost opt]# iptables -L matrix
    Chain matrix (2 references)
    target prot opt source destination

    2. 默认规则
    --policy -P chain target
    Change policy on chain to target
    链的默认规则为”ACCEPT”(接受),若要将INPUT,FORWARD,OUTPUT链设置成”DROP”(拒绝),命令如下:
    iptables -P INPUT DROP
    iptables -P FORWARD DROP
    iptables -P OUTPUT DROP
    当INPUT链和OUTPUT链都设置成DROP时,对于每一个防火墙规则,我们都应该定义两个规则。例如:一个传入另一个传出。在下面所有的例子中,由于我们已将DROP设置成INPUT链和OUTPUT链的默认策略,每种情况我们都将制定两条规则。当然,如果你相信你的内部用户,则可以省略上面的最后一行。例如:默认不丢弃所有出站的数据包。在这种情况下,对于每一个防火墙规则要求,你只需要制定一个规则——只对进站的数据包制定规则。

    3. 查看rule 数字,并删除chan下的rule
    iptables -nvL --line-number INPUT
    iptables -D INPUT 2
    说明:
    -L 查看当前表的所有规则,默认查看的是filter表,如果要查看NAT表,可以加上-t NAT参数
    -n 不对ip地址进行查,加上这个参数显示速度会快很多
    -v 输出详细信息,包含通过该规则的数据包数量,总字节数及相应的网络接口
    –line-number 显示规则的序列号,这个参数在删除或修改规则时是使用

    3. 阻止指定IP地址

    例:丢弃来自IP地址x.x.x.x的包

    BLOCK_THIS_IP="x.x.x.x"
    iptables -A INPUT -s "$BLOCK_THIS_IP" -j DROP
    注:当你在log里发现来自某ip地址的异常记录,可以通过此命令暂时阻止该地址的访问以做更深入分析

    例:阻止来自IP地址x.x.x.x eth0 tcp的包

    iptables -A INPUT -i eth0 -s "$BLOCK_THIS_IP" -j DROP
    iptables -A INPUT -i eth0 -p tcp -s "$BLOCK_THIS_IP" -j DROP
    4. 允许所有SSH的连接请求

    例:允许所有来自外部的SSH连接请求,即只允许进入eth0接口,并且目标端口为22的数据包

    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.0/24域的用户的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的连接请求

    例:允许所有来自web - http的连接请求

    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
    例:允许所有来自web - https的连接请求

    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. 使用multiport 将多个规则结合在一起

    允许多个端口从外界连入,除了为每个端口都写一条独立的规则外,我们可以用multiport将其组合成一条规则。如下所示:

    例:允许所有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. 允许从本地发起的SSH请求

    iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
    iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
    请注意,这与允许ssh连入的规则略有不同。本例在OUTPUT链上,我们允许NEW和ESTABLISHED状态。在INPUT链上,我们只允许ESTABLISHED状态。ssh连入的规则与之相反。

    9. 仅允许从本地发起到一个指定的网络域的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连接请求

    下面的规则允许输出安全的网络流量。如果你想允许用户访问互联网,这是非常有必要的。在服务器上,这些规则能让你使用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. 负载平衡传入的网络流量

    使用iptables可以实现传入web流量的负载均衡,我们可以传入web流量负载平衡使用iptables防火墙规则。

    例:使用iptables nth将HTTPS流量负载平衡至三个不同的ip地址。

    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内部主机

    iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
    iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT
    13. 允许内部主机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连接

    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连接。如果你不允许NIS相关的ypbind连接请求,即使SSH连接请求已被允许,用户仍然无法登录。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)使用你NIS的静态IP

    2)编写shell脚本通过“rpcinfo - p”命令自动获取动态端口号,并在上述iptables规则中使用。

    18. 允许来自指定网络的rsync连接请求

    例:允许来自网络192.168.101.0/24的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数据库与web服务跑在同一台服务器上。有时候我们仅希望DBA和开发人员从内部网络(192.168.100.0/24)直接登录数据库,可尝试以下命令:

    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都使用了25端口,因此我们只需要允许来自25端口的连接请求即可。

    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流量,端口为143

    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流量,端口为993

    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 -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT
    上述例子中: -m limit: 启用limit扩展 –limit 25/minute: 允许最多每分钟25个连接(根据需求更改)。 –limit-burst 100: 只有当连接达到limit-burst水平(此例为100)时才启用上述limit/minute限制。

    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 ACCEPT
    iptables -A OUTPUT -o eth0 -p tcp --sport 422 -m state --state ESTABLISHED -j ACCEPT
    25. 记录丢弃的数据表 第一步:新建名为LOGGING的链
    iptables -N LOGGING
    第二步:将所有来自INPUT链中的数据包跳转到LOGGING链中
    iptables -A INPUT -j LOGGING
    第三步:为这些包自定义个前缀,命名为”IPTables Packet Dropped”
    iptables -A LOGGING -m limit --limit 2/min -j LOG --log-prefix "IPTables Packet Dropped: " --log-level 7
    第四步:丢弃这些数据包
    iptables -A LOGGING -j DROP

    5.脚本开发实践

    #!/bin/sh
    chan_name="test"
    set_iptables() {
    iptables -L $chan_name 1>/dev/null
    if [ $? != 0 ]; then
    echo "crate chain"
    iptables -N $chan_name
    fi
    iptables -L $chan_name|grep -q dpts:4460:4480
    if [ $? != 0 ]; then
    iptables -I $chan_name -p tcp --dport 4460:4480 -j ACCEPT
    fi
    iptables -S INPUT|grep -q "-j $chan_name"
    if [ $? != 0 ]; then
    iptables -I INPUT -j $chan_name
    fi
    }
    open_port() {
    yum install -q -y iptables-services 1>/dev/null
    set_iptables
    service iptables save 1>/dev/null
    systemctl restart iptables.service 1>/dev/null
    systemctl enable iptables.service 1>/dev/null
    }
    open_port
    

      

    6.其他


    1. yum:
    yum -y选项,表示所有的确认选项均选y
    yum install -y epel-release ;
    不检查Public Key而强制安装。否则会报Public key for xxx is not installed退出
    yum install --nogpgcheck package_need_to_install


    2. 关闭selinux:
    一款为了提高系统安全性的软件:对系统服务,文件权限,网络端口访问有极其严格的限制,例如
    :如果对一个文件没有正确安全上下文配置, 甚至你是root用户,你也不能启动某服务
    关闭SELINUX
    vi /etc/selinux/config
    #SELINUX=enforcing #注释掉
    #SELINUXTYPE=targeted #注释掉
    SELINUX=disabled #增加
    :wq! #保存退出
    setenforce 0 #使配置立即生效


    3. 关闭firewall
    systemctl status firewalld.service #检测是否开启了firewall
    systemctl stop firewalld.service #关闭firewall
    sytsemctl disable firewalld.service #禁止firewall开机自启

    4. 相关命令不存在

    提示--set-mark不存在,

    iptables v1.6.1: unknown option "--set-mark"

    Try `iptables -h' or 'iptables --help' for more information.

    iptables -j MARK -h也看不到相关的选项,判断是debain包中iptables命令没有编译相应的模块。

    重新用源码编译iptables,问题解决

    欢迎评论交流
  • 相关阅读:
    yzoj P2344 斯卡布罗集市 题解
    yzoj P2350 逃离洞穴 题解
    yzoj P2349 取数 题解
    JXOI 2017 颜色 题解
    NOIP 2009 最优贸易 题解
    CH 4302 Interval GCD 题解
    CH4301 Can you answer on these queries III 题解
    Luogu2533[AHOI2012]信号塔
    Luogu3320[SDOI2015]寻宝游戏
    Luogu3187[HNOI2007]最小矩形覆盖
  • 原文地址:https://www.cnblogs.com/linengier/p/9118832.html
Copyright © 2011-2022 走看看