zoukankan      html  css  js  c++  java
  • iptables

    一、防火墙优缺点

    1、优点

    拒絕讓 Internet 的封包進入主機的某些埠口

    拒絕讓某些來源 IP 的封包進入

    拒絕讓帶有某些特殊旗標 (flag) 的封包進入

    分析硬體位址 (MAC) 來決定連線與否

    2、缺点

    防火牆並不能很有效的抵擋病毒或木馬程式

    防火牆對於來自內部 LAN 的攻擊較無承受力

    二、封包进入防火墙的流程:规则顺序的重要性!

    『规则是有顺序的』!

    当数据包进入Rule1的比对时,如果比对结果符合Rule1,此时这个数据包就会进行Action1的动作,而不会理会后续的Rule2,Rule3...等规则的分析了

    如果這個数据包并不符合Rule1的比对,那就会进入Rule2的比对了!如此一个一个规则去进行比对就是了

    那如果所有的规则都不符合怎么办?此时就会透过预设动作(封包政策Policy)来决定这个数据包的去向。所以当你的规则顺序排列错误时,就会产生很严重的错误了

    下面我们来举例说明一下:

    假如你的Linux主机提供了WWW服務,那么自然就要对80端口启用通过的规则;

    但是你发现IP为192.168.100.100老是恶意尝试入侵你的系统,所以你想要将改IP拒绝;

    最后所有的非WWW的数据包都拒绝,就这三个规则来说,你要如何设定防火墙检验顺序呢?

    Rule1先抵擋192.168.100.100

    Rule2再讓要求WWW服務的封包通過

    Rule3將所有的封包丟棄

    這樣的排列順序就能符合你的需求,不過萬一你的順序排錯了,變成:

    Rule1先讓要求 WWW 服務的封包通過

    Rule2再抵擋192.168.100.100

    Rule3將所有的封包丟棄

    此時,192.168.100.100 可以使用你的 WWW 服務!只要他對你的主機送出 WWW 要求封包,就可以使用你的 WWW 功能了,因為你的規則順序定義第一條就會讓他通過,而不去考慮第二條規則!

    三、iptables的表(table)与链(chain)

    Linux的iptables至少就有三个表格,包括管理本机进出的filter、管理后端主机的nat、管理特殊旗标的mangle(较少使用)

    filter(过滤器):主要跟进入Linux本机的封包有关,这个是预设的table,此表包含以下3个链

                          INPUT:主要与想要进入我们 Linux 本机的封包有关

                          OUTPUT:主要与我们 Linux 本机所要送出的封包有关

                          FORWARD:此表与Linux本机没什么关系,他可以『转递封包』到后端的电脑,与下列nat表相关性较高

    nat(地址转换):此表主要在进行来源与目的之间IP或port的转换,与Linux本机较无关,主要与Linux主机后面的区域网络內主机有关

                          PREROUTING:在进行路由判断之前所要进行的规则(DNAT/REDIRECT)

                          POSTROUTING:在进行路由判断之后所要进行的规则(SNAT/MASQUERADE)

                          OUTPUT:与发送出去的封包有关

    mangle(破坏者):此表主要是与特殊的封包的路由旗标有关,早期仅有PREROUTING及OUTPUT链,kernel2.4.18之后加入了INPUT及FORWARD链,此表较少用到

    各个表的链之间是有关系的,如下图

     

     

    由上图可以看出,iptables可以控制三种封包的流向

    1、封包进入Linux主机使用资源(路径A):在路由判断后确定是向Linux主机请求资料的封包,就会透过filter的INPUT链来进行控管

    2、封包经由Linux主机的转递,没有使用主机资源,而是向后端主机流动(路径B):在路由判断之前进行封包表头的修订作业后,发现到封包主要是要透过防火墙而去后端,此时封包就会透过路径B来跑动,也就是说该封包的目标并非Linux本机,主要经过的链是filter的FORWARD以及nat的POSTROUTING、PREROUTING

    3、封包由Linux本机发送出去(路径C):例如回应客户端的请求,或者是Linux本机主动送出的封包,都是透过路径C来跑的。先是透过路由判斷,决定了输出的路径后,再透过filter的OUTPUT链来传送的!当然,最终还是会经过nat的POSTROUTING链

    -------------由于mangle這個表很少被使用,如果将图9.3-3的mangle拿掉的话,那就容易看多了-------------

    透过图9.3-4可以了解到,事实上与本机最有关的其实是filter表内的INPUT与OUTPUT这两条链,如果你的iptables只是用来保护Linux主机本身那nat的规则根本就不需要理他,直接设定为开放即可

    不过如果你的防火墙也用来管制LAN內的其他主机的话,你就必须要再针对filter的FORWARD链,還有nat的PREROUTING, POSTROUTING以及OUTPUT进行额外的规则设定才行,建议新手慎重

    四、iptables语法

    1、规则的观察与清除

    (1)iptables -L -n --line-number 查看filter表的所有规则,以格式化的形式查看

    (2)iptables-save 也是查看filter表的所有规则,只不过是以更详细的语句形式查看

    (3)iptables [-t tables] [-FXZ]

    iptables -F 清除所有已定义的規則

    iptables -X 杀掉所有使用者"自定义"的chain(链),(这里要指定tables,不指定就是默认的filter)

    iptables -Z 将所有的chain的计数与流量都归零

    上面三条命令会把本机防火墙的所有规则都清除,但不会改变预设政策(policy),所以如果你不是在本机执行这三行命令,很可能会被自己挡在门外(若INPUT为DROP时),一定要小心谨慎!!

    2、定义预设政策(policy)

    iptables [-t nat] -P [INPUT,OUTPUT,FORWARD] [ACCEPT,DROP]

    -P :定义政策(Policy),注意这个P是大写的

    ACCEPT :该封包可接受

    DROP :该封包直接丢弃,不会让client端知道为何被丢弃

    iptables -P INPUT DROP  定义INPUT链的政策为DROP

    iptables -P OUTPUT ACCEPT

    iptables -P FORWARD ACCEPT

    3、封包的基础比对:IP,网段及网卡裝置

    iptables [-AI 链名] [-io 网卡] [-p 协议] [-s 来源IP/网段] [-d 目标IP/网段] -j [ACCEPT|DROP|REJECT|LOG] 

    -AI 链名:针对某个链进行规则的"插入"或"累加"

          -A:新增一条规则,该规则增加在原本规则的最后面。例如原本已经有四条规则,使用-A就可以加上第五条规则

          -I:插入一条规则,如果沒有指定此规则的顺序,默认是插入变成第一条规则。例如原本有四条规则,使用-I则该规则会变成第一条,而原本四条的序号变成2-5

          链:有INPUT, OUTPUT, FORWARD等,链名与-io有关,请往下看

    -io 网卡:设定封包进出的网卡

          -i:封包所进入的那个网卡,例如eth0,lo等网卡。需与INPUT链配合

          -o:封包所传出的那个网卡,需与OUTPUT链配合;

    -p 协议:设定此规则适用于哪种封包格式

          主要的封包格式有:tcp,udp,icmp及all

    -s 来源IP/网段:设定此规则之封包的来源,可指定IP或网段,例如:

          IP:192.168.0.100

          网段:192.168.0.0/24,192.168.0.0/255.255.255.0均可

          若为『不允许』时,则加上!即可,例如:-s ! 192.168.100.0/24表示不允许192.168.100.0/24的封包来源;

    -d 目标IP/网段:同-s ,只不过这里指的是目标IP或网段

    -j 后面接动作,主要的动作有接受(ACCEPT)、丢弃(DROP)、拒绝(REJECT)、记录(LOG)

    举例:iptables -A INPUT -i lo -j ACCEPT     设定lo成为受信任的网卡,亦即进出lo的封包都予以接受,lo就是本机回环网卡

    举例:iptables -A INPUT -i eth1 -s 192.168.100.0/24 -j ACCEPT    只要是来自内网(192.168.100.0/24)的封包通通允许通过eth1网卡

    举例:iptables -A INPUT -i eth1 -s 192.168.100.10 -j ACCEPT      只要是来自192.168.100.10就接受

    举例:iptables -A INPUT -i eth1 -s 192.168.100.230 -j DROP        来自192.168.100.230则拒绝

    iptables-save > /etc/sysconfig/iptables   保存配置并重启防火墙使其生效,重启防火墙命令systemctl restart iptables

     4、TCP,UDP的规则比对:针对端口设定

    iptables [-AI 链] [-io 网卡] [-p tcp,udp] [-s 来源IP/网段] [--sport 源端口范围] [-d 目标IP/网段] [--dport 目标端口范围] -j [ACCEPT|DROP|REJECT]

    举例:iptables -A INPUT -i eth0 -p tcp --dport 21 -j DROP   想要进入本机21端口的封包都抵挡掉

    举例:iptables -A INPUT -i eth0 -p udp --dport 137:138 -j ACCEPT  想要进入本机upd 137,138端口的封包就放行

    举例:iptables -A INPUT -i eth0 -p tcp --dport 139 -j ACCEPT  想要进入本机TCP 139端口的封包就放行

    举例:iptables -A INPUT -i eth0 -p tcp -s 192.168.1.0/24 --sport 1024:65534 --dport 22 -j DROP  只要来自192.168.1.0/24的1024:65535端口的封包,且想要连线到本机22端口就予以抵挡掉

    举例:iptables -A INPUT -i eth0 -p tcp --sport 1:1023 --dport 1:1023 --syn -j DROP  将来自任何地方源端口1:1023的封包且想要进入到本机1:1023的连线都丢弃

    5、iptables外挂模块:mac与state

     iptables -A INPUT [-m state] [--state 状态]

    -m :一些iptables的外挂模块,主要有:

    state :状态模块

    mac :Mac地址

    --state :一些封包的状态,主要有:

    INVALID :无效的封包,例如资料破损的封包状态

    ESTABLISHED:已经连线成功的连线状态

    NEW :想要新建立连线的封包状态

    RELATED :这个最常用!表示这个封包是与我们主机发送出去的封包有关

    举例:iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT 只要已建立或相关封包就予以通过

    举例:iptables -A INPUT -m state --state INVALID -j DROP 只要是不合法封包就丢弃

    举例:iptables -A INPUT -m mac --mac-source aa:bb:cc:dd:ee:ff -j ACCEPT  针对局域网內Mac地址为aa:bb:cc:dd:ee:ff的主机予以开放

    6、ICMP封包规则的比对:针对是否回应ping来设计

    ICMP的类型有很多,而且很多ICMP封包的类型都是为了要用来进行网络检测用的!所以最好不要把所有的ICMP封包都丢弃!
    如果不是做为路由器的主机时,通常我们会把ICMP type 8(echo request)拿掉而已,让远端主机不知道我们是否存在,也不会接受ping的回应就是了。
    ICMP封包格式的处理是这样的:
    iptables -A INPUT [-p icmp] [--icmp-type 类型] -j ACCEPT
    选项与参数:
    --icmp-type :后面必须要接ICMP的封包类型,也可以使用代号,
    例如8代表 echo request的意思
    举例:让0,3,4,11,12,14,16,18的ICMP type可以进入本机:
    [root@www ~]# vi somefile
    #!/bin/bash
    icmp_type="0 3 4 11 12 14 16 18"
    for typeicmp in $icmp_type
    do
    iptables -A INPUT -i eth0 -p icmp --icmp-type $typeicmp -j ACCEPT
    done
    [root@www ~]# sh somefile

     

     

     

     

     

     

  • 相关阅读:
    部署phpmyadmin登录不进去
    无法获取快照信息:锁定文件失败
    nginx: [emerg] BIO_new_file("/etc/nginx/ssl_key/server.crt") failed (SSL: error:02001002:syste
    nginx重启失败
    An error occurred (500 Error)
    Failed to set session cookie. Maybe you are using HTTP instead of HTTPS to access phpMyAdmin.
    clnt_create: RPC: Program not registered
    [error] 2230#2230: *84 client intended to send too large body: 1711341 bytes
    lnmp部署知乎出现403
    easyui下拉框过滤优化
  • 原文地址:https://www.cnblogs.com/leon2659/p/9308750.html
Copyright © 2011-2022 走看看