zoukankan      html  css  js  c++  java
  • Linux Iptables入门

    文章转载自:http://doc.linuxpk.com/2595.html

    http://www.cnblogs.com/sunwei2012/archive/2011/02/16/1956533.html 

      在下面的配置中一定要非常小心,在开始其他所有工作之前,首先创建一个规则,容许管理员接入。这是因为一旦将所有的规则都配置为DROP ,SSH连接也会被禁止,这样连修改的机会也没了。
    其他常识
    我用的是CentOS,防火墙被安装为服务,系统自动提供了一个iptables的管理脚本  
    /etc/init.d/iptables 。这里面提供了几个选项:start 、 stop、restart、condrestart、status、panic、save  。
    要注意如果 使用命令 service iptables stop 、 service iptables start 、 service iptables restart  这几个命令会消除当前活跃的规则集,并从配置文件中重新载入。所以需要使用 service iptables save  命令保存当前活跃的规则集.
    默认的配置文件路径:/etc/sysconfig/iptables
    配置
    •  
      • 首先设置防火墙的规则允许管理通信访问,允许到防火墙的SSH连接,使用下面的命令:
                    iptables -A INPUT -p tcp -s 192.168.92.0/24 --dport 22 -j ACCEPT
                    s指出只能容许192.168.92.0、24这个内部网段的ip才能访问。如果你想容许访问80,11211等类似端口,也可以参考这个命令。当然了这只是容许了进入的包,还要容许出去的包。
    •  
      • 容许出去
                    你可以使用  iptables -P OUTPUT ACCEPT 。 这种方法很简单,但我们有更安全的方法。
                    iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
                    这个命令允许全部的应答通信通过,只要他是对被允许的会话的应答。
                    如果你想设置允许从防火墙发出的数据到远端的syslog服务器(比如:192.168.92.3:514)的syslog通信量通过,可以使用该命令:
                    iptables -A OUTPUT -p udp -d 192.168.92.3 --dport 514
                    因为该协议是udp协议,并且是单向的会话,不需要进入,只是出去。
    •  
      • 将几个默认链设为DROP状态
                    之所以放在最后,是因为我在测试时,一使用命令iptables -P INPUT DROP ,我就不能再访问服务器了,所以我就把这不放在最后了。
                    iptables -P INPUT DROP
                    iptables -P FORWARD DROP
                    iptables -P OUTPUT DROP
    •  
      • 保存当前规则
                    service iptables save  
    •  
      • 提示:
               
    对链或规则本身进行操作的iptable命令使用大写字母表示:
    -A 附加 、-D 删除规则 、-I 插入 、-R 替换 、 -L 列表 、-F 充溢 、-N 新建 、-X 删除链
    用于详细说明规则的选项用小写字母:
    -s 源地址、-p 协议 、 -d 目的地址 、-j 跳 、 -i 入界面 、 -o 出界面

      iptables 中的指令,均需区分大小写。


    ipchains 和 iptables 在语法上的主要的差异,注意如下∶

    1. 在 ipchains 中,诸如 input 链,是使用小写的 chains 名,在 iptables 中,要改用大写 INPUT。

    2. 在 iptables 中,要指定规则是欲作用在那一个规则表上(使用 -t 来指定,如 -t nat),若不指定,则预设是作用在 filter 这个表。

    3. 在 ipchains 中, -i 是指介面(interface),但在 iptables 中,-i 则是指进入的方向,且多了 -o,代表出去的方向。

    4. 在 iptables 中,来源 port 要使用关键字 --sport 或 --source-port

    5. 在 iptables 中,目的 port 要使用关键字 --dport 或 --destination-port

    6. 在 iptables 中,"丢弃" 的处置动作,不再使用 DENY 这个 target,改用 DROP。

    7. 在 ipchains 的记录档功能 -l,已改为目标 -j LOG,并可指定记录档的标题。

    8. 在 ipchains 中的旗标 -y,在 iptables 中可用 --syn 或 --tcp-flag SYN,ACK,FIN SYN

    9. 在 iptables 中,imcp messages 型态,要加上关键字 --icmp-type,如∶

    iptables -A OUTPUT -o eth0 -p icmp -s $FW_IP --icmp-type 8 -d any/0 -j ACCEPT

    iptables 使用时的样板

    在设定 iptables 的封包过滤规则时,有几个样板的动作,若先熟悉它们,往后就可自行套用,依此类推,很快地,您就可以进入这个天地之中。

    观察目前的设定

    作法如下∶

    iptables -L -n

    iptablse -t nat -L -n

    定义变数

    FW_IP="163.26.197.8"

    打开核心 forward 功能

    作法如下∶

    ###-----------------------------------------------------###

    # 打开 forward 功能

    ###-----------------------------------------------------###

    echo "1" > /proc/sys/net/ipv4/ip_forward

    清除所有的规则

    一开始要先清除所有的规则,重新开始,以免旧有的规则影响新的设定。作法如下∶

    ###-----------------------------------------------------###

    # 清除先前的设定

    ###-----------------------------------------------------###

    # 清除预设表 filter 中,所有规则链中的规则

    iptables -F

    # 清除预设表 filter 中,使用者自订链中的规则

    iptables -X

    # 清除mangle表中,所有规则链中的规则

    iptables -F -t mangle

    # 清除mangle表中,使用者自订链中的规则

    iptables -t mangle -X

    # 清除nat表中,所有规则链中的规则

    iptables -F -t nat

    # 清除nat表中,使用者自订链中的规则

    iptables -t nat -X

    选定预设的政策

    接着,要选定各个不同的规则链,预设的政策为何。作法如下∶

    预设全部丢弃∶

    ###-----------------------------------------------------###

    # 设定 filter table 的预设政策

    ###-----------------------------------------------------###

    iptables -P INPUT DROP

    iptables -P OUTPUT DROP

    iptables -P FORWARD DROP

    或者预设全部接受∶

    ###-----------------------------------------------------###

    # 设定 filter table 的预设政策

    ###-----------------------------------------------------###

    iptables -P INPUT ACCEPT

    iptables -P OUTPUT ACCEPT

    iptables -P FORWARD ACCEPT

    各个规则链的预设政策可独立自主的设定,不必受其它链的影响。

    以下练习,若目标为 DROP,则 policy 请设为 ACCEPT;若目标为 ACCEPT,则 policy 请设为 DROP,如此方可看出效果。

    开放某一个介面

    作法如下∶

    iptables -A INPUT -i lo -j ACCEPT

    iptables -A OUTPUT -o lo -j ACCEPT

    注∶IPFW 或 Netfilter 的封包流向,local process 不会经过 FORWARD Chain,

    因此 lo 只在 INPUT 及 OUTPUT 二个 chain 作用。

    iptables -A INPUT -i eth1 -j ACCEPT

    iptables -A OUTPUT -o eth1 -j ACCEPT

    iptables -A FORWARD -i eth1 -j ACCEPT

    iptables -A FORWARD -o eth1 -j ACCEPT

    IP 伪装

    使内部网路的封包经过伪装之后,使用对外的 eth0 网卡当作代表号,对外连线。作法如下∶

    ###-----------------------------------------------------###

    # 启动内部对外转址

    ###-----------------------------------------------------###

    iptables -t nat -A POSTROUTING -o eth0 -s 172.16.0.0/16 -j SNAT --to-source $FW_IP

    上述指令意指∶把 172.16.0.0/16 这个网段,伪装成 $FW_IP 出去。

    虚拟主机

    利用转址、转 port 的方式,使外部网路的封包,可以到达内部网路中的伺服主机,俗称虚拟主机。这种方式可保护伺服主机大部份的 port 不被外界存取,只开放公开服务的通道(如 Web Server port 80),因此安全性甚高。

    作法如下∶

    ###-----------------------------------------------------###

    # 启动外部对内部转址

    ###-----------------------------------------------------###

    # 凡对 $FW_IP:80 连线者, 则转址至 172.16.255.2:80

    iptables -t nat -A PREROUTING -i eth0 -p tcp -d $FW_IP --dport 80 -j DNAT --to-destination 172.16.255.2:80

    开放内部主机可以 telnet 至外部的主机

    开放内部网路,可以 telnet 至外部主机。

    作法如下∶(预设 policy 为 DROP)

    ###-----------------------------------------------------###

    # open 外部主机 telnet port 23

    ###-----------------------------------------------------###

    iptables -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 1024:65535 -d any/0 --dport 23 -j ACCEPT

    iptables -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 23 -d $FW_IP --dport 1024:65535 -j ACCEPT

    开放邮包转递通道

    开放任意的邮件主机送信包给你的 Mail Server,而你的 Mail Server 也可以送信包过去。

    作法如下∶(预设 policy 为 DROP)

    ###-----------------------------------------------------###

    # open SMTP port 25

    ###-----------------------------------------------------###

    # 以下是∶别人可以送信给你

    iptables -A INPUT -i eth0 -p tcp -s any/0 --sport 1024:65535 -d $FW_IP --dport 25 -j ACCEPT

    iptables -A OUTPUT -o eth0 -p tcp ! --syn -s $FW_IP --sport 25 -d any/0 --dport 1024:65535 -j ACCEPT

    # 以下是∶你可以送信给别人

    iptables -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 1024:65535 -d any/0 --dport 25 -j ACCEPT

    iptables -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 25 -d $FW_IP --dport 1024:65525 -j ACCEPT

    开放对外离线下载信件的通道

    开放内部网路可以对外部网路的 POP3 server 取信件。

    作法如下∶(预设 policy 为 DROP)

    ###-----------------------------------------------------###

    # open 对外部主机的 POP3 port 110

    ###-----------------------------------------------------###

    iptables -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 1024:65535 -d any/0 --dport 110 -j ACCEPT

    iptables -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 110 -d $FW_IP --dport 1024:65535 -j ACCEPT

    开放观看网页的通道

    开放内部网路可以观看外部网路的网站。

    作法如下∶(预设 policy 为 DROP)

    ###-----------------------------------------------------###

    # open 对外部主机的 HTTP port 80

    ###-----------------------------------------------------###

    iptables -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 1024:65535 -d any/0 --dport 80 -j ACCEPT

    iptables -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 80 -d $FW_IP --dport 1024:65535 -j ACCEPT

    开放查询外部网路的 DNS 主机

    开放内部网路,可以查询外部网路任何一台 DNS 主机。

    作法如下∶(预设 policy 为 DROP)

    ###-----------------------------------------------------###

    # open DNS port 53

    ###-----------------------------------------------------###

    # 第一次会用 udp 封包来查询

    iptables -A OUTPUT -o eth0 -p udp -s $FW_IP --sport 1024:65535 -d any/0 --dport 53 -j ACCEPT

    iptables -A INPUT -i eth0 -p udp -s any/0 --sport 53 -d $FW_IP --dport 1024:65535 -j ACCEPT

    # 若有错误,会改用 tcp 封包来查询

    iptables -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 1024:65535 -d any/0 --dport 53 -j ACCEPT

    iptables -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 53 -d $FW_IP --dport 1024:65535 -j ACCEPT

    # 开放这台主机上的 DNS 和外部的 DNS 主机互动查询∶使用 udp

    iptables -A OUTPUT -o eth0 -p udp -s $FW_IP --sport 53 -d any/0 --dport 53 -j ACCEPT

    iptables -A INPUT -i eth0 -p udp -s any/0 --sport 53 -d $FW_IP --dport 53 -j ACCEPT

    # 开放这台主机上的 DNS 和外部的 DNS 主机互动查询∶使用 tcp

    iptables -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 53 -d any/0 --dport 53 -j ACCEPT

    iptables -A INPUT -i eth0 -p tcp ! -y -s any/0 --sport 53 -d $FW_IP --dport 53 -j ACCEPT

    开放内部主机可以 ssh 至外部的主机

    开放内部网路,可以 ssh 至外部主机。

    作法如下∶(预设 policy 为 DROP)

    ###-----------------------------------------------------###

    # open 外部主机 ssh port 22

    ###-----------------------------------------------------###

    iptables -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 1024:65535 -d any/0 --dport 22 -j ACCEPT

    iptables -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 22 -d $FW_IP --dport 1024:65535 -j ACCEPT

    # 以下是 ssh protocol 比较不同的地方

    iptables -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 1020:1023 -d any/0 --dport 22 -j ACCEPT

    iptables -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 22 -d $FW_IP --dport 1020:1023 -j ACCEPT

    开放内部主机可以 ftp 至外部的主机

    开放内部网路,可以 ftp 至外部主机。

    作法如下∶(预设 policy 为 DROP)

    ###-----------------------------------------------------###

    # open 对外部主机 ftp port 21

    ###-----------------------------------------------------###

    # 以下是打开命令 channel 21

    iptables -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 1024:65535 -d any/0 --dport 21 -j ACCEPT

    iptables -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 21 -d $FW_IP --dport 1024:65535 -j ACCEPT

    # 以下是打开资料 channel 20

    iptables -A INPUT -i eth0 -p tcp -s any/0 --sport 20 -d $FW_IP --dport 1024:65535 -j ACCEPT

    iptables -A OUTPUT -o eth0 -p tcp ! --syn -s $FW_IP --sport 1024:65535 -d any/0 --dport 20 -j ACCEPT

    # 以下是打开 passive mode FTP 资料通道

    iptables -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 1024:65535 -d any/0 --dport 1024:65535 -j ACCEPT

    iptables -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 1024:65535 -d $FW_IP --dport 1024:65535 -j ACCEPT

    开放 ping

    可以对外 ping 任何一台主机。

    作法如下∶(预设 policy 为 DROP)

    iptables -A OUTPUT -o eth0 -p icmp -s $FW_IP --icmp-type 8 -d any/0 -j ACCEPT

      iptables -A INPUT -i eth0 -p icm -s any/0 --icmp-type 0 -d $FW_IP -j ACCEPT 
  • 相关阅读:
    学习小记: Kaggle Learn
    eclipse 一些快捷键
    Map接口
    学习笔记
    泛型方法 类 接口
    TreeSet
    xml
    Java笔试题目-my
    迭代器三种遍历方法
    线程请求其他线程资源
  • 原文地址:https://www.cnblogs.com/fhefh/p/1998805.html
Copyright © 2011-2022 走看看