kernel版本不同 防火墙机制不同--2004年以后的distributions 已经都为2.6的kernel

  • Version 2.0:使用 ipfwadm 这个防火墙机制;

  • Version 2.2:使用的是 ipchains 这个防火墙机制;

  • Version 2.4 与 2.6 :主要是使用 Netfilet机制的iptables 这个软件,不过在某些早期的 Version 2.4 版本也同时支持 ipchains (编译成为模块)。不过,不建议在 2.4 之后的核心版本使用 ipchains !

table 

    表格 防火墙可以有多个表格 :定义默认政策与规则 

    Linux的iptables至少有三个表格 

    管理本机进出的 filter表格 

    管理后端主机 (防火墙内部的其他计算机) 的 nat 表格

    管理特殊旗标使用的 mangle表格 (较少使用) 

chain 

    链 表格中可以有多个链

  • filter (过滤器):主要跟进入 Linux 本机的封包有关,这个是预设的 table!

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

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

    • FORWARD:这个咚咚与 Linux 本机比较没有关系, 他可以『转递封包』到后端的计算机中,与nat table 相关性较高。

  • nat (地址转换):是 Network Address Translation 的缩写, 这个表格主要在进行来源IP与目的 IP 或 port 的转换,与 Linux 本机较无关,主要与 Linux 主机后的局域网络内计算机较有相关。

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

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

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

  • mangle (破坏者):这个表格主要是与特殊的封包的路由旗标有关, 早期仅有 PREROUTING 及 OUTPUT 链,不过从 kernel 2.4.18 之后加入了 INPUT 及 FORWARD 链。 由于这个表格与特殊旗标相关性较高,所以单纯的环境当中,较少使用 mangle table。

[root@www ~]# iptables [-t tables] [-L] [-nv]选项与参数:
-t :后面接 table ,例如 nat 或 filter ,若省略此项目,则使用默认的 filter
-L :列出目前的 table 的规则
-n :不进行 IP 与 HOSTNAME 的反查,显示讯息的速度会快很多!
-v :列出更多的信息,包括通过该规则的封包总位数、相关的网络接口等

本机的iptables语法

列出filter table 的三条链规则

    [root@bird ~]# iptables -L -n

    Chain INPUT (policy ACCEPT)                                                                    INPUT链预设政策为放行

    target        prot      opt  source               destination

    ACCEPT     all         --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED    规则1

    ACCEPT     icmp     --  0.0.0.0/0            0.0.0.0/0                                                                规则2

    ACCEPT     all         --  0.0.0.0/0            0.0.0.0/0

    ACCEPT     tcp       --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22

    ACCEPT     tcp       --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:23

    ACCEPT     tcp       --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:8888

    REJECT     all         --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

    Chain FORWARD (policy ACCEPT)

    target     prot opt source               destination

    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

    Chain OUTPUT (policy ACCEPT)

    target     prot opt source               destination

  • target:代表进行的动作, ACCEPT 是放行,而 REJECT 则是拒绝,此外,尚有 DROP (丢弃) 的项目!

  • prot:代表使用的封包协议,主要有 tcp, udp 及 icmp 三种封包格式;

  • opt:额外的选项说明

  • source :代表此规则是针对哪个『来源 IP』进行限制

  • destination :代表此规则是针对哪个『目标 IP』进行限制

    以上的信息结合iptables-save命令查看比较清晰

    [root@bird ~]# iptables-save -t filter

    # Generated by iptables-save v1.4.7 on Wed Nov 16 21:01:07 2016

    *filter

    :INPUT ACCEPT [0:0]

    :FORWARD ACCEPT [0:0]

    :OUTPUT ACCEPT [11661:2912327]

    -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

    -A INPUT -p icmp -j ACCEPT

    -A INPUT -i lo -j ACCEPT

    -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT

    -A INPUT -p tcp -m state --state NEW -m tcp --dport 23 -j ACCEPT

    -A INPUT -p tcp -m state --state NEW -m tcp --dport 8888 -j ACCEPT

    -A INPUT -j REJECT --reject-with icmp-host-prohibited

    -A FORWARD -j REJECT --reject-with icmp-host-prohibited

    COMMIT

    # Completed on Wed Nov 16 21:01:07 2016

修改防火墙规则前 一般都清除本机防火墙(filter)的所有规则 然后逐条添加 这三条规则不会改变预设政策policy

    一下只是临时清除

    [root@bird ~]# iptables -F    清除所有的已定制的规则

    [root@bird ~]# iptables -X    杀掉所有使用者 自定义的tables

    [root@bird ~]# iptables -Z    将所有的chaind的计数与流量统计都归零


定义预设政策policy

    当你的封包不在你设定的规则之内时,则该封包的通过与否,是以 链的Policy 的设定为准

    将本机filter表格的INPUT链设置为DROP

    [root@bird ~]# iptables -P INPUT DROP


封包的规则配置

[root@www ~]# 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)


封包的基础规则比对:IP,网域及接口装置(网卡)的配置

    没有指定的选项 则表示该选项完全接受 

        设定lo为受信任的装置 即进入lo的封包都接受 

        [root@bird ~]# iptables -A INPUT -i lo -j ACCEPT 

        来自内网的封包都接受

        [root@bird ~]# iptables -A INPUT -i eth0 -s 192.168.0.0/24 -j ACCEPT


        指定具体ip

        [root@bird ~]# iptables -A INPUT -i eth0 -s 192.168.0.x -j DROP


        记录某个规则 (只是记入日志/var/log/messages中 会继续依据后续规则对比)

        [root@bird ~]# iptables -A INPUT -s 192.168.x.x -j LOG 


TCP,UDP的规则比对:针对端口配置

[root@www ~]# iptables [-AI 链] [-io 网络接口] [-p tcp,udp] 
\> [-s 来源IP/网域] [--sport 端口范围]
\> [-d 目标IP/网域] [--dport 端口范围] -j [ACCEPT|DROP|REJECT]
选项与参数:
--sport 端口范围:限制来源的端口号码,端口号码可以是连续的,例如 1024:65535
—dport 端口范围:限制目标的端口号码。



   端口21的封包全部拒绝

   [root@bird ~]# iptabels -A INPUT -i eth0 -p tcp --dport 21 -j DROP


   只要来自 192.168.1.0/24 的 1024:65535 端口的封包,且想要联机到本机的 ssh port 就予以拒绝

   [root@bird ~]# iptables -A INPUT -i eth0 -p tcp -s 192.168.1.0/24  --sport 1024:65534 -dport ssh -j DROP


    TCP 还有特殊的旗标flags!针对主动联机的 SYN 旗标的限制规则

   [root@bird ~]# iptables -A INPUT -i eth0 -p tcp -s 192.168.129.124/23  --sport 1:1023 -dport 1:1023 --syn  -j DROP


iptables的外挂模块:  state 与 mac

     ipchains 没有所谓的封包状态模块,因此我们必须要针对封包的进、出方向进行管控

     iptables 免除了这个困扰!他可以透过一个状态模块来分析 这个想要进入的封包是否为刚刚我发出去的响应

[root@www ~]# iptables -A INPUT [-m state] [--state 状态]选项与参数:
-m :一些 iptables 的外挂模块,主要常见的有:
     state :状态模块
     mac   :网络卡硬件地址 (hardware address)
--state :一些封包的状态,主要有:
     INVALID    :无效的封包,例如数据破损的封包状态
     ESTABLISHED:已经联机成功的联机状态;
     NEW        :想要新建立联机的封包状态;
     RELATED    :这个最常用!表示这个封包是与我们主机发送出去的封包有关

    只要是已建立或相关封包就予以通过 只要是不合法的封包就丢弃 这样就无需对“响应封包”单独撰写规则了

    [root@bird ~]# iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

    [root@bird ~]# iptables -A INPUT -m state --state INVALID -j DROP


    针对网卡的接受与拒绝

    [root@bird ~]# iptables -A INPUT -m mac --mac-source aa:bb:cc:dd:ee:ff -j ACCEPT


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

    通常我们会把 ICMP type 8 (echo request) 拿掉而已,让远程主机不知道我们是否存在,也不会接受 ping 的响应就是了 

    [root@bird ~]# iptables -A INPUT -i eth0 -p icmp --icmp-type 8 -j DROP

    因为客户端需要检测网络是否畅通 所以局域网的路由器主机 建议不要关闭为好

    

类别代号类别名称与意义
0Echo Reply (代表一个响应信息)
3Destination Unreachable (表示目的地不可到达)
4Source Quench (当 router 的负载过高时,此类别码可用来让发送端停止发送讯息)
5Redirect (用来重新导向路由路径的信息)
8Echo Request (请求响应消息)
11Time Exceeded for a Datagram (当数据封包在某些路由传送的现象中造成逾时状态,此类别码可告知来源该封包已被忽略的讯息)
12Parameter Problem on a Datagram (当一个 ICMP 封包重复之前的错误时,会回复来源主机关于参数错误的讯息)
13Timestamp Request (要求对方送出时间讯息,用以计算路由时间的差异,以满足同步性协议的要求)
14Timestamp Reply (此讯息纯粹是响应 Timestamp Request 用的)
15Information Request (在 RARP 协议应用之前,此讯息是用来在开机时取得网络信息)
16Information Reply (用以响应 Infromation Request 讯息)
17Address Mask Request (这讯息是用来查询子网 mask 设定信息)
18Address Mask Reply (响应子网 mask 查询讯息的)


设置了一个本地虚拟机的规则

  1. 规则归零:清除所有已经存在的规则 (iptables -F...)

  2. 预设政策:除了 INPUT 这个自定义链设为 DROP 外,其他为预设 ACCEPT;

  3. 信任本机:由于 lo 对本机来说是相当重要的,因此 lo 必须设定为信任装置;

  4. 回应封包:让本机主动向外要求而响应的封包可以进入本机 (ESTABLISHED,RELATED)

  5. 信任用户:这是非必要的,如果你想要让区网的来源可用你的主机资源时

#!/bin/bash

PATH=/sbin:/bin:/usr/sbin:/usr/bin;export PATH

iptables -F

iptables -X

iptables -Z

iptables -P INPUT DROP

iptables -P OUTPUT ACCEPT

iptables -P FORWARD ACCEPT

iptables -A INPUT -i lo -j ACCEPT    (本机回环网卡开放)

iptables -A INPUT -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT    (可以主动请求外部)

iptables -A INPUT -I eht0 -s 192.168.0.124/24 -j ACCEPT                开放了本机ip(宿主是手动设置的DHCP ip)

[root@bird shell]# chmod 744 firewall.sh

[root@bird shell]#./firewall.sh

[root@bird shell]# /etc/init.d/iptables status

表格:filter

Chain INPUT (policy DROP)

num  target     prot opt source               destination

1    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0

2    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED

3    ACCEPT     all  --  192.168.129.0/24     0.0.0.0/0

Chain FORWARD (policy ACCEPT)

num  target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)

num  target     prot opt source               destination

[root@bird shell]# /etc/init.d/iptables save

其实直接修改/etc/sysconfig/iptables 然后 /etc/init.d/iptables restart也可以

 IPv4的核心管理功能: /proc/sys/net/ipv4/*

    阻断式服务 (DoS) ***法当中的一种方式,就是利用 TCP 封包的 SYN 三向交握原理所达成的,称为 SYN Flooding

    可以启用核心的 SYN Cookie模块来预防SYN Flooding

    SYN Cookie 可以在系统用来启动随机联机的端口 (1024:65535) 即将用完时自动启动。

    但不适合负载已经很高的服务器内 会延迟 比如SMTP

    当启动 SYN Cookie 时,主机在发送 SYN/ACK 确认封包前,会要求 Client 端在短时间内回复一个序号,这个序号包含许多原本 SYN 封包内的信息,包括 IP、port 等。若 Client 端可以回复正确的序号,那么主机就确定该封包为可信的,因此会发送 SYN/ACK 封包,否则就不理会此一封包。

    启动SYN Cookie模块

    [root@bird ~]# echo "1" > /proc/sys/net/ipv4/tcp_syncookies


    数台主机同时不断携带大数据ping你的主机使主机带宽被吃光,或系统会当 称为 ping flooding

    可以用防火墙来抵挡也可以用核心模块来自动取消 ping 的响应

    [root@bird ~]# echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts    仅有 ping broadcast 地址时才取消 ping 的回应

    [root@bird ~]# echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_all     全部的 ping 都不回应 不建议使用


    

 /proc/sys/net/ipv4/conf/网络接口/*

    核心还可以针对不同的网络接口进行不一样的参数设定

    可以使用     echo "1" > /proc/sys/net/ipv4/conf/???/rp_filter 

    建议直接修改文件    /etc/sysctl.conf +sysctl -p

  • rp_filter:称为逆向路径过滤 (Reverse Path Filtering), 可以藉由分析网络接口的路由信息配合封包的来源地址,来分析该封包是否为合理。举例来说,你有两张网卡,eth0 为 192.168.1.10/24 ,eth1 为 public IP 。那么当有一个封包自称来自 eth1 ,但是其 IP 来源为 192.168.1.200 , 那这个封包就不合理,应予以丢弃。这个设定值建议可以启动的。

  • log_martians:这个设定数据可以用来启动记录不合法的 IP 来源, 举例来说,包括来源为 0.0.0.0、127.x.x.x、及 Class E 的 IP 来源,因为这些来源的 IP 不应该应用于 Internet 啊。 记录的数据默认放置到核心放置的登录档 /var/log/messages。

  • accept_source_route:或许某些路由器会启动这个设定值, 不过目前的设备很少使用到这种来源路由,你可以取消这个设定值。

  • accept_redirects:当你在同一个实体网域内架设一部路由器, 但这个实体网域有两个 IP 网域,例如 192.168.0.0/24, 192.168.1.0/24。此时你的 192.168.0.100 想要向 192.168.1.100 传送讯息时,路由器可能会传送一个 ICMP redirect 封包告知 192.168.0.100 直接传送数据给 192.168.1.100 即可,而不需透过路由器。因为 192.168.0.100 与 192.168.1.100确实是在同一个实体线路上 (两者可以直接互通),所以路由器会告知来源 IP 使用最短路径去传递数据。但那两部主机在不同的 IP 段,却是无法实际传递讯息的!这个设定也可能会产生一些轻微的安全风险,所以建议关闭他。

  • send_redirects:与上一个类似,只是此值为发送一个 ICMP redirect 封包。 同样建议关闭。