文章目录
iptables
前置知识–>内核
内核: kernel
内核的作用
操作系统的内核(Kernel)是操作系统的核心部分,它负责系统的低级别操作和资源管理。内核的主要作用包括:
-
进程管理:内核管理进程的创建、调度、通信、同步等。为进程分配运行所需的资源。
-
内存管理:负责系统内存的分配、回收,实现虚拟内存等。优化内存的使用。
-
文件管理:管理文件读写操作,实现文件系统,维护文件与硬件的映射关系。
-
设备驱动:为硬件设备提供驱动程序,实现软件与硬件的接口与交互。
-
系统调用:为应用程序提供系统调用接口,应用程序通过系统调用请求内核服务。
-
网络协议:内核实现TCP/IP等网络协议,为网络通信提供基础。
-
安全机制:实现访问控制等安全机制,保证系统安全稳定运行。
-
中断处理:响应硬件设备的中断请求,处理故障等中断。
总之,内核抽象了硬件层细节,为上层应用提供安全可靠、高效的运行环境,是连接软件和硬件的关键组件。它管理系统的基本功能与资源,对操作系统至关重要。
理解
进程分两种类型:
1.内核态: 内核态的进程可以访问用户空间,管理用户态的进程
2.用户态:用户态的进程不能随意访问内核态空间
iptables是什么?
iptable是Linux系统中的防火墙软件,主要用于管理网络流量、进行封包过滤。
iptable是Linux服务器的第一道防线,通过配置规则可以实现访问控制、流量过滤等功能,是Linux服务器安全的重要组件。它使用表、链、规则等结构管理流经服务器的所有网络流量。
iptables可以理解为---->是一个防火墙工具—》作用:给内核的netfilter软件传递参数
iptables的理解
进程分两种类型:
1.内核态: 内核态的进程可以访问用户空间,管理用户态的进程
2.用户态:用户态的进程不能随意访问内核态空间
netfilter 是内核里对退出系统的数据包进行过滤的软件
iptables 就是一个用户端的程序,给内核里的netfilter软件提供参数,告诉netfilter如何去过滤数据,哪些让通过,哪些不让
iptables有什么用?
iptable的主要用途包括:
- 访问控制:可以根据iptables的规则对访问服务器的网络流量进行过滤和控制,实现白名单或黑名单等访问控制。
- 数据包过滤:可以过滤特定端口、协议、源/目标IP等不需要的网络流量。
- 网络地址转换:利用nat表可以配置Linux作为网络地址转换路由器。
- 流量转发:通过设置FORWARD链规则可以控制不同网段间的流量转发。
- 防范攻击:可以过滤malloc、syn洪水等常见攻击流量。
- 日志记录:配合日志规则可以记录流量信息用于分析和审计。
- 限速:可以限制流经服务器的流量速率。
可以干什么?
iptables
提供了对网络数据包的高度控制能力,使得管理员可以根据特定需求配置复杂的网络过滤规则。然而,由于其灵活性和复杂性,正确配置 iptables
需要一定的网络和安全知识,以避免阻止合法的网络流量或导致不必要的问题。
iptables 和 firewalld 都是传参的
firewalld 是对 iptables 的封装,更高级了—>换了另外一套概念和方法,但是底层仍然调用iptables
👆
python 类 和 函数
👇
就像是类是对函数的封装
iptables的规则链
规则链:
规则的作用在于对数据包进行过滤或处理,根据处理时机的不同,各种规则被组织在不同的“链”中
链----->可以当作位置
规则链是防火墙规则/策略的集合
默认的5种规则链:
INPUT:处理入站数据包 ---->进入你的系统里的应用程序
OUTPUT:处理出站数据包 ---->应用程序的数据离开电脑
FORWARD:处理转发数据包
POSTROUTING链:在进行路由选择后处理数据包 —>SNAT
PREROUTING链:在进行路由选择前处理数据包 ---->DNAT
iptables的规则表
规则表
具有某一类相似用途的防火墙规则,按照不同处理时机区分到不同的规则链以后,被归置到不同的“表”中
规则表是规则链的集合
默认的4个规则表:
raw表:确定是否对该数据包进行状态跟踪
mangle表:为数据包设置标记
nat表:修改数据包中的源、目标IP地址或端口 ---->实现dnat和snat的
filter表:确定是否放行该数据包(过滤)—>进入应用程序
一个表中包含多条链
👇
好比方说: 一个战区里边有几个兵种
chain —>链
policy —>策略/规则
ACCEPT —>接收
DROP ---->丢弃
REJECT ---->委婉的拒绝—>不接收数据
规则表间的优先顺序
依次为:raw、mangle、nat、filter
规则链间的匹配顺序
入站数据:PREROUTING、INPUT
出站数据:OUTPUT、POSTROUTING
转发数据:PREROUTING、FORWARD、POSTROUTING
规则链内的匹配顺序
按顺序依次进行检查,找到相匹配的规则即停止(LOG策略会有例外)
若在该链内找不到相匹配的规则,则按该链的默认策略处理
iptables命令
iptables命令的语法格式
iptables [-t 表名] 管理选项 [链名] [条件匹配] [-j 目标动作或跳转]
几个注意事项
不指定表名时,默认表示filter表
不指定链名时,默认表示该表内所有链
除非设置规则链的缺省策略,否则需要指定匹配条件
-
常用选项:
-A
:添加一条规则到规则链。-D
:从规则链中删除一条规则。-I
:插入一条规则到规则链的指定位置。-F
:清空规则链中的所有规则。-L
:列出规则链中的所有规则。-P
:设置规则链的默认策略(默认动作)。-N
:创建一个新的用户自定义规则链。
-
常见规则链:
INPUT
:用于处理进入系统的数据包。OUTPUT
:用于处理从系统发送出去的数据包。FORWARD
:用于处理经过系统转发到其他目标的数据包。
常见的动作:
-
-p, --protocol:指定要匹配的网络协议,例如 TCP、UDP、ICMP 等。
-
-s, --source:指定数据包的来源 IP 地址或地址段,用于匹配源地址。
-
-d, --destination:指定数据包的目标 IP 地址或地址段,用于匹配目标地址。
-
-i, --in-interface:指定数据包的输入接口,用于匹配从指定接口进入的数据包。
-
-o, --out-interface:指定数据包的输出接口,用于匹配从指定接口输出的数据包。
-
–sport:指定源端口号,用于匹配数据包的源端口。
-
–dport:指定目标端口号,用于匹配数据包的目标端口。
-
-m, --match:指定要使用的扩展匹配模块,允许更复杂的规则匹配。
-
-j, --jump:指定动作,用于选择匹配规则后要执行的动作,如 ACCEPT、DROP、REJECT 等。
-
-i, --in-interface:指定数据包的输入接口,用于匹配从指定接口进入的数据包。
-
-o, --out-interface:指定数据包的输出接口,用于匹配从指定接口输出的数据包。
-
-g, --goto:跳转到用户定义的自定义规则链,实现规则链的组合和复用。
#例子
556 iptables -t filter -A INPUT -p tcp -j ACCEPT
558 iptables -t filter -I INPUT -p udp -j ACCEPT
560 iptables -t filter -I INPUT 2 -p icmp -j ACCEPT
562 iptables -P INPUT DROP
564 iptables -t filter -D INPUT 1
565 iptables -L -n --line
[goweb-~] iptables -A INPUT -p tcp --dport 22 -j ACCEPT
#建个脚本,清楚规则:
mkdir /iptables
cd /iptables/
vim clear_rule.sh
[goweb-iptables]# cat clear_rule.sh
#!/bin/bash
iptables='/usr/sbin/iptables'
$iptables -P INPUT ACCEPT
$iptables -F -t filter
$iptables -t nat -F
[goweb-iptables]#
创建计划任务:
自定义规则链:
iptables -t filter -N SC
[goweb-iptables]# iptables -L -n --line
Chain INPUT (policy ACCEPT)
num target prot opt source destination
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
Chain SC (0 references)
num target prot opt source destination
在自定义的规则里添加新的链:
[goweb-iptables]# iptables -t filter -A SC -p tcp --dport 8090 -j DROP
[goweb-iptables]# iptables -L -n --line
Chain INPUT (policy ACCEPT)
num target prot opt source destination
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
Chain SC (0 references)
num target prot opt source destination
1 DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8090
让新的链,能有活干:
新的链拜码头给老的链—>老的链给你分活
[goweb-iptables]# iptables -t filter -A INPUT -p tcp -j SC
👆这是input链将后续交给sc
[goweb-iptables]#
[goweb-iptables]# iptables -L -n --line
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 SC tcp -- 0.0.0.0/0 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
Chain SC (1 references)
num target prot opt source destination
1 DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8090
[goweb-iptables]#
删除规则:
[goweb-iptables]# iptables -D SC 1
[goweb-iptables]# iptables -X SC
[goweb-iptables]# iptables -L -n --line
Chain INPUT (policy ACCEPT)
num target prot opt source destination
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
[goweb-iptables]#
记忆协议和规则
传输层:
tcp udp---->源端口,目的端口
网络层:
ip icmp arp ospf rip
ip : 源ip 和 目的ip
icmp: 请求报文—>8 响应报文---->0
数据链路层:
源mac和目的mac
-p 协议名 protocols
-s 源地址
-d 目的地址
-i 网络接口名
-o 网络接口名
-j + 动作
ACCEPT---->通过
REJECT----->有回复的拒绝
DROP—>没有回复的拒绝
LOG—>记录日志功能
SNAT
记录日志功能
[goweb-iptables]# service rsyslog restart
iptables -I INPUT -p icmp -j LOG --log-prefix "gaohui" --log-level 4
[goweb-iptables]# iptables -L -n --line
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 LOG icmp -- 0.0.0.0/0 0.0.0.0/0 LOG flags 0 level 4 prefix "gaohui"
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
[goweb-iptables]# tail -f /var/log/sctest.log
Aug 3 16:12:23 goweb kernel: gaohuiIN=ens33 OUT= MAC=00:0c:29:95:9d:be:00:0c:29:ba:75:eb:08:00 SRC=192.168.50.3 DST=192.168.50.1 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=44702 DF PROTO=ICMP TYPE=8 CODE=0 ID=1808 SEQ=1
Aug 3 16:12:24 goweb kernel: gaohuiIN=ens33 OUT= MAC=00:0c:29:95:9d:be:00:0c:29:ba:75:eb:08:00 SRC=192.168.50.3 DST=192.168.50.1 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=45671 DF PROTO=ICMP TYPE=8 CODE=0 ID=1808 SEQ=2
Aug 3 16:12:25 goweb kernel: gaohuiIN=ens33 OUT= MAC=00:0c:29:95:9d:be:00:0c:29:ba:75:eb:08:00 SRC=192.168.50.3 DST=192.168.50.1 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=46474 DF PROTO=ICMP TYPE=8 CODE=0 ID=1808 SEQ=3
Aug 3 16:12:26 goweb kernel: gaohuiIN=ens33 OUT= MAC=00:0c:29:95:9d:be:00:0c:29:ba:75:eb:08:00 SRC=192.168.50.3 DST=192.168.50.1 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=47352 DF PROTO=ICMP TYPE=8 CODE=0 ID=1808 SEQ=4
Aug 3 16:12:27 goweb kernel: gaohuiIN=ens33 OUT= MAC=00:0c:29:95:9d:be:00:0c:29:ba:75:eb:08:00 SRC=192.168.50.3 DST=192.168.50.1 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=47843 DF PROTO=ICMP TYPE=8 CODE=0 ID=1808 SEQ=5
Aug 3 16:12:28 goweb kernel: gaohuiIN=ens33 OUT= MAC=00:0c:29:95:9d:be:00:0c:29:ba:75:eb:08:00 SRC=192.168.50.3 DST=192.168.50.1 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=48449 DF PROTO=ICMP TYPE=8 CODE=0 ID=1808 SEQ=6
Aug 3 16:12:29 goweb kernel: gaohuiIN=ens33 OUT= MAC=00:0c:29:95:9d:be:00:0c:29:ba:75:eb:08:00 SRC=192.168.50.3 DST=192.168.50.1 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=48920 DF PROTO=ICMP TYPE=8 CODE=0 ID=1808 SEQ=7
^C
#让别人拼不了我,我去ping别人---->禁止别人ping我,但我可以ping别人
[goweb-iptables]# iptables -I INPUT -p icmp --icmp-type 8 -j DROP
开启路由功能:
在跳板机上做----》👇
vim open_app.sh
#open ssh
iptables -t filter -A INPUT -p tcp --dport 22 -j ACCEPT
#open dns
iptables -t filter -A INPUT -p udp --dport 53 -s 192.168.50.0/24 -j ACCEPT
#open dhcp
iptables -t filter -A INPUT -p udp --dport 67 -j ACCEPT
#open http/https
iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 443 -j ACCEPT
#open mysql
iptables -t filter -A INPUT -p tcp --dport 3306 -j ACCEPT
#default policy DROP
iptables -t filter -P INPUT DROP
#drop icmp request
iptables -A INPUT -p icmp --icmp-type 8 -j DROP
在服务器上做👇
#发布ssh
iptables -t nat -A PREROUTING -d 192.168.2.178 -i ens36 -p tcp --dport 22 -j DNAT --to-destination 192.168.50.1:22
# 发布nginx
iptables -t nat -A PREROUTING -d 192.168.2.178 -i ens36 -p tcp --dprot 80 -j DNAT --to-destination 192.168.50.1:80
[goweb-iptables]# iptables -L -n --line
Chain INPUT (policy DROP)
num target prot opt source destination
1 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
2 ACCEPT udp -- 192.168.50.0/24 0.0.0.0/0 udp dpt:53
3 ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:67
4 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
5 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:443
6 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:3306
7 DROP icmp -- 0.0.0.0/0 0.0.0.0/0 icmptype 8
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
[goweb-iptables]# ^C
用和跳板机同网段的机器去测试
[root@localhost ~]# nc -z 192.168.50.1 80
[root@localhost ~]# echo $?
0
[root@localhost ~]# nc -z 192.168.50.1 22
[root@localhost ~]# echo $?
0
[root@localhost ~]# nc -z 192.168.50.1 53
^C
[root@localhost ~]# nc -w 1 -z 192.168.50.1 53
[root@localhost ~]# echo $?
1
[root@localhost ~]#