phpStudy 搭 DVWA、双靶场踩坑 是一键面板,这篇走源码编译:坑更多,也更懂 Linux 服务管理机制。
0x01 SSH 连不上:由底向上的排查链
排查顺序(网络 → 服务 → 策略):
ping <IP> # 1. 网络通不通
systemctl status sshd # 2. 服务起没起
ss -tlnp | grep 22 # 3. 端口听没听(没装 net-tools 用 ss)
逐层拆:没装 → apt install ssh(openssh-server);起不来 → 查防火墙(ufw disable)和 SELinux(setenforce 0 验证);root 登不上 → 改 /etc/ssh/sshd_config 的 PermitRootLogin yes 后重启;MySQL 曾因服务文件里服务名拼接多了非法参数自启失效,现象像端口问题、根因在服务定义。
0x02 源码编译 Nginx:为什么 systemctl 管不了它
# 依赖先行:gcc / make / pcre / zlib
./configure --prefix=/usr/local/nginx
make && make install
源码安装绕过包管理器,也绕过了系统服务管理:/usr/lib/systemd/system/ 里没有 service 单元文件,systemctl 管不了它——systemctl start nginx 只是读 xxx.service 的 ExecStart 路径拉起进程;没文件就只能手动跑 /usr/local/nginx/sbin/nginx,想托管就自己写 service 文件(后面 Podman 跑服务时写过一个)。验证看端口 ss -tlnp | grep 80,改完必须 ./nginx -s reload。
0x03 PHP-FPM:9000 端口联动
Nginx 只发静态内容,PHP 请求转给 PHP-FPM:php-fpm.conf 监听 127.0.0.1:9000,Nginx server 块把 .php 请求 fastcgi_pass 127.0.0.1:9000;排错第一招 ss -tlnp | grep 9000。Docker 里 PHP 版本不对时,改 /usr/local/nginx/conf/nginx.conf 的 9000 指向即可把流量切回本地。
0x04 MySQL/MariaDB 与 DVWA 部署
apt install mariadb-server
mysql_secure_installation # root 初始化
DVWA 部署三步:源码放 Web 根目录 → 改 config/config.inc.php 数据库连接 → 访问 setup 页初始化。坑:Web 目录属主要对 www-data 可读;PHP 版本过高/过低都报 500,最干净的解法是用 Docker 打包低版本 PHP 镜像(宿主机只留端口映射);MariaDB 与 MySQL 语法有差异,初始化 SQL 报错就改 database/ 对应语句;部署前拍快照。
0x05 Docker/Podman 入门定位
容器按需用:镜像拉取依赖网络(国内配加速器),docker 在 /usr/local/bin/;SQLi-labs 等老靶场对 PHP 版本敏感,标准解法是容器(compose + 端口映射);docker images 能看到镜像即达标。
0x06 服务管理的通用心智模型
底层逻辑:Linux 上一切服务 = 一个可执行文件 + 一份描述它的配置——有 service 文件 systemctl 管,没有就手动跑,自己写一个即升级为托管服务;判断服务活没活看 ss -tlnp。该模型在 CS 服务端部署(Ubuntu + JDK + teamserver)与提权(服务路径劫持)里都用到了。