Linux
Linux基础
查看Linux内核版本
uname -a 或 hostnamectl
Kali
kali 普通用户
root 管理员用户 uid=0
终端快捷键
tab 补全命令
ctrl + shift + + 放大终端字体
ctrl + - 缩小终端字体
ctrl + c 终止程序强制退出
ctrl + a 光标移动到行首
ctrl + e 光标移动到行尾
ctrl + alt + t 打开一个终端
ctrl + z 将程序放在后台并且暂停程序
ctrl + l 清屏 等价 clear
1 | jobs 查看Linux放在后台的命令 |
1 | fg %工作号 将标识为1的后台作业移动到前台终端运行 |

1 | bg %工作号 将标识为1的前台终端作业移动到后台运行 |

文件传输
- 直接拖动
直接从物理机拖到虚拟里 - 监听 + 下载
物理机python -m http.server port
虚拟机wget http://你的ip地址/要下载的文件名
Linux文件结构
- 无盘符
- 根目录 /

- bin 二进制文件存放的位置
- dev 设备目录 io设备
- home 普通用户家目录 如kali的家目录 /home/kali
- lib lib32 lib64 动态链接库文件
- mnt 挂载目录
- proc 进程目录
- sys 系统目录
- usr 用户目录
- boot 启动目录
- etc 配置目录
- media 多媒体目录
- opt 第三方软件目录
- root 管理员的家目录
- tmp 缓存目录 [临时文件]
- var 可变文件目录 [记录日志]
命令
1 | cd 切换目录(windows上称为切换文件夹) |

用户及权限
1 | whoami 返回当前的用户名 |
用户管理
/etc/passwd
用户名:密码占位符:uid:gid:标识符:家目录:登录的shell
- 密码:
- 其中一种情况直接存放密码的hash (已经比较少见了)
- 另一种情况如果是x密码占位符,就代表密码存放在
/etc/shadow文件中
早期 Unix 系统中,x的位置直接存储密码的加密哈希值。密码因历史遗留原因,只留下了占位符,密码已经存放在了/etc/shadow文件中我们称之为影子口令机制
[!tip] 影子口令
最早出现在 20 世纪 80 年代中期,用于增强系统安全性,将加密后的密码从所有人都可读的/etc/passwd文件转移到只有 root 用户可读的/etc/shadow文件中,同时在/etc/passwd文件的密码字段用x作为占位符
- 登录shell:/usr/bin/zsh 常见的登录shell还有bash,sh,csh,如果是/usr/sbin/nologin就代表该用户不能登陆和切换(一般用作服务账户)
/etc/shadow
1 | sudo cat /etc/shadow |


1 | Username :与 /etc/passwd 中的用户名对应。 |
- /etc/group 用户组的信息
- /etc/gshadow 用户组的策略信息
- useradd 添加用户 (必须是管理员权限执行)
1 | 创建用户zhangsan (默认没有密码,也没有家目录) |
- userdel 删除用户
1 | userdel -r -f zhangsan 强制删除zhangsan用户及其所有文件 |
- passwd 修改密码
1 | passwd 改自己密码 |
- su 切换用户
1 | su root 也可以直接写su |
- sudo 以管理员权限执行命令

[!important] sudo的延伸
如果是新创建的用户,是无法直接使用sudo来执行命令的
sudo配置文件位置:/etc/sudoers
sudo -l 查看自己的sudo配置行
1 | # User privilege specification |
四个ALL的含义
- 在任何主机上
- 可以切换到任何用户
- 可以切换到任何组
- 执行任何命令
在ubuntu,debian,kali默认安装后,root用户是空密码不能直接登录。可以sudo su并输入当前用户的密码,切换到root用户
任务:新建用户zs,把zs添加到/etc/sudoers配置文件中,要求zs可以使用sudo执行cat命令
步骤:
- 切换root用户
- 修改/etc/sudoers的权限,默认440,改为640
- 修改配置文件内容,加如下一行
1 | zs ALL=(ALL:ALL) /usr/bin/cat 可以使用的命令必须填写绝对路径 |
- 还原/etc/sudoers配置文件的权限
- 测试

sudo无密码执行[linux sudo 提权]
zs用户不需要密码,就能使用sudo执行cat命令,且只能使用cat命令
文件权限
文件创建时权限664 ,通常是 666 - umask (其实啊,在二进制层面是按位与操作),但”666减去umask”这个说法更容易理解
计算机很笨!计算机不会四则运算,只会位运算!
1 | 最终权限 = 默认权限 & (~umask) |
实际上
umask是什么呢?用户文件创建掩码。它决定了新创建文件和目录的默认权限
1 | 0-9位说明 |
给除了elf及shell脚本之外的文件赋予可执行权限是没有意义的
修改权限
- chmod 修改权限
1 | -R 递归赋予权限 |
- chown 变更文件或目录的拥有者或所属群组
1 | chown kali:kali 1.txt 修改1.txt的拥有者或所属群组为kali,kali |
权限拓展位
权限计算器: https://chmodcommand.com/
- setuid(suid)位:4xxx s
[!question] 思考
1.普通用户zhangsan能不能修改zhangsan自己的密码?可以
2.改密码其实是改哪个文件?/etc/shadow(/etc/passwd 占位符)
3.普通用户zhangsan能不能修改/etc/shadow?不可以

产生悖论
==suid权限的文件,在执行的时候,运行的权限为属主用户的权限==
/usr/bin/passwd属主是root,任何人执行passwd运行的权限都是root
suid权限赋予除elf文件和shell文件之外的文件是无意义的
- setgid(sgid)位: 2xxx s
==sgid权限的文件,在执行的时候,运行的权限为属组用户的权限== - sticky bit 粘滞位:1xxx t
/tmp文件夹的权限是777,黑客经常把恶意文件上传到这个目录(不需要考虑权限问题)
/tmp目录实际的权限是1777权限
==限制文件的权限与属主用户相关,root用户不受该限制==粘滞位只有赋予给文件夹才有意义,赋予给文件无任何意义
系统管理命令
- ifconfig 配置和显示Linux系统网卡的网络参数
1 | 属于第三方的软件包net-tools,部分Linux操作系统没有安装 |

- ip address (ip a) 查看ip

- ping 测试主机之间网络的连通性
1 | ping -c 4 www.baidu.com ping4下www.baidu.com结束ping |
Linux:
Windows:
ping 命令的小细节
首先,大家都知道ping 命令基于 ICMP(Internet Control Message Protocol)协议 因特网控制消息协议 这里附上一张图,介绍了它的type和code,了解这个能让我们快速的通过ping的报错,抓包分析快速定位到错误原因
pc上ping不通的几种情况原因及解决方法 (经验之谈 一般情况,不全)
- 无法访问目标主机
- 原因:网关没有路由,没有获取到MAC地址 arp解析失败…

解决方法:检查pc的路由表,检查arp表项,检查网关配置是否正确…
- 原因:网关没有路由,没有获取到MAC地址 arp解析失败…
- 传输失败
- 原因:当主机尝试去访问其它网络内的主机,而本身没有配置网关

解决方法:检查网关,是否配置,配置网关…
- 原因:当主机尝试去访问其它网络内的主机,而本身没有配置网关
- 请求超时
- 原因:对方主机不在线、屏蔽等…

解决方法:一般来说无需解决,只是ping不通而已,这跟windows防火墙策略有关,想要通,检查双方防火墙,高级防火墙设置。对方pc打开icmp入站规则,我方pc打开出站规则,即可通…
通常是这样,实际情况需一步步排错
- 原因:对方主机不在线、屏蔽等…
- ttl: 生存时间,每经过一个路由器减1 (了解即可)
- TTL默认值 (只是默认值,可以改的)
- Linux 64
- Windows 128
- MacOS 64
- TTL默认值 (只是默认值,可以改的)
linux系统中的ping是无线循环的
ping 127.1 ,0,127.0.0.1 是一样的效果
在命令执行中,限制payload的长度时,可以使用这个小技巧

- nslookup 查询域名DNS信息
1 | nslookup 域名 dns服务器的地址 |


为什么有多个ip地址出现
1.网站使用CDN负载均衡
2.网站服务器有不同的公网出口
网络状态
dns www.baidu.com => ip
netbios 主机名 => ip (局域网)
网络管理
- netstat
1 | 属于第三方的软件包net-tools,说明部分Linux操作系统没有安装 |

proto 协议
local address 本地地址
foreign address 外部地址
state 状态
TCP常用状态
- ESTABLISHED 已连接
- LISTEN 监听
- TIME-WAIT 时间等待
额外小拓展:
tcp 从建立到关闭连接过程草图
pid 进程号/program name 程序名
如果在Local Address中看到0.0.0.0代表ifconfig看到的所有ipv4网络地址
端口返回0~65535 tcp/udp
Foreign Address外部地址(目标地址)中的0.0.0.0 表示所有ipv4地址(任意)
源端口随机(port >= 40000),目的端口固定

80端口的监听允许所有的ipv4地址连接(前提是能连的上,公网默认不能连接内网)
1 | Windows中是netstat -ano netstat -anob(必须管理员权限) |
请注意这里我能使用grep,是因为我在windows中配置过,通常情况下是无法结合使用grep的!
查找445端口有没有被占用:netstat -ano | grep ":445"
在Windows中常规方法为:netstat -ano | findstr ":445"
[::] ipv6 等价于 ipv4的0.0.0.0
- ss -antup 兼容netstat
1 | 比 netstat 好用的socket统计信息,iproute2 包附带的另一个工具,允许你查询 socket 的有关统计信息 |

- lsof -n -i
- -n 阻止 lsof 将 IP 地址反向解析为域名
- -i 只显示与网络相关的“文件”
列出系统中所有正在使用的网络连接,并以纯 IP 地址的形式显示

如果不加 -n

1 | lsof 用于查看你进程打开的文件,打开文件的进程,进程打开的端口(TCP、UDP) |
进程管理
- ps -elf / ps -aux 查看进程
1 | -e:显示所有程序 |

ps -aux 查看进程详细信息
1 | -a:显示所有终端机下执行的程序,除了阶段作业领导者之外 |

[!NOTE] 如何查看pid运行对应的程序 (木马排查)
方法一:
lsof -p pid
方法二:
cd /proc/pid
ls -l exe
如何终止程序
- kill 结束进程
1 | kill -9 想终止进程的PID |
- top 实时显示进程 每5秒刷新一下
按q退出
1 | top交互时命令 |

网络配置
ip地址
kali & ubuntu
配置文件:/etc/network/interfaces
kali/debian/ubuntu都是这个配置文件
1 | auto eth0 |
新版本ubuntu
1 | 安装vim |
在/etc/netplan/01-network-manager-all.yaml 修改配置文件前,切记备份
1 | sudo cp -p /etc/netplan/01-network-manager-all.yaml /etc/netplan/01-network-manager-all.yaml.bak |
注意:语法要求相当严格,多一个少一个空格都不行
1 | network: |

补充小知识:yaml文件格式 参考文章: https://www.cnblogs.com/wxmdevelop/p/7341292.html
1 | YAML基本语法规则 |
配置完成后netplan try 检查语法错误netplan apply 应用网络配置

centos
配置文件:/etc/sysconfig/network-scripts/ifcfg-ens33
vim /etc/sysconfig/network-scripts/ifcfg-ens33
1 | # 这里说一些比较重要的配置项 |

重启网络
法一:
ifdown 网卡名称关闭ifup 网卡名称启动
法二:systemctl restart network.service
法三:service network restart

dns地址
1 | 配置文件:/etc/resolv.conf 临时配置,重启后还原 |

软件及服务的配置
安装软件
- apt / apt-get
apt换源vim /etc/apt/sources.list一次配置就行

1 | 查看ubuntu/debian/kali的系统版本 |
- yum
软件包管理CentOS Redhat 系列发行版本使用
1 | cat /etc/readhat-release 查看系统发行版本 CentOS Redhat |
服务配置
- systemctl 系统服务管理
它实际上将 service 和 chkconfig 这两个命令组合到一起
1 | systemctl start 服务名 启动服务 |
- /etc/init.d/服务的名字
1 | /etc/init.d/mysqld start |
- service
现在的操作系统,使用service命令,实际是转到systemctl命令的
1 | service 服务名 start |
操作系统信息
- 操作系统主机名
1 | hostname |
- 系统版本(发行版)
1 | Kali/Ubuntu/Debian |
- 系统版本(内核版本)
1 | uname -a 所有信息 |
- 历史记录
1 | history 查看历史记录 |
历史记录保存在那里?
1 | cat /当前用户家目录/.当前用户shell类型_history |
- 常见其他命令
1 | df -h 磁盘占用空间 |
后台运行程序
程序默认情况是在前台运行,如果让程序一开始就放到后台运行,需要在程序结尾加 &
1 | ping 114.114.114.114 > test.txt 默认情况,前台运行 |

nohup 运行时就能看见pid
ssh
ssh服务
默认端口22
kali / ubuntu 默认情况没有开启服务
1 | systemctl start ssh |
配置文件:/etc/ssh/sshd_config 服务配置文件
常见配置项:
1 | # ======================== |

配置文件(修改了任何内容,需要重启服务后才生效)

开启密码登录
配置完成后,重启服务systemctl restart ssh
ssh检查配置文件语法
1 | sudo sshd -t # 测试配置是否正确 |

修改成错误的配置如下:
ssh客户端
1 | ssh 用户名@主机ip |

==在同一个主机中端口不能冲突,同一局域网中ip不能冲突==
scp/sftp 文件传输
scp
scp是基于ssh服务的文件的复制工具
1 | scp 本地的文件路径 用户名@IP地址:服务器绝对路径 |
本地 -> 服务器
传输:
在/tmp目录找到该文件
服务器 -> 本地
1 | scp 用户名@IP地址:服务器绝对路径 本地的文件路径 |
下载: 
sftp
sftp是基于ssh的文件传输
1 | sftp 用户名@IP地址 |
支持功能:
1 | ls 列出服务器上的文件 |

密钥对登录
密钥默认路径:~/.ssh/
- public key 公钥 id_rsa.pub
- private key 私钥 id_rsa
密钥连接步骤
- 生成密钥
ssh-keygen -t rsa-t:指定要创建的密钥类型 在哪生成都可以
- 把公钥写入到服务器的~/.ssh/authorized_keys ~用户家目录
1 | echo "\nssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCm7I8g2E3XEoeUvoI6g57kLCznoGkeM+FG5qsiMsVZ7OSFQq8WfRPy3XtTiZfILBg61iQpd0JNl+sgoBi73tGNH8Ty2tstZBdmLWOmZAgtOZW0vJj8PpsjW2dCPFS/PvYP3Z5Fd6uy9U3p66KRGq1lXVKoD3HhE8jAai11doiJ68i6j/0NebktV8SHEmL6+xkMHp4mnlGdtLA/RszxH3ZFBkFiPkeiCVD+QEx4U9RnGVViWxF8/i8vbquS+jpqlJI1anZgJeYIk/bZVXYe5aMFETOn9hn7KSQBrfREZXHlRwBOLBz7c9uD/GOuAi8MWFjkRi4EAmsvZs/GdGWpBZ0FlBF0bQXGcqRwXQOUNQu1GB/gRsOJUQflZPV2KVhXh7qJ5f1Fq2h5mw3BtG+bjQD3eskx1LV40qKYLdQAost76q47XZB4x0+pD0ctNn6iuqaWJw71HEap4rPlRqpJ2O1iQjcCmwXWEYxAETbt7yByxg5pDfRg2XOwe1wtderq3RE= root@kali" >> /root/.ssh/authorized_keys |
- 用私钥连接ssh服务
1 | ssh root@ip -i 私钥路径 -p port |
在Windows上使用Linux上生成的公钥进行连接
- 把私钥文件放在Windows上
1 | cp -p /root/.ssh/id_rsa /home/kali/Desktop |
- 用私钥连接ssh服务
ssh root@ip -i 私钥路径 -p port
使用刚刚高权限的私钥连接,kali中报错情况如下:
使用刚刚高权限的私钥连接,Windows中报错情况如下:
这个报错是说id_rsa文件权限有问题,ssh服务识别id_rsa权限为600时,才能正常工作
在windows中修改id_rsa权限的方法


点击添加,选择主体,添加系统登录的用户

即可使用,再次尝试,发现登录成功
第三方工具连接ssh
- Tabby https://github.com/Eugeny/tabby
- WindTerm https://github.com/kingToolbox/WindTerm
- finalshell https://www.hostbuf.com/t/988.html
- MobaXterm https://mobaxterm.mobatek.net/
使用MobaXterm,私钥连接
连接成功
开机自启动
方法1:
1 | systemctl enable ssh |
方法2:
1 | update-rc.d ssh enable |
多用户的图形化模式开机自启动,就是把服务链接到/etc/rc5.d文件夹中
计划任务
定时任务在哪?
- 系统计划任务
/etc/crontab - 用户计划任务
- centos / redhat系列:
/var/spool/cron/用户名 - debian / ubuntu / kali系列:
/var/spool/cron/crontabs/用户名
- centos / redhat系列:
1 | crontab 选项 参数 |
计划任务怎么看懂?
系统计划任务
1 | 分钟 小时 日期 月份 星期 执行该定时任务的用户 要执行的命令或脚本 |
用户计划任务
谁来执行该计划任务,是通过计划任务的文件名确定的
比如/var/spool/cron/crontab/root
1 | 分钟 小时 日期 月份 星期 要执行的命令或脚本 |
系统重定向
1 | 文件描述符(File Descriptors) |

输入错误的命令 使用2>1.txt,观察1.txt的内容
Linux常见服务
ssh
22/tcp /etc/ssh/sshd_config ~/.ssh/authorized_keys
cron
/etc/crontab /var/spool/cron/[username] /var/spool/cron/crontabs/[username]
smb / samba
centos
445/tcp 文件共享/打印机服务
运行级别 3 代表Linux命令行模式(多用户)
运行级别 5 代表Linux图形化模式(多用户)
init 3 切换至命令行模式
init 5 切换至图形化模式
安装和启动
小技巧:yum install 软件包,找不到怎么办
- 换yum源
1 | wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo |
- epel 源(为centos提供更多的软件包)
==EPEL(Extra Packages for Enterprise Linux), 是由Fedora Special Interest Group维护的Enterprise Linux(RHEL、CentOS)中经常用到的包==
1 | wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo |
安装samba
1 | yum install samba |
启动samba
1 | systemctl start smb |
检测smb服务是否启用(看445端口有没有开启)
1 | netstat -anltup | grep 445 |
配置smb服务
1 | 配置文件:/etc/samba/smb.conf |
- [global] 全局配置
- security:share[匿名访问,不需要身份验证] user[需要用户登录才能访问]
- [homes] 用户家目录共享设置
- [printers]/[print$] 默认的打印共享服务
1.创建一个smb服务用户
服务用户,不需要登录,可以不要密码
1 | useradd zssmb -s /sbin/nologin |

添加一个共享文件夹mkdir /opt/tools
在配置文件/etc/samba/smb.conf中添加一个新的项
1 | [public_smb] |

重启服务systemctl restart smb
连接和使用smb
- Linux连接smb
如果没有smbclient命令,就需要安装samba-client软件包
1 | smbclient -U 用户 //服务器ip/共享名称 |
如果连接不上就关闭selinux和防火墙,在Centos7中防火墙是firewalld
[!help] Selinux
临时关闭selinux: setenforce 0
查看selinux状态: getenforce
关闭防火墙: systemctl stop firewalld
永久关闭selinux:需要修改配置文件/etc/seconfig
将SELINUX=enforcing 修改为SELINUX=disabled
查看共享文件夹
在这个命令行里输入help,查看samba的命令行帮助
- Linux挂载smb (默认只读)
1 | mount -o username=用户名 //服务器ip/共享文件夹 要挂载的目录 |
此时已经挂载成功,可以看见一个flag.txt
卸载挂载点,验证/mnt/下是否有内容
- Windows连接smb
- win + r输入smb访问路径,输入账户密码,点击确定

- 在资源管理器输入访问路径 ,输入账户密码(注意是反斜杠,称为UNC路径)

在Windows建立smb连接后,凭证会被缓存到系统中 - windows cmd命令连接smb
1 | net use 查看已经建立的网络连接 |
查看已经建立的网络连接
删除一句建立的网络连接,并验证是否删除成功
使用命令去连接smbnet use \\192.168.79.131\public_smb /user:zssmb "123456"
将smb共享文件夹映射到z盘net use z: \\192.168.79.131\public_smb /user:zssmb "123456"
Windows smb服务默认是开启的,无法连接:
- 防火墙默认阻止smb 连接
- 所有的杀毒软件也会阻止smb连接
- Windows本身限制windows smb服务,用户必须是administrator,但是这个用户在个人电脑上是默认禁用的
网络磁盘 nas
smb历史漏洞很多
- 永恒之蓝 ms17-010(windows smb)
- CVE-2017-7494(ubuntu smb)
FTP
文件传输协议
20/21 tcp
20 上传,下载端口
21 发送命令,身份验证端口
安装
需要安装vsftpd软件包
- yum安装
yum install vsftpd -y
- rpm安装
1 | # 下载rpm包 |
使用wget下载rpm如下图:
使用rpm安装vsftpd如下图:
配置
启动服务
1 | systemctl start vsftpd |
配置文件/etc/vsftpd/vsftpd.conf
特点:anon匿名用户的相关配置;local本地用户的相关配置
1 | anonymous_enable=YES:设置是否允许匿名用户登录FTP服务器。 |
- 无需配置即可匿名登录
- 身份验证登陆
1 | anonymous_enable=YES 拒绝匿名用户登录 |
创建一个普通用户作为ftp的登录用户,用户家目录设置为你登录ftp时访问的目录
1 | mkdir /opt/ftpdir |
有用的配置项如下,过滤出主配置文件的所有有效行:grep -v "^#" /etc/vsftpd/vsftpd.conf |grep -v "^$"
这样配置是不安全的,登录上ftp后,可以离开登录目录
限制用户无法离开家目录
1 | # 限制ftp登录的用户只能访问家目录和及其子目录 |

ftp服务器认为,ftp登录后的文件夹要不具备写权限,只有子文件夹才能写
1 | chmod -w /opt/ftpdir |
修改权限后,能够正常登录
使用
python快速开启ftp服务
原因是没有这个模块,解决办法:pip install pyftpdlib
下载时报错,这个错误是因为你的系统(如 Kali Linux)启用了 PEP 668(Python 外部包管理保护机制),禁止直接使用 pip 安装 Python 包到系统目录,以避免破坏系统依赖,有以下几种解决方式
使用虚拟环境
首先git clone 下载这个脚本
1 | git clone https://gitee.com/yijingsec/LinuxEnvConfig.git |
在LinuxEnvConfig目录中bash LinuxEnvConfig.sh运行脚本
安装Miniconda3来管理python的虚拟环境
接下来按着提示一步步安装完成,需要等待几分钟,输入conda -V有类似的结果说明安装成功,如果没有conda命令,重启一下电脑就好了
conda取消自动进入base虚拟环境
conda config –set auto_activate_base false
新版使用
conda config –set auto_activate false
常用命令
1 | conda activate 虚拟环境名称 进入虚拟环境 |

进入虚拟环境,使用pip安装pyftpdlib
安装完成,使用python开启ftp服务
1 | # 使用官方的源会有点慢,这里可以使用-i选项临时更改pypi镜像源 |

使用包管理器apt安装
apt install python3-包名


源码编译安装
灵活,想安装什么版本就安装什么版本
安装编译Python所需的依赖包
1 | yum install -y gcc openssl-devel bzip2-devel libffi-devel |
1 | 源码编译安装 |
在windows上连接ftp
- 使用命令连接与Linux一致
- 在Windows资源管理器
1 | ftp://服务器IP |
- 第三方FTP客户端
使用FileZilla
Linux防火墙
iptables
老版本的防火墙应用,基于netfilter,是CentOS 6 之前的默认防火墙
iptables命令主要由表(table)、链(chain)、规则(rule)三部分组成
- 表
filter:过滤数据包,最常用的表- nat表:用于网络地址转换(NAT),主要用于路由器等设备上
- mangle表:用于修改数据包的TTL值、TOS值等
- raw表:用于指定不被连接跟踪的数据包
- 链
INPUT链:处理进入本地主机的数据包OUTPUT链:处理从本地主机发出的数据包- FORWARD链:处理转发到其他主机的数据包
- PREROUTING链:在路由前对数据包进行处理
- POSTROUTING链:在路由后对数据包进行处理
- 规则
- 匹配条件
- 网络协议
- 源IP地址
- 目标IP地址
- 源端口号
- 目标端口号
- 动作
ACCEPT:允许数据包通过DROP:丢弃数据包REJECT:拒绝数据包- SNAT:源地址转换
- DNAT:目标地址转换
- 匹配条件
常用命令
1 | iptables -L -n --line-numbers |
添加规则
1 | iptables -I 或 -A |
为什么是丢弃目的端口的包如下图所示
丢弃kali的目的端口,源端口无法封,因为源端口随机
CentOS ip:192.168.79.131
Kali ip:192.168.79.79
设置防火墙规则前Kali ping CentOS
设置防火墙规则后Kali ping CentOS

1 | iptables -I INPUT -s 192.168.79.79 -p tcp -m multiport --dport 20,21 -j DROP |
添加规则(出方向)
1 | iptables -I OUTPUT -p icmp -j DROP |
删除规则
1 | iptables -D |

ufw
debian / ubuntu防火墙,基于iptables,其实还是iptables,但是ufw更简单,默认允许所有出方向流量,且默认禁止所有入方向流量
在kali中安装ufw
1 | apt install ufw |
基础使用
1 | 开启ufw服务 |

配置规则
1 | ufw allow 端口/tcp |
使用服务名称进行配置
1 | ufw allow from 192.168.79.131 to any port 80 proto tcp |

配置规则(出方向)
1 | ufw deny out 服务名 |

firewalld
redhat / centos 7之后的防火墙,firewalld不是iptables
基础操作
1 | systemctl start/stop/restart/status firewalld |
1 | 查看public区所有的规则 |

1 | 查看开放的端口 |

配置规则
firewalld 的出方向配置和指定ip地址配置都需要使用富规则,可以改用iptables
1 | firewall-cmd --add-port=8000/tcp |
添加允许规则后,访问
删除规则再次访问

访问失败,说明防火墙配置生效
firewalld 应急模式
1 | firewall-cmd --panic-on 开启应急模式 |
SELinux
SELinux(Security-Enhanced Linux)是一个内置于Linux内核中的安全子系统,它通过强制访问控制机制来增强系统的安全性。SELinux的工作原理是定义每个人对系统上的应用、进程和文件的访问控制,利用安全策略来强制执行允许的访问。SELinux有三种模式:Disabled(禁用),Permissive(宽容模式),和Enforcing(强制模式)。
不是传统意义的防火墙 selinux
1 | sestatus 查看selinux的状态 |

临时关闭
在Permissive和Enforcing之间可以通过命令setenforce进行临时切换
1 | setenforce 0 设置selinux模式为Permissive 宽容模式,仅记录违规不阻止 |

永久关闭
要在Disabled与Permissive或Enforcing之间切换,需要修改配置文件/etc/sysconfig/selinux并重启系统
SELinux的模式和状态切换
- Disabled:SELinux功能完全关闭,系统不会执行任何SELinux安全策略。
- Permissive:SELinux处于警告模式,违反策略的行为不会被阻止,但会被记录在日志中。
- Enforcing:SELinux处于强制模式,违反策略的行为将被禁止。
1 | SELINUX=disabled |
- 标题: Linux
- 作者: Parad0x7e
- 创建于 : 2025-11-19 20:56:05
- 更新于 : 2025-11-11 23:29:04
- 链接: https://note.easyctf.top/2025/11/19/Linux/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。


































