目录
1、iprange模块
2、string模块
3、time模块
4、connlimit模块
5、 limit模块
6、tcp-flags模块
匹配规则
7、state模块
8、FORWARD转发
①步骤
②临时打开转发
③永久打开转发
④添加规则
⑤举例
9、白名单、黑名单机制
10、自定义链
11、REJECT
12、LOG
13、NAT,SNAT,MASQUERADE处理动作讲解
14、REDIRECT端口映射
步骤
①在/etc/httpd/conf/httpd.conf文件中修改端口
②启动httpd
③在浏览器中输入IP地址
1、iprange模块
作用:指定连续的ip地址范围
--src-range:源地址范围
--dst-range:目标地址范围
模块在使用时需要加 -m
# iptables -t filter -I INPUT -m iprange --src-range 192.168.100.100- 192.168.100.200 -j REJECT # iptables -t filter -I INPUT -m iprange ! --src-range 192.168.100.100- 192.168.100.200 -j REJECT
2、string模块
可以指定匹配的字符串
语法:-m string --algo bm|bmp --string " bytes"
# iptables -t filter -I INPUT -m string --algo kmp --string "123" -j REJECT
3、time模块
匹配时间片 主要是时间范围,日期范围
- --timestart:
- --timestop
- --weekdays
- --monthdays
- --datestart 日期开始
- --datestop 日期结束
# iptables -t filter -I OUTPUT -p tcp -m tcp --dport 80 -m time --timestar
01:00:00 --timestop 9:00:00 -j REJECT
# iptables -t filter -I OUTPUT -p tcp -m tcp --dport 80 -m time --weekdays
1,2,3,4,5 -j REJECT
# iptables -t filter -I OUTPUT -p tcp -m tcp --dport 80 -m time --monthdays
1,2,3,4,5 -j REJECT
# iptables -t filter -I OUTPUT -p tcp -m tcp --dport 80 -m time --datestart 2022-
11-26 --datestop 2022-11-27 -j REJECT
使用以上命令,在限制时间内测试是否可以通过80端口:
防火墙使用的是UTC时间,Linux系统使用的是CST时间,所以设置时间的时候要注意。
- CST时间:中央标准时间
- UTC时间:世界协调时间
- 中国CST时间=UTC时间+8
4、connlimit模块
作用:限制每个IP地址链接数量
- --connlimit-above 限制连接上限
- --connlimit-mask 按照网段限制
# iptables -t filter -I INPUT -p tcp -m tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT
(只要想连接这个IP地址的IP地址的连接数量大于2,就拒绝其他连接)
# iptables -t filter -I INPUT -p tcp -m tcp --dport 22 -m connlimit --connlimit-above 2 --connlimit-mask 24 -j REJEC
(在这个网段内,连接某个IP地址的连接数量大于2,就拒绝这个网段内的其他连接)
因为192.168.198.138连接192.168.198.132的连接数量已经到达两个的连接上限,所以第三次连接就被拒绝了
5、 limit模块
作用:对报文的到达速率做限制(在自己的IP上制定规则,去限制其他IP的数据包流入)
--limit 单位时间内可以流入数据包的数量 second、minute,hour,day
令牌桶大小:默认是5 可以修改 --limit-burst
# iptables -t filter -I INPUT -s 192.168.100.142 -m limit --limit 10/min -j
ACCEPT
# iptables -t filter -A INPUT -s 192.168.100.142 -j REJECT
# iptables -t filter -R INPUT -s 192.168.100.134 -m limit --limit-burst 10 --
limit 10/min -j ACCEPT
一定要在最后写一条拒绝的规则,否则没有效果.
一分钟通10个包,每六秒通一个包,在第六秒的时候就通过了。
默认有五个包,也就是开始的时候默认流入5个包,将这5个包消耗完之后,就按规则来进行流入
默认可以流入5个包,在第6秒的时候没有令牌可以使用所以在这一秒就生成了一个令牌,在第七秒的时候使用了地6秒的令牌所以通过了;在之后都是第五秒生成第六秒通。
6、tcp-flags模块
SYN,ACK,FIN,RST,PSH,URG
SYN,ACK,FIN,RST,PSH,URG SYN(当你想过滤其中一个要先把所有的写上,空一格再写需要过滤的的)
匹配规则
# 三次握手第一次 (客户端给服务端发送,是要进入) # iptables -t filter -I INPUT -p tcp -m tcp --dport 80 --tcp-flags SYN,ACK,FIN,RST,PSH,URG SYN -j REJECT (表示将从80源端口发送的访问信息拒绝掉) # 三次握手第二次(服务端给客户端发送,是要出去) # iptables -t filter -I OUTPUT -p tcp -m tcp --sport 80 --tcp-flags SYN,ACK,FIN,RST,PSH,URG SYN,ACK -j REJECT (表示将发往80目的端口发送信息拒绝掉) 简化写法 # iptables -t filter -I INPUT -p tcp -m tcp --dport 80 --tcp-flags ALL SYN -j REJECT
7、state模块
报文状态
- NEW 第一次连接
- ESTABLISHED 已建立连接
- INVALID 无法识别的连接
- RELATED 相关联的连接
- UNTRACKED raw表关闭追踪连接
# iptables -t filter -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # iptables -t filter -A INPUT -j REJECT
一定要在最后写一条拒绝的规则,否则没有效果.
8、FORWARD转发
①步骤
- 先添加规则
- 在有两张网卡的IP上打开转发
- ping
②临时打开转发
③永久打开转发
[root@localhost ~]# vim /usr/lib/sysctl.d/50-default.conf
在文档末尾插入net.ipv4.ip_forward=1
(记得重启系统,才能生效。)
④添加规则
# 添加路由
# route add -net 192.168.200.0/24 gw 192.168.200.141
(表示想访问192.168.200网段的,必须先经过192.168.200.141)
Centos7:
# vi /usr/lib/sysctl.d/50-default.conf 插入 net.ipv4.ip_forward=1(永久打开转发)
# systcl -p 无法更新重启或者手动
# echo 1 > /proc/sys/net/ipv4/ip_forward (临时打开转发)
# iptables -I FORWARD -j REJECT
# iptables -I FORWARD -s 192.168.100.0/24 -p tcp -m tcp --dport 80 -j ACCEPT
# iptables -nL
# iptables -I FORWARD -d 192.168.100.0/24 -p tcp -m tcp --sport 80 -j ACCEPT
a
⑤举例
先添加规则
表示想访问192.168.139网段的,必须先经过192.168.198.133
192.168.198.133上有两张网卡 ,想访问192.168.139网段的,必须先经过192.168.198.133这个IP,再和这两个网卡匹配,如果某一个192.168.139网段的IP的网关是192.168.139.128或者192.168.198.133,那么就可以ping通,如果网关不是139.128,则不可以平通。
139.131的网关是139.128,所以可以ping通
而139.133的网关不是是139.128,所以不可以ping通
9、白名单、黑名单机制
报文在经过iptables的链时,会匹配链中的规则,遇到匹配的规则时,就执行对应的动作,如果链中的规则都无法匹配到当前报文,则使用链的默认策略(默认动作),链的默认策略通常设置为ACCEPT或者DROP。那么,当链的默认策略设置为ACCEPT时,如果对应的链中没有配置任何规则,就表示接受所有的报文,如果对应的链中存在规则,但是这些规则没有匹配到报文,报文还是会被接受。
同理,当链的默认策略设置为DROP时,如果对应的链中没有配置任何规则,就表示拒绝所有报文,如果对应的链中存在规则,但是这些规则没有匹配到报文,报文还是会被拒绝。
所以,当链的默认策略为ACCEPT时,链中的规则对应的动作应该为DROP或者REJECT,表示只有匹配到规则的报文才会被拒绝,没有被规则匹配到的报文都会被默认接受,这就是"黑名单"机制。
同理,当链的默认策略为DROP时,链中的规则对应的动作应该为ACCEPT,表示只有匹配到规则的报文才会被放行,没有被规则匹配到的报文都会被默认拒绝,这就是"白名单"机制。
默认策略设置为DROP的缺点,在对应的链中没有设置任何规则时,这样使用默认策略为DROP是非常不明智的,因为管理员也会把自己拒之门外,即使对应的链中存在放行规则,当我们不小心使用"iptables -F"清空规则时放行规则被删除,则所有数据包都无法进入,这个时候就相当于给管理员挖了个坑,所以,我们如果想要使用"白名单"的机制,最好将链的默认策略保持为"ACCEPT",然后将”拒绝所有请求这条规则放在链的尾部,将"放行规则"放在前面,这样做,既能实现"白名单"机制,又能保证在规则被清空时,管理员还有机会连接到主机。一般iptables默认策略是黑名单机制(ACCEPT),这样不会将自己拒绝掉。
10、自定义链
自定义链再使用时不能直接引用,必须引用才能使用,因为默认规则不走自定义链。
# 创建自定义链
# iptables -t filter -N IN_WEB
# 自定义链中添加规则
# iptables -t filter -I IN_WEB -s 192.168.100.141 -j REJECT
#引用自定义链
# iptables -t filter -I INPUT -p tcp -m tcp --dport 80 -j IN_WEB
#重命名自定义链
# iptables -E IN_WEB WEB
#删除自定义链
#1、自定义链无引用
#2、自定义链无规则(满足这两个条件才能删除)
# iptables -X WEB
11、REJECT
REJECT动作的常用选项为--reject-with
使用--reiect-with选项,可以设置提示信息,当对方被拒绝时,会提示对方为什么被拒绝
可用值如下:
destination-unreachable
- network-unreachable
- host-unreachable
- protocol-unreachable
- port-unreachable
- fragmentation-needed
- source-route-failed
- network-unknown
- host-unknown
- network-prohibited
- host-prohibited
- TOS-network-unreachable
- TOS-host-unreachable
- communication-prohibited
- host-precedence-violation
- precedence-cutoff
# iptables -p icmp -h(查看可用值)
# ping默认的拒绝信息是destination-port-unreachable
#增加提示信息
# iptables -t filter -I INPUT -s 192.168.198.132 -j REJECT --reject-with icmp-host-unreachable
#查看效果
12、LOG
LOG动作
使用LOG动作,可以将符合条件的报文的相关信息记录到日志中,但当前报文具体是被"接受”,还是被”拒绝”都由后面的规则控制,换句话说,LOG动作只负责记录匹配到的报文的相关信息,不负责对报文的其他处理,如果想要对报文进行进一步的处理,可以在之后设置具体规则,进行进一步的处理。
# iptables -t filter -I INPUT -s 192.168.198.132 -j LOG
(记录来自192.168.198.132的报文信息)
# tail -f /var/log/messages
(日志默认存放在这里)
13、NAT,SNAT,MASQUERADE处理动作讲解
NAT 是Network Address Translation的缩写,译为"网络地址转换”,NAT说白了就是修改报文的IP地址,NA功能通常会被集成到路由器、防火墙、或独立的NAT设备中。我们基本上局域网中的主机要想访问外网都是通过类似NAT的模式做的地址转换,因为我们可以用的公网地址太少了
例如我们现在整个班级的网络就是一个局域网,在局域网内我们的ip大家都是一个私有IP,这个IP是无法被公网访问的,那我们又是如何上网的呢,其实我们内部的网络在上网的时候报文都是通过我们的路由器或者防火墙经过处理后出去的,对外显示的是路由器或者是防火墙的地址。
实际上报文在经过路由器或者防火墙的时候,我们内网的主机IP已经被隐藏了,对应转换成了路由器或者防火墙的IP并映射一个端口,这些信息会被NAT记录下来,当外部主机收到信息后,源地址和源端口显示的是防火墙的IP和映射的端口,当外部的主机回应时,首先是由防火墙或者路由器收到的,这时候会根据我们NAT的记录,将相应报文中的目标IP和目标端口,改为内部主机的IP和端口,再将报文发给内部主机,这样整个过程就结束了,达到了内部主机上网,并且隐藏了内部主机的IP。
在整个过程中实际上有两次地址转换
1、内部主机的报文发送出去,报文的源IP和端口发生了改变:
Source Network Address Translation英文缩写SNAT
2、外部主机回应报文后,响应报文的目标IP和端口发生了改变:
Destinationnetwork address translation英文缩写为DNAT
# SNAT
iptales -t nat -I POSTROUTING -s 192.168.100.0/24 -j SNAT --to-source
192.168.200.1
# DNAT
iptales -t nat -I PREROUTING -d 192.168.200.1 -j DNAT --to-destination
192.168.100.134
iptales -t nat -I PREROUTING -d 192.168.200.1 -p tcp -m tcp --dport 80 -j DNAT
--to-destination 192.168.100.134:80
# MASQUERADE(动态的源地址转化)
iptables -t nat -I POSTROUTING -s 192.168.100.0/24 -o ens33 -j MASQUERADE
14、REDIRECT端口映射
使用REDIRECT动作可以在本机上进行端口映射;比如,将本机的80端口映射到本机的8081端口上:
# iptables -t nat -I PREROUTING -p tcp -m tcp --dport 80 -j REDIRECT --to-ports
8081
经过上述规则映射后,当别的机器访问本机的80端口时,报文会被重定向到本机的8081端口上。REDIRECT规则只能定义在PREROUTING链或者OUTPUT链中。
步骤
①在/etc/httpd/conf/httpd.conf文件中修改端口
# vi /etc/httpd/conf/httpd.conf
②启动httpd
# systemctl start httpd