文章目录
- 1. iptables基本介绍
- 1.1 什么是防火墙
- 1.2 防火墙种类
- 1.3 iptables介绍
- 1.4 包过滤防火墙
- 1.5 包过滤防火墙如何实现
- 2. iptables链的概念
- 2.1 什么是链
- 2.2 iptables有哪些链
- 3. iptables表的概念
- 3.1 什么是表
- 3.2 表的功能
- 3.3 表与链的关系
- 4. iptables规则管理
- 4.1 什么是规则
- 4.2 iptables规则增、删、改、查
- 5. iptables基本匹配
- 5.1 iptables匹配参数
- 5.2 iptables匹配示例1
- 5.3 iptables匹配示例2
- 5.4 iptables匹配示例3
- 5.5 iptables匹配示例4
- 5.6 iptables匹配示例5
- 6. iptables扩展匹配
- 6.1 multiport模块
- 6.2 iprange模块
- 6.3 string模块
- 6.4 time模块
- 6.5 icmp模块
- 6.6 connlimit模块
- 6.6 limit模块
- 6.8 tcp-flags模块
- 7. iptables连接追踪state
- 7.1 什么是连接追踪
- 7.2 连接追踪有哪些状态
- 7.3 连接追踪应用场景
- 7.4 连接追踪配置场景
- 8. iptables地址转换
- 8.1 什么是NAT
1. iptables基本介绍
1.1 什么是防火墙
防火墙可以保护网络不受侵害,可以设置防火墙规则,确定哪些类型的数据包允许通过,哪些不允许通过。具有这类功能的设备或软件可以称之为防火墙。
1.2 防火墙种类
1. 从逻辑上讲,防火墙可以大体分为主机防火墙和网络防火墙
主机防火墙: 针对于单个主机进行防护,比如windows
网络防火墙: 往往处于网络入口,针对网络入口进行防护,服务于防火墙背后的服务器集群
2. 物理上将,防火墙分为硬件防火墙和软件防火墙
硬件防火墙: 在硬件级别实现部分防火墙功能,另一部分功能基于软件实现,性能高,成本高
软件防火墙: 以软件的方式模拟防火墙功能,运行在操作系统上,性能不高,成本低
1.3 iptables介绍
iptables其实不是真正的防火墙,就是一个代理程序,用户通过iptables这个代理程序,将安全规则执行到对应的安全框架中,这个安全框架才是真正的防火墙,这个安全阔加叫netfilter,是内核代码中不可缺少的一部分。
iptables位于操作系统的用户空间,后期是通过iptables命令工具操作netfilter内核框架。
所以iptables的完整假发应该是netfilter/iptables,它是linux平台下的包过滤型防火墙,这个包过滤防火墙是免费的,它可以代替昂贵的商业防火墙解决方案,完成数据包的过滤,连接追踪,限速,网络地址转换(NAT)等功能。
1.4 包过滤防火墙
1. 包过滤防火墙它工作在OSI七层模型中的网络层,用来匹配网络数据包的(header):
a. 将Header与预先定义好的防火墙规则进行比对
b. 与规则相匹配的包会被放行
c. 与规则不匹配的包则可能会被丢弃、也可能执行更复杂的动作
2. 由于包过滤防火墙工作在网络层,也称网络层防火墙,它通过检查每一个数据包的:
a. 源地址、目的地址
b. 源端口、目的端口
c. 协议类型(TCP、UDP、ICMP)
1.5 包过滤防火墙如何实现
包过滤防火墙是由Netfilter来实现的,它是内核的一部分
如果我们想要防火墙发到防火的目的,则需要在内核中设置关卡,多有进出的报文都要经过这些关卡进行检查:将符合条件的放行、不符合条件的组织、而这些关卡在iptables中不被成为关卡,而被成为链。
2. iptables链的概念
2.1 什么是链
防火墙的作用就在于对经过的数据报文进行规则匹配,然后执行规则对应的动作,所以当报文经过这些关卡的时候,则必须匹配这个关卡上的规则,但是这个关卡上可能不止有一条规则,而是由很多条规则,当我们把这些规则串到一起的时候,就形成了链。
所以每个经过这个关卡的报文都要将这条链上的所有规则匹配一遍,如果由符合条件的规则,则执行规则对应的动作,如果没有则执行默认链的动作。
2.2 iptables有哪些链
启动了防火墙共呢个是,报文需要经过很多关卡,根据实际情况的不同,报文经过链可能不同,答题分为如下三类:
请求本机经过哪些链: PREROUTING-->INPUT-->Local Process
经过本机又会经过哪些链:PREROUTING-->FORWARD-->POSTROUTING 网络防火墙
从本机发出又会经过哪些链:Local Process-->OUTPUT-->POSTROUTING
丽娜姐iptables链的数据包流向;后期在设定规则时,能很清晰的知道将规则设定在哪个链上;
3. iptables表的概念
3.1 什么是表
最大的单位是表,表中有链,链中有规则
每个链上都放置了一串规则,但是这些规则都很相似,把具有相同功能的规则集合在一起叫做表,所以说不同功能的规则可以放置在不同的表中进行管理,而iptables已经为我们定义了4种表,每种表对应了不同的功能。
3.2 表的功能
表名 | 作用 | 包含的链 |
---|---|---|
filter | 负责过滤功能 | INPUT 、 OUTPUT、 FORWARD |
nat | 负责网络地址转换功能 | PREROUTING 、INPUT、 OUTPUT、 POSTROUTING |
mangle | 负责修改数据包内容 | INPUT OUTPUT FORWARD POSTROUTING PREROUING |
raw | 关闭nat表上启用的连接追踪 | PREROUTING、OUTPUT |
3.3 表与链的关系
raw --> mangle --> nat --> filter
下面这两个表用的最多:
filter: 过滤,网络安全;
nat: 路由;地址转换;
表-->链-->规则(匹配条件+动作)
iptables -t filter -I INPUT -p tcp --dport 80 -j DROP
问题1:来自`10.0.0.1`的地址,访问本机的`web`服务请求不允许,应该在哪个表的哪个链上设定规则?
可能会觉的是PREROUTING链,但其实是INPUT链,因为我们要做的是过滤,而PREROUTING不能做过滤,所以是INPUT。
fiter表中的INPUT链上设定规则;
问题2:所有由本机发往`10.0.0.0/24`网段的`TCP`服务都不允许?
由本地发出会经过OUTPUT、POSTROUTING、但由于POSTROUTING不支持过过滤,所以应该在OUTPUT规则链上配置。
fiter表中的OUTPUT链上设定规则;
问题3:所有来自己本地内部网络的主机,向互联网发送`web`服务器请求都允许?
本地内部主机发送互联网经过PREROUTING、FORWARD、POSTROUTING而能做过滤的只有FORWARD
filter表中的FORWARD链上设定规则;
c -- iptables --> s
4. iptables规则管理
4.1 什么是规则
数据包的过滤基于规则,而规则是由匹配条件+动作组成
操作规则的语法:iptables [-t表名] 选项 [链名] [规则] [动作]
操作规则之前需要考量如下两个问题:
(1)要实现什么功能: 判断添加到哪个表上
(2)报文流经的路线: 判断添加到哪个链上
iptables选项 | 含义 | 示例 |
---|---|---|
-t, --table | 指定要操作的表(默认filter) | iptables -t filter |
-A,–append | 追加一条规则至链的末尾 | iptables -t filter -A INPUT |
-l, --insert | 插入一条规则至链的顶部 | iptables -t filter -l INPUT |
-D, --delete | 指定删除一条规则 | iptables -t filter -D INPUT 1 |
-R, --replace | 替换指定链中的规则 | iptables -t filter -R INPUT |
-S, --list-rules | 打印选定链中的所有规则 | iptables -t filter -S |
-F, --flush | 清空链中的所有规则 | iptables -t filter -F |
-Z, --zero | 将所有链中的数据包和字节计数器归零 | iptables -t filter -Z |
-N, --new-chain | 创建自定义名称规则链 | iptables -N New_Rules |
-E, --rename-chain | 给自定义链修改名称 | iptables -E Old_Rules New_Rules |
-X, --delete-chain | 删除自定义链 | iptables -X Rules_Name |
-P, --policy | 给链设定默认策略 | iptables -t filter -P DROP |
4.2 iptables规则增、删、改、查
默认不用-t 指定表,则默认为filter表;
1.如何查看
-L:查看 -n:不解析 -v 详细 --line-numbers 编号
[root@route ~]# iptables -L -n -v --line-numbers
2.如何添加规则: 禁止10.0.0.10 ping 10.0.0.200
-I:插入Insert
[root@route ~]# iptables -t filter -I INPUT -p icmp -j REJECT
[root@route ~]# iptables -L -n
3.如何修改规则:
-R:修改 需要指定规则的编号
[root@route ~]# iptables -t filter -R INPUT 1 -p icmp -j DROP
4.如何清空计数器:
[root@route ~]# iptables -Z
5.备份规则;
[root@route ~]# iptables-save > /etc/iptables.rule
6.清空规则:
[root@route ~]# iptables -F # 只操作filter
[root@route ~]# iptables -t nat -F # 清空nat表
7.恢复规则:
[root@route ~]# iptables-restore < /etc/iptables.rule
8.永久生效:
命令: iptables-restore < /etc/iptables.rule
加入开机自启动 /etc/rc.local
5. iptables基本匹配
5.1 iptables匹配参数
条件参数 | 含义 |
---|---|
-p , --protocol protocol | 指明需要匹配的协议,如icmp、udp、tcp |
-s , --source address/mask | 指定匹配源地址,如有多个可以逗号分隔 |
-d , --destination address/mask | 指定匹配目标地址,如有多个可以逗号分隔 |
–source-port, --sport port[:port] | 指定源端口 |
–destination-port, --dport port[:port] | 指定目标端口 |
-i, --in-interface name | 接收数据包的接口名称 |
-o, --out-interface name | 发送数据包的接口名称 |
-m, --match match | 执行需要使用的匹配项,属于扩展匹配 |
-j, --jump target | 执行匹配规则后的动作、ACCEPT、DROP、REJECT等 |
小提示: 每个链上的规则都是从上到下按顺序进行匹配,如果这个链上就只有一条规则,没有配配上,也没有被拒绝。因为下面已经没有规则了,所以默认通过(Chain INPUT (policy ACCEPT))。
[root@localhost ~]# iptables -t filter -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
5.2 iptables匹配示例1
仅允许10.0.0.10访问10.0.0.200服务器的80端口、其他地址全部拒绝
# -I插入规则第一行、-A 追加规则、-s源地址、-d目标地址、--dport目标端口、-j匹配后执行的动作
[root@localhost ~]# iptables -t filter -I INPUT -s 10.0.0.10 -d 10.0.0.200 -p tcp --dport 80 -j ACCEPT
[root@localhost ~]# iptables -t filter -A INPUT -d 10.0.0.200 -p tcp --dport 80 -j DROP
5.3 iptables匹配示例2
所有来访问本机的协议,属于TCP协议的都通通放行
[root@localhost ~]# iptables -t filter -I INPUT -p tcp -j ACCEPT
[root@localhost ~]# iptables -t filter -A INPUT -j DROP
5.4 iptables匹配示例3
凡是由本机发出的TCP协议报文,都允许出去,其他协议不行;
[root@localhost ~]# iptables -t filter -I OUTPUT -p tcp -j ACCEPT
[root@localhost ~]# iptables -t filter -A OUTPUT -j DROP
5.5 iptables匹配示例4
禁止其他主机从eth0像本机发送ping请求
[root@localhost ~]# iptables -t filter -I INPUT -i eth0 -p icmp -j DROP
5.6 iptables匹配示例5
允许主机发送ping请求,其他任何协议都不允许
[root@localhost ~]# iptables -t filter -I OUTPUT -p icmp -j ACCEPT
[root@localhost ~]# iptables -t filter -I OUTPUT -j DROP
6. iptables扩展匹配
6.1 multiport模块
multiport模块可以添加多个不连续的端口; -m multiport <--sports|--dports|--ports> [端口1,端口2,...,端口n]
示例: 10.0.0.10 访问本机20、21、80、443允许通过;
# 以.so的文件都是扩展模块
[root@localhost ~]# rpm -ql iptables | grep ".so"
[root@localhost ~]# iptables -F
[root@localhost ~]# iptables -t filter -I INPUT -m multiport -s 10.0.0.10 -d 10.0.0.200 -p tcp --dports 20:22,80,443 -j ACCEPT
[root@localhost ~]# iptables -t filter -A INPUT -j DROP
6.2 iprange模块
iprange模块可以指定"一段连续的IP地址范围";用于匹配报文的源地址或者目标地址,iprange扩展模块中有两个扩展匹配条件可以使用。
--src-range from[-to]:
原地址范围
--dst-range from[-to]:
目标地址范围
示例:10.0.0.5-10.0.0.10地址段ping本机,则丢弃;
[root@localhost ~]# iptables -t filter -F
[root@localhost ~]# iptables -t filter -I INPUT -p icmp -m iprange --src-range "10.0.0.5-10.0.0.10" -j DROP
[root@localhost ~]# iptables -t filter -L -n --line-numbers
6.3 string模块
string模块,可以指定要匹配的字符串,如果报文中包含对应的字符串,则符合匹配条件
--algo {bm|kmp}
: 字符匹配的查询算法
--string pattern
: 字符匹配的字符串
# 示例:应用返回的报文中包含字符`"hello"`,我们就丢弃当前报文,其余正常通过。
[root@localhost ~]# iptables -t filter -F
[root@localhost ~]# iptables -t filter -I OUTPUT -p tcp -m string --algo kmp --string "video" -j DROP
# curl --HHost:web.dk.net 10.0.0.200/index.html ,模拟头部添加域名
# 示例:用户请求iptables节点,如果请求中包含 “jd.dk.net” 则拒绝;
[root@localhost ~]# iptables -t filter -F
[root@localhost ~]# iptables -t filter -I INPUT -p tcp -m string --algo kmp --string "jd.dk.net" -j DROP
小提示: 这个是在主机进行拦截的,iptables如果是做的是网络防火墙,需要在forward链添加规则
6.4 time模块
time模块,可以根据时间段区匹配报文,吐过报文到达的时间在指定的时间范围内,则符合匹配条件
--timestart hh:mm[:ss]
: 开始时间
--timestop hh:mm[:ss]
: 结束时间
--monthdays day[,day...]
: 指定一个月的某一天
--weekdays day[,day...]
: 指定周一到周天
--kerneltz
: 使用内核时区而不是UTC时间
time:
--timestart: 14:12 -8: 06:12
--timestop: 14:14 -8: 06:14
协议:
icmp 限制
[root@route ~]# iptables -t filter -I INPUT -p icmp -m time --timestart 06:13 --timestop 06:15 -j DROP
string: (路由器)
限制早上:8:00 ~ 12:00 (00:00-04:00)
限制下午:14:00 ~ 18:00 (06:00-10:00)
网络策略
上午:
iptables -t filter -I FORWARD -p tcp -m string --string "qq" --algo kmp -m time --timestart 00:00 --timestop 04:00 -j DROP
iptables -t filter -I FORWARD -p tcp -m string --string "tb" --algo kmp -m time --timestart 00:00 --timestop 04:00 -j DROP
iptables -t filter -I FORWARD -p tcp -m string --string "jd" --algo kmp -m time --timestart 00:00 --timestop 04:00 -j DROP
iptables -t filter -I FORWARD -p tcp -m string --string "aqy" --algo kmp -m time --timestart 00:00 --timestop 04:00 -j DROP
iptables -t filter -I FORWARD -p tcp -m string --string "wx" --algo kmp -m time --timestart 00:00 --timestop 04:00 -j DROP
下午:
iptables -t filter -I FORWARD -p tcp -m string --string "qq" --algo kmp -m time --timestart 06:00 --timestop 10:00 -j DROP
iptables -t filter -I FORWARD -p tcp -m string --string "tb" --algo kmp -m time --timestart 06:00 --timestop 06:22 -j DROP
iptables -t filter -I FORWARD -p tcp -m string --string "jd" --algo kmp -m time --timestart 06:00 --timestop 10:00 -j DROP
iptables -t filter -I FORWARD -p tcp -m string --string "aqy" --algo kmp -m time --timestart 06:00 --timestop 10:00 -j DROP
iptables -t filter -I FORWARD -p tcp -m string --string "wx" --algo kmp -m time --timestart 06:00 --timestop 10:00 -j DROP
主机策略:
上午:
iptables -t filter -I INPUT -p tcp -m string --string "qq" --algo kmp -m time --timestart 00:00 --timestop 10:00 -j DROP
iptables -t filter -I INPUT -p tcp -m string --string "tb" --algo kmp -m time --timestart 00:00 --timestop 04:00 -j DROP
iptables -t filter -I INPUT -p tcp -m string --string "jd" --algo kmp -m time --timestart 00:00 --timestop 04:00 -j DROP
iptables -t filter -I INPUT -p tcp -m string --string "aqy" --algo kmp -m time --timestart 00:00 --timestop 04:00 -j DROP
iptables -t filter -I INPUT -p tcp -m string --string "wx" --algo kmp -m time --timestart 00:00 --timestop 04:00 -j DROP
下午:
iptables -t filter -I INPUT -p tcp -m string --string "qq" --algo kmp -m time --timestart 06:00 --timestop 10:00 -j DROP
iptables -t filter -I INPUT -p tcp -m string --string "tb" --algo kmp -m time --timestart 06:00 --timestop 06:24 -j DROP
iptables -t filter -I INPUT -p tcp -m string --string "jd" --algo kmp -m time --timestart 06:00 --timestop 10:00 -j DROP
iptables -t filter -I INPUT -p tcp -m string --string "aqy" --algo kmp -m time --timestart 06:00 --timestop 10:00 -j DROP
iptables -t filter -I INPUT -p tcp -m string --string "wx" --algo kmp -m time --timestart 06:00 --timestop 10:00 -j DROP
6.5 icmp模块
icmp模块: 可以控制其他主机无法ping通主机,但本机可以ping通其他主机
默认情况当禁止ping后,其他主机无法ping通本主机,本主机也无法ping通其他主机,现需要本主机可以ping通其他主机,而其他主机依然无法ping通本主机。
--icmp-type {type[/code]|typename}
指定ICMP类型,echo-request
(8请求)、echo-reply
(0回应)
# 常规做法不满足需求
[root@localhost ~]# iptables -t filter -I INPUT -p icmp -j DROP
# 通过扩展 icmp
[root@localhost ~]# iptables -t filter -F INPUT
# INPUT链只拒绝请求request,不拒绝reply。可以实现本主机可以ping通其他主机,而其他主机依然无法ping通本主机
[root@localhost ~]# iptables -t filter -I INPUT -p icmp --icmp-type "echo-request" -j REJECT
[root@localhost ~]# iptables -L -n
6.6 connlimit模块
connlimit扩展模块,限制每个客户端IP地址到服务端的并行连接数
--connlimit-upto n
: 如果现有连接数小于或等于n,则匹配
--connlimit-above n
: 如果现有连接数大于n,则匹配
DDOS攻击脚本程序,模拟大量的并发连接数;flood conect.c
示例: 使用脚本模拟DDOS攻击,然后检查网站是否异常,如果异常,则使用iptables限制并发连接数。
[root@localhost ~]# yum install httpd -y
[root@localhost ~]# echo "hello" > /var/www/html/test.html
[root@localhost ~]# echo "index" > /var/www/html/index.html
[root@localhost ~]# systemctl start httpd
# 通过netstat会发现大量的ESTABLISHED状态,从而造成正常用户请求异常;开启并发限制,然后测试
[root@localhost ~]# iptables -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 2 -j DROP
6.6 limit模块
limit模块,限制单位时间内流入包的数量
可以以秒为单位进行限制,也可以以分钟、小时、天最为单位进行限制。
--limit rate[second|minute|hour|day]
: 平均匹配的速率
--limit-burst number
: 超过限制速率的包,允许超过burst所设定值,默认可超出5个
# 1. 限制主机每分钟接收10个icmp数据包,差不多6秒会接收客户端一个数据包。(直接用ping进行测试)
# 清空规则
[root@localhost ~]# iptables -t filter -F
[root@localhost ~]# iptables -t filter -I INPUT -p icmp -m limit --limit 10/minute -j ACCEPT
[root@localhost ~]# iptables -t filter -A INPUT -p icmp -j REJECT
# 2. 允许icmp瞬间通过10个数据包通过,超过的数据包每分钟仅能通过一个
[root@localhost ~]# iptables -t filter -A INPUT -p icmp -m limit --limit 1/m --limit-burst 10 -j ACCEPT
# 如果超过10的我们给其drop掉
[root@localhost ~]# iptables -t filter -A INPUT -p icmp -j REJECT
# 3. 限制主机传输时的宽带每秒不超过500k;(500k * 1000=500000字节/1500=333个包)
[root@localhost ~]# iptables -t filter -I OUTPUT -p tcp -m limit --limit 300/second -j ACCEPT
[root@localhost ~]# iptables -t filter -A OUTPUT -p tcp -j DROP
限速:限制传输速度最多300k;
300k * 1000 = 300000 / 1500 = 200
主机防护:
filter表OUTPUT链:
[root@route ~]# iptables -t filter -I OUTPUT -p tcp -m limit --limit 200/second -j ACCEPT
[root@route ~]# iptables -t filter -A OUTPUT -p tcp -j DROP
网络防护:
filter:
[root@route ~]# iptables -t filter -I FORWARD -p tcp -m limit --limit 200/second -j ACCEPT
[root@route ~]# iptables -t filter -A FORWARD -p tcp -j DROP
6.8 tcp-flags模块
使用tcp模块的 --tcp-flags
可以对TCP的标志位进行匹配,匹配指定标志位的值是否为1;
在tcp协议建立连接的过程中,需要先进行三次握手,而三次握手就要依靠tcp头中的标志为进行
第一次: 客户端向服务点发起TCP连接,在TCP的flag标志位中,SYN,RST,ACK ,FIN等仅SYN为1,其他标志位为0
第二位:服务端向客户端返回ACK,在TCP的flag标志位中,SYN,RST,ACK,FIN等标志位仅SYN、ACK为1,其他标志位为0.
第三次: 客户端向服务端返回ACK,在TCP的flag标志位中,SYN,RST,ACK,FIN等标志位仅ACK为1,其他标志位为0
可以通过–tcp-flag指明需要匹配哪些标志位,然后在指明这些标志位中,哪些必须为1,剩余的都必须为0.
所以当服务器接收新请求时,SYN标志位必须1,其他的标志位为0.(这样可以避免木马程序通过端口主动向外发送新连接。)
tcp-flags:
[root@route ~]# man 8 iptables-extensions
客户端连接服务端22端口第一次握手必须是客户端发起的,所以SYN必须为1,剩下全部为0。然后服务端可以通过22端口返回对应的报文(SYN+ACK=1)。
# 数据包流入本机时的策略:
# --tcp-flags SYN,ACk,FIN,RST SYN 意思是SYN为1,其余的为0
iptables -t filter -I INPUT -p tcp --dport 22 -m tcp --tcp-flags SYN,ACk,FIN,RST SYN -j ACCEPT
iptables -t filter -I INPUT -p tcp --dport 22 -m tcp --tcp-flags SYN,ACk,FIN,RST ACK -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 22 -j REJECT
SYN+ACK数据包流出本机时策略:
iptables -t filter -I OUTPUT -p tcp --sport 22 -m tcp --tcp-flags SYN,ACK,FIN,RST SYN,ACK -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --sport 22 -m tcp --tcp-flags SYN,ACK,FIN,RST ACK -j ACCEPT
iptables -t filter -A OUTPUT -p tcp -j REJECT
7. iptables连接追踪state
7.1 什么是连接追踪
state(conntrack)连接跟踪,顾名思义,就是跟踪(并记录)连接的状态。
如下图:是一台IP地址为10.1.1.2的Linux机器,看到这台及其傻瓜有三条连接:
机器访问外部HTTP服务的连接(目的端口80)
外部访问机器内FTP服务的连接(目的端口21)
机器访问外部DNS服务的连接(目的端口53)
连接跟踪所做的事情就是发现并跟踪这些连接的状态;但这个追踪状态与TCP协议没有关系
它是由内核netfilter在IP层实现,可IP层是无连接、无追踪的,那是如何知道这个IP是否存在;
当用户发送请求时,会将用户的请求信息存储在内存开辟的空间中,对应在/proc/net/nf_conntrack
文件会记录源IP、目标IP、协议、时间、状态等信息
当用户再次发起请求,就可以通过文件获取该用户是否来过,一次来实现连接追踪机制;
注意:该文件能存储的条目时受/proc/sys/net/nf_conntrack_max设定大小所限
conntrack:
查看链接追踪详情:/proc/net/nf_conntrack
调整链接追踪大小:echo "100000" > /proc/sys/net/nf_conntrack_max
7.2 连接追踪有哪些状态
NEW :
新请求,内存中不存在此连接的相关条目,因此识别为第一次请求,状态为NEW;
ESTABLISHED:
NEW状态之后,再次建立连接,由于此前的连接还没有失效,所以追踪后被视为已连接通讯状态,状态为ESTABLISHED
RELATED:
相关的连接。比如ftp程序有两个连接,命令连接和数据连接;命令连接有来有往是一个独立的循环,数据来凝结有来有往又是另一个独立的循环,但是两者之间有关系,如果没有命令连接就不可能有数据连接,所以我们将这种称为相关联的连接
INVALID:
无效的连接
7.3 连接追踪应用场景
正常情况下服务器的80端口不会主动连接其他服务器,如果出现了80端口连接其他服务器,那么说明出现了异常行为,或者可以理解为中了木马程序病毒。反弹端口木马
如果关闭80端口的响应报文,就会造成请求进来无法响应;如果开放80端口则又会出现异常行为。
所以我们需要对80端口做连接追踪限制,凡是从80端口出去的就必须是对某个请求的响应,也就是说通过80端口出去的状态必须是ESTABLISHED,不能是NEW
7.4 连接追踪配置场景
(1)允许接收远程主机向本机发送的SSH与HTTP请求(NEW、ESTABLISHED)
(2)同时也仅允许本机像其他主机回应SSH以及HTTP响应(ESTABLISHED)
(3)但不允许本机通过22、80端口主动向外发起连接
# 外部访问内部主机可以连接的状态可以有NEW、ESTABLISHED
INPUT:
[root@route ~]# iptables -t filter -I INPUT -p tcp -m multiport --dport 80,22 -m state --state NEW,ESTABLISHED -j ACCEPT
[root@route ~]# iptables -t filter -A INPUT -p tcp -m multiport --dport 80,22 -j DROP
# 主机响应外部的主机状态只有ESTABLISHED。如果出现NEW的话,是内部主机主动向外发起请求是异常现象。
OUTPUT:
[root@route ~]# iptables -t filter -I OUTPUT -p tcp -m multiport --sport 22,80 -m state --state ESTABLISHED -j ACCEPT
[root@route ~]# iptables -t filter -A OUTPUT -p tcp -m multiport --sport 22,80 -j DROP
8. iptables地址转换
8.1 什么是NAT
网络地址转换(NAT),对(数据包的)网络地址(IP+Port)进行转换
例如: 机器自己的IP:10.1.1.2是能与外部正常通信的,但192.198网段是私有IP段,无法与外界通信,因此当源地址为192.168网段的包要出去时,机器会先将源IP换成机器自己的10.1.1.2再发送出去;收到应答包时,在进行相反的转换。这就是NAT的基本过程。