linux之安全防御(重点讲iptables)

1、概述

        常见的一些攻击手段如下:

  •  拒绝服务(DOS):通过大量访问请求使得服务器资源耗尽,无法向正常用户处理请求连接。常见解决手段使用云服务商的流量清洗功能。(因为云服务商的资源池足够大,可以容纳攻击流量,并通过过滤常见的攻击类型流量然后再把正常流量给引导回正常的路径)
  • 口令破解:常用攻击手法俗称“跑字典”,常用解决方案设置登录错误次数限制;
  • 已知漏洞:通过已知漏洞进行数据获取或者提取,常见手段定时更新防御性补丁;
  • 欺骗权限用户:又称社会工程学,通过欺骗权限用户得到授权资格的方式;

关于常见的DDOS攻击:

SYN攻击:发起最小syn包,通过频繁发送大量数据包,导致CPU消耗殆尽
CC攻击:请求大量请求,通过http协议发起大量正常连接,导致内存消耗殆尽
长连接攻击:通过http1.1协议,建立正常通信,一点一点的发送请求,导致网络带宽消耗殆尽
UDP攻击:DNS攻击,向DNS一直发送解析请求,导致瘫痪
死亡Ping:把你的外网带宽占满,正常主机就无法访问
QPS:代表每秒攻击数

常见的安全防御设备主要有以下几种:

  • 基础类防火墙:主要实现包过滤防火墙;
  • IDS类防火墙:入侵检测系统,提供报告和事后监督为主;
  • IPS类防火墙:入侵防御系统,分析数据包内容,根据模式匹配去阻断非法访问;
  • 主动安全类防火墙:对特定服务类型进行专项防御,常见设备有waf(web应用防火墙)、daf;

       后面先讲解基础类防火墙。

1.1 基础类防火墙

        分为软件类、硬件类防火墙。

  • 软件:iptables
  • 硬件:深信服、网域、华为等等

        工作机制

               包过滤防火墙:源地址 目的地址 源端口 目标端口 连接状态

                应用层防火墙:基于URL过滤

        模块:

                内核态:netfilter

                用户态:iptables

2 iptables的工作结构

类似于lvs(用户态:ipvsadm,内核态:ipvs)一样,iptables也分为用户态和内核态

iptables的区分如下:

Iptables历经的变化:

3 iptables相关原理

 规则链:承载防火墙规则

  • 入站:INPUT
  • 出站:OUTPUT
  • 转发:FORWARD
  • 路由前应用规则:修改目标地址 PREROUTING。在路由选择前处理数据包;
  • 路由后应用规则:修改源地址 POSTROUTING。在进行路由选择后处理数据包;

用两张图概括五链如下:

规则表:承载防火墙链

  • raw:状态跟踪
  • mangle:标记TTL
  • nat:实现地址转换
  • filter:过滤数据报文

链表结构:(不同表有不同的链,使用较多的还是nat表与filter表)

        每条链里规则匹配顺序:由上至下,匹配即停止,log策略除外。若找不到匹配项,则按照链的默认策略处理。

表应用顺序:raw>mangle>nat>filter

链应用顺序(这段不是很理解,待商榷)

        入站:PREROUTING>INPUT

        出站:OUTPUT>POSTROUTING

        转发:PREROUTING>FORWARD>POSTROUTING

下图内包含入站台数据流、转发数据流、出站数据流的链、表匹配顺序:

3.1 iptables语法构成

iptables  [-t 表名] 选项 [链名]  [条件]  [-j 控制类型]
几个注意事项
•不指定表名时,默认指filter表
•不指定链名时,默认指表内的所有链
•除非设置链的默认策略,否则必须指定匹配条件
•选项、链名、控制类型使用大写字母,其余均为小写

 常见的动作类型(控制类型):

ACCEPT:允许通过
DROP:直接丢弃,不给出任何回应
REJECT:拒绝通过,必要时会给出提示
LOG:记录日志信息,然后传给下一条规则继续匹配
SNAT:修改数据包源地址
DNAT:修改数据包目的地址
REDIRECT:重定向

常见的选项:

 举例说明:

iptables -F
iptables  -I 2 INPUT -p icmp -j ACCEPT
iptables -I 2 INPUT -p icmp -j ACCEPT
iptables -I INPUT 2 -p icmp -j ACCEPT
iptables -L
iptables  -L -n 
iptables -L -n
iptables  -L -n --line-numbers
iptables  -L -n -v
iptables -P INPUT DROP
iptables -t filter -A INPUT -p icmp -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -t filter -A INPUT -p tcp -j ACCEPT
iptables -t filter -D INPUT 4
iptables -t filter -F
iptables -t filter -I INPUT -p tcp --dport 80 -j ACCEPT
iptables -t filter -I INPUT -p udp -j ACCEPT
iptables -t filter -L
iptables -t filter -L 
iptables -t filter -L -n
iptables -t filter -P ACCEPT
iptables -t filter -P INPUT ACCEPT

3.2 iptables匹配类型

(1)通用匹配

  •  可直接使用,不依赖于其他条件或扩展
  •  包括网络协议、IP 地址、网络接口等条件

(2)隐含匹配

  •  要求以特定的协议匹配作为前提
  •  包括端口、TCP 标记、ICMP 类型等条件

(3)显式匹配

  •  要求以“-m 扩展模块”的形式明确指出类型
  •  包括多端口、MAC 地址、IP 范围、数据包状态等条件

3.2.1 通用匹配

常见的通用匹配条件

  • 协议匹配:-p 协议名
  • 地址匹配:-s 源地址、-d 目的地址
  • 接口匹配:-i 入站网卡、-o 出站网卡
代码演示示例
# iptables -A FORWARD -s 192.168.1.11 -j REJECT
# iptables -I INPUT -s 10.20.30.0/24 -j DROP
# iptables -I INPUT -p icmp -j DROP
# iptables -A FORWARD -p ! icmp -jACCEPT
# iptables -A INPUT -i eth1 -s 172.16.0.0/12 -j DROP

3.2.2 隐含匹配


常用的隐含匹配条件

  •  端口匹配:--sport 源端口、--dport 目的端口
  •  ICMP 类型匹配:--icmp-type ICMP 类型(icmp-type 0表示放通icmp reply)
代码演示示例
# iptables -A FORWARD -s 192.168.4.0/24 -p udp --dport 53 -j ACCEPT
# iptables -A INPUT -p tcp --dport 20:21 -jACCEPT
# iptables -A INPUT -p icmp --icmp-type 8 -j DROP
# iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
# iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT
# iptables -A INPUT -p icmp -j DROP

3.2.3 显式匹配


常用的显式匹配条件
(1)多端口匹配

  • -m multiport --sport 源端口列表
  • -m multiport --dport 目的端口列表

(2)IP 范围匹配

  • -m iprange --src-range IP 范围

(3)MAC 地址匹配

  • -m mac –mac1-source MAC 地址

(4)状态匹配

  • -m state --state 连接状态

代码演示示例:

# iptables -A INPUT -p tcp -m multiport --dport 25,80,110,143 -j ACCEPT
# iptables -A FORWARD -p tcp -m iprange --src-range 192.168.4.21-192.168.4.28 -j ACCEPT
# iptables -A INPUT -m mac --mac-source 00:0c:29:c0:55:3f -j DROP
# iptables -P INPUT DROP
# iptables -I INPUT -p tcp -m multiport --dport 80-82,85 -j ACCEPT
# iptables -I INPUT -p tcp -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

3.3 SNAT

SNAT 策略的典型应用环境:局域网主机共享单个公网 IP 地址接入 Internet。SNAT 策略的原理

  • 源地址转换,Source Network Address Translation
  • 修改数据包的源地址

实验环境:

 启动 SNAT 转换代码记录,前提条件:

  • 局域网各主机正确设置 IP 地址/子网掩码
  • 局域网各主机正确设置默认网关地址
  •  Linux 网关支持 IP 路由转发
linux网关配置SNAT规则:
iptables -t nat -A POSTROUTING -s 10.10.1.0/24 -o enp0s9 -j SNAT --to-source 10.0.4.15
linux网关开启路由转发:
[root@vm4 ~]# cat /etc/sysctl.conf 
# sysctl settings are defined through files in
# /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/.
#
# Vendors settings live in /usr/lib/sysctl.d/.
# To override a whole file, create a new file with the same in
# /etc/sysctl.d/ and put new settings there. To override
# only specific settings, add a file with a lexically later
# name in /etc/sysctl.d/ and put new settings there.
#
# For more information, see sysctl.conf(5) and sysctl.d(5).
net.ipv4.ip_forward = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296

3.3.1 MASQUERADE(地址伪装)

  • 适用于外网 IP 地址 非固定的情况
  • 对于 ADSL 拨号连接,接口通常为 ppp0、ppp1
  • 将 SNAT 规则改为 MASQUERADE 即可
iptables -t nat -A POSTROUTING -s 10.10.1.0/24 -o enp0s9 -j MASQUERADE

3.4 DNAT

        DNAT 策略的典型应用环境:在 Internet 中发布位于企业局域网内的服务器。DNAT 策略的原理:

  • 目标地址转换,Destination Network Address Translation
  • 修改数据包的目标地址

实验环境:

 启动 DNAT 转换代码记录,前提条件:

  • 局域网的 Web 服务器能够访问 Internet
  • 网关的外网 IP 地址有正确的 DNS 解析记录
  • Linux 网关支持 IP 路由转发
linux网关开启路由转发:
[root@vm5 ~]# cat /etc/sysctl.conf 
# sysctl settings are defined through files in
# /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/.
#
# Vendors settings live in /usr/lib/sysctl.d/.
# To override a whole file, create a new file with the same in
# /etc/sysctl.d/ and put new settings there. To override
# only specific settings, add a file with a lexically later
# name in /etc/sysctl.d/ and put new settings there.
#
# For more information, see sysctl.conf(5) and sysctl.d(5).
net.ipv4.ip_forward = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
linux网关DNAT配置:
iptables -t nat -A PREROUTING -i enp0s8 -d 10.10.1.10 -p tcp --dport 80 -j DNAT --to-destination 172.20.10.10

3.5 其他命令补充

常见 Iptables 相关命令(补充)

  • 导出(备份)规则:iptables-save 工具,可结合重定向输出保存到指定文件;
  • 导入(还原)规则:iptables-restore 工具,可结合重定向输入指定规则来源;

iptables 服务

  • 脚本位置:/etc/init.d/iptables
  • 规则文件位置:/etc/sysconfig/iptables

        防火墙规则只在计算机处于开启状态时才有效 。 如果系统被重新引导 , 这些规则就会自动被清除并重设。要保存规则以便今,请使用以下命令:后载入sbin/service iptables save。
        在保存在 /etc/sysconfig/iptables 文件中的规则会在服务启动或重新启动时(包括机器被重新引导时 )被应用。

4 使用iptables做snat网关时内核参数配置

进入内核文件vim/etc/sysctl.conf,设置内核参数(官方文档请参考:https://www.kernel.org/doc/Documentation/networking/nf_conntrack-sysctl.txt):

另外一些nf_conntrack-sysctl.txt参数的解释可以参考:

https://zhuanlan.zhihu.com/p/349569851

rp_filter内核参数介绍:

https://www.cnblogs.com/lipengxiang2009/p/7446388.html

linux ip绑定:

https://blog.csdn.net/weixin_33330762/article/details/116737936

内核参数介绍:

https://www.cnblogs.com/tolimit/p/5065761.html

内核参数:sysctl.conf

net.core.somaxconn = 65535 #用来限制监听(LISTEN)队列最大数据包的数量,默认是128,超过这个数量就会导致链接超时或者触发重传机制.对繁忙的服务器,增加该值有助于网络性能.
net.ipv4.tcp_max_syn_backlog = 32768 #默认1024,对重负载服务器,可调整到2048,以容纳更多等待连接的网络连接
net.ipv4.tcp_slow_start_after_idle = 0 #关闭tcp的连接传输的慢启动,即先休止一段时间(慢启动算法,并不是休止),再初始化拥塞窗口
net.ipv4.tcp_fin_timeout = 30 #表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间
net.ipv4.ip_local_port_range = 20000 65000 #表示用于向外连接的端口范围。缺省情况下很小:32768到61000
net.ipv4.tcp_tw_reuse = 1 #表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.ip_local_reserved_ports = 20000-21552 #预留端口,防止一些端口被随机占用导致一些服务起不来
net.netfilter.nf_conntrack_icmp_timeout = 10 #默认30s超时,一般不会持续这么久,可以设置小一点10s或者更短
net.netfilter.nf_conntrack_tcp_timeout_syn_sent = 60 #可以理解为处于syn_sent状态的超时时间,默认120s,一般程序不会这么长
net.netfilter.nf_conntrack_tcp_timeout_syn_recv = 30 #类似,故意不发握手的 ACK 即可。但这个超时时间没那么夸张,系统也有 syn cookie 机制来缓解 syn flood 攻击
net.netfilter.nf_conntrack_tcp_timeout_established = 7200 #让iptables对于已建立的连接,7200秒(2小时,经验值)若没有活动,那么则清除掉,默认的时间是432000秒(5天)
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120 #默认120s,net.ipv4.tcp_fin_timeout #默认 60 秒,通常还会参考 BSD 和 macOS 设成更小的值。这里往往也没必要这么大。
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120 #默认 120。Linux 里的 MSL 写死 60 秒(而不是 TCP 标准里拍脑袋的 120 秒),TIME_WAIT 要等 2MSL,这里 120算是个合理的值。但现在默认有PAWS(net.ipv4.tcp_timestamps),不会出现标准制定时担心的迷途报文回来碰巧污染了序列号相同的新连接的数据的情况。互联网公司基本都开net.ipv4.tcp_tw_reuse,既然半连接都不留这么久,记录似乎也不需要留这么久。
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60 #默认60。CLOSE_WAIT 状态是让被动关闭方把该传的数据传完。如果程序写得不好,这里抛了未捕捉的异常,也许就走不到发 FIN 那步了,一直停在这里。
net.netfilter.nf_conntrack_tcp_timeout_last_ack = 30 #默认30s,被动关闭方(应该是主动关闭方,被动方为啥会主动发fin?)发FIN后如果一直收不到对面的 ACK 或 RST,会不断重发,直到超时才 CLOSE。net.ipv4.tcp_retries2 的默认值是 15,最多要等 924.6 秒……不过一般都会调小这个值。
net.netfilter.nf_conntrack_udp_timeout = 30 #默认30s,udp协议的conntrack被设置的超时时间(每次看到包都会用这值重新更新定时器),一旦到时conntrack将被回收.(秒)
net.netfilter.nf_conntrack_udp_timeout_stream = 180 #默认180s,当看到一些特殊的udp传输时(传输在双向)设置的ip_conntrack超时时间(每次看到包都会用这值重新更新定时器).(秒)
net.netfilter.nf_conntrack_max = 2097152  #修改防火墙表大小,默认65536
net.ipv4.neigh.default.gc_thresh1 = 81920 #存在于ARP高速缓存中的最少层数,如果少于这个数,垃圾收集器将不会运行。缺省值是128
net.ipv4.neigh.default.gc_thresh2 = 163840 #保存在 ARP 高速缓存中的最多的记录软限制。垃圾收集器在开始收集前,允许记录数超过这个数字 5 秒。缺省值是 512。
net.ipv4.neigh.default.gc_thresh3 = 327680 #保存在 ARP 高速缓存中的最多记录的硬限制,一旦高速缓存中的数目高于此,垃圾收集器将马上运行。缺省值是1024
net.ipv4.conf.all.rp_filter = 2 #开启松散的反向路径校验。对每个进来的数据包,校验其源地址是否可达,即反向路径是否能通(通过任意网口),如果反向路径不同,则直接丢弃该数据包。
net.ipv4.conf.default.rp_filter = 2 #开启松散的反向路径校验。对每个进来的数据包,校验其源地址是否可达,即反向路径是否能通(通过任意网口),如果反向路径不同,则直接丢弃该数据包。
net.ipv4.ip_no_pmtu_disc = 0 #缺省值0表示关闭,全局范围内关闭路径MTU探测功能
net.ipv4.ip_nonlocal_bind = 0 #缺省值0表示关闭,不允许进程邦定到非本地地址
net.ipv4.ip_forward = 1 #开启路由转发

修改hashsize表项:(同时修改连接跟踪状态表:nf_conntrack)

  • hashsize:8G内存65536,按比例增加
  • nf_conntrack= hashsize*4

无法直接修改文件,用tee提权:

echo 524288 | tee /sys/module/nf_conntrack/parameters/hashsize

重启iptables后失效,需重新配置。(这种方式网上有说iptables -L -n查看表项或者重启iptables服务都能把nf_conntrack状态跟踪表刷新变成默认65536:https://blog.csdn.net/weixin_45423952/article/details/112752962

需要通过以下这种方式来使得状态跟踪表一直是我们设定的值:

  • 设置配置文件”/etc/modprobe.d/nf_conntrack.conf”, 内容为“options nf_conntrack hashsize=【根据内存计算出的hashsize】,保持net.nf_conntrack_max ="4*hashsize"。(这个地方网上有说8*hashsize也有说4*hashsize)

nf_conntrack的一些查询命令:

(1)查看当前的连接数:
# grep nf_conntrack /proc/slabinfo

(2)查出目前 nf_conntrack 的排名:
$ cat /proc/net/nf_conntrack | cut -d ' ' -f 10 | cut -d '=' -f 2 | sort | uniq -c | sort -nr | head -n 10

(3)hash表相关操作
运行状态中通过 sysctl net.netfilter.nf_conntrack_buckets 进行查看,通过文件/sys/module/nf_conntrack/parameters/hashsize 进行设置 
或者新建 /etc/modprobe.d/iptables.conf ,重新加载模块才生效: 
options nf_conntrack hashsize = 262144

(4)优化参数
状态跟踪表的最大行数的设定,理论最大值 CONNTRACK_MAX = RAMSIZE (in bytes)/16384/(ARCH /32) 。以64G的64位操作系统为例,CONNTRACK_MAX = 64*1024*1024*1024/16384/2 = 2097152 

即时生效请执行: 
sysctl –w net.netfilter.nf_conntrack_max = 524288  (16G)

5、配置多队列对应多cpu


版权声明:本文为weixin_45537413原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。