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,问题解决

    欢迎评论交流
  • 相关阅读:
    软件工程结对编程作业
    软件工程第1次作业
    阅读一篇文章,培养一个习惯
    OpenvSwitch系列之五 网桥特性功能配置
    读《阿里工程师的自我修养》我学到这几点
    OpenvSwitch系列之四 ovs-ofctl命令使用
    OpenvSwitch系列之三 ovs-vsctl命令使用
    python进阶之垃圾回收
    OpenDaylight开发hello-world项目之功能实现
    python进阶之内存模型
  • 原文地址:https://www.cnblogs.com/linengier/p/9118832.html
Copyright © 2011-2022 走看看