从零搭建电商独立站 (一)
安全接入层
1. VPN 安装
wireguard 比 openvpn 性能好, 比 ipsec 更快、更精简。代码量少,便于个人审计。
第一步:开启 IP 转发
作为 VPN 网关,master-01 必须允许转发网络数据包,否则客户端连上后无法访问内网的其他服务器。
- 开启 IPv4 转发:
echo "net.ipv4.ip_forward = 1" | tee -a /etc/sysctl.d/99-wireguard.conf
- 使配置立即生效:
sysctl -p /etc/sysctl.d/99-wireguard.conf
第二步:安装 WireGuard
直接使用 apt 安装即可:
apt update
apt install wireguard -y
第三步:生成服务端密钥对
WireGuard 使用非对称加密,我们需要为 master-01 生成一对公私钥。
- 进入 WireGuard 配置目录并确保权限安全:
cd /etc/wireguard
umask 077
- 生成私钥和公钥:
wg genkey | tee server_private.key | wg pubkey | tee server_public.key
第四步:编写服务端配置文件
创建并编辑 WireGuard 接口配置文件 /etc/wireguard/wg0.conf:
vi /etc/wireguard/wg0.conf
填入以下内容:
[Interface]
# 隧道的 IP 地址和子网掩码(VPN 网关 IP)
Address = 10.10.10.1/24
# 填入刚刚生成的 server_private.key
PrivateKey = <服务端私钥>
# WireGuard 默认监听端口
ListenPort = 51820
# wg-quick 执行钩子指令,启动和关闭隧道时的 iptables 规则
# 确保经过 VPN 的流量能通过 eth0 正常访问 192.168.100.0/24 内网
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
- 请求数据包源 ip 是 wireguard 隧道 ip,目标 ip 是公司内网服务器 ip,员工电脑内核拿到数据包查路由发现要交给 wireguard 网卡
- wireguard 加密后查公网路由,交给公网 ip 的网卡
- 数据包发到 vpn 服务器的公网 ip 网卡,解析发现加密的 udp 遂交给 wireguard 网卡
- 解密后交给内核查路由,内核发现不是发给本服务器而且是从 wg0 网卡进的内核,于是命中
FORWARD链,转给内网 ip 网卡 - 内网 ip 网卡发出时命中
POSTROUTING链将源ip改为当前网卡的 ip 发到内网。
第五步:设置开机自启并启动服务
使用 systemd 管理 WireGuard 隧道(隧道名称即配置文件的名字 wg0):
- 设置开机自启并启动隧道:
systemctl enable --now wg-quick@wg0
- 检查服务状态:
systemctl status wg-quick@wg0
第六步:验证配置结果
执行以下命令查看 WireGuard 接口状态:
wg show
期望输出示例:
interface: wg0
public key: (master-01 的公钥)
private key: (hidden)
listening port: 51820
同时可以通过 ip a show wg0 确认网卡是否成功被分配了 10.10.10.1 的 IP。
2. 客户端路由
第一步:安装 WireGuard 客户端
- 访问 WireGuard 官网下载并安装 Windows 版客户端。
- 打开 WireGuard 客户端软件。
- 点击左下角的 “添加隧道” (Add Tunnel) 旁边的下拉箭头,选择 “新建空隧道” (Add empty tunnel...)。
第二步:客户端配置
点击“新建空隧道”后,弹出的窗口中会自动为你生成一对新的客户端私钥 (PrivateKey) 和客户端公钥 (PublicKey)。
请在编辑框中填入以下配置:
[Interface]
# 这是客户端(你的宿主机)分配到的 VPN IP
Address = 10.10.10.2/24
# 自动生成的客户端私钥,不要改动
PrivateKey = <自动生成的客户端私钥>
[Peer]
PublicKey = <master-01 的服务端公钥>
# master-01 的真实内网 IP 及监听端口
Endpoint = 192.168.100.10:51820
# 路由规则:将发往这两个网段的流量打入 VPN 隧道
# 10.10.10.0/24 (VPN 网段) 和 192.168.100.0/24 (服务器所在的内网)
AllowedIPs = 10.10.10.0/24, 192.168.100.0/24
# 心跳保活,防止连接闲置断开
PersistentKeepalive = 25
写好后,请先复制窗口上方显示出的 Public key(客户端公钥),这在下一步要在服务端用到。然后给隧道起个名字(例如 Lab-VPN),点击保存。
第三步:在服务端注册客户端
VPN 是双向认证的,所以还需要在 master-01 上把刚刚 Windows 客户端的公钥加进去。
- SSH 登录到
master-01:
vi /etc/wireguard/wg0.conf
- 在文件最末尾追加以下
[Peer]节点信息:
# Windows 宿主机客户端
[Peer]
PublicKey = <Windows 宿主机的客户端公钥>
# 限制该客户端只能使用这个指定的 IP,防止 IP 冲突与伪造
AllowedIPs = 10.10.10.2/32
- 保存退出后,重启
master-01的 WireGuard 服务使配置生效:
systemctl restart wg-quick@wg0
第四步:拨入连接与网络验证
- 回到 Windows 的 WireGuard 客户端,点击 “连接” (Activate)。状态应变为绿色的
Active。

- 进行以下验证:
-
测试 VPN 网关连通性:
ping 10.10.10.1(如果通了,说明 VPN 隧道建立成功)
-
测试跨网段路由连通性:
ping 192.168.100.20
3. 堡垒机部署
apt-get update
apt-get install -y wget curl tar gettext iptables
cd /opt
tar -xf jumpserver-ce-None-x86_64.tar.gz
cd jumpserver-ce-None-x86_64
./jmsctl.sh install
使用官方自带的jmsctl脚本安装,过程中修改下面几项:
# 各组件容器卷挂载目录
VOLUME_DIR=/data/jumpserver
# web 端口, 配置为 8080 防止与 nginx 冲突
HTTP_PORT=8080
# 浏览器只能通过该地址访问web
DOMAINS="10.10.10.1:8080"
# 访问 JumpServer 的 SSH 端口
SSH_PORT=2222
启动并查看各个组件状态:
./jmsctl.sh start
./jmsctl.sh status
安装完成后, 如需修改配置, 路径是 $VOLUME_DIR/config/config.txt, 修改后通过 ./jmsctl.sh restart 重启生效
浏览器访问 http://your_ip:8080,默认账号密码是 admin/ChangeMe, 首次登录会强制修改密码
4. 资产与策略纳管
第一步:创建用户组
创建多个用户组

第二部:创建用户
为各个用户组添加用户

第四步:创建资产
创建资产的同时添加特权账号

jumpserver 使用 ansible 通过特权账号操作资产

当特权账号通过 ssh 密钥 认证登录, 必须手动在资产上配置 NOPASSWD, 否则 jumpserver 在执行自动推送操作 sudo 提权时需要输入密码, 会导致失败
第四步:创建授权规则
创建授权规则,将用户和资产关联起来,并分配用户可用来登录资产的账户,设置用户可用的动作

第五步:创建普通账号
为开发等创建低权限账户,通过sudo限制可用操作

选择账号推送到资产, 当账号已存在会覆盖, 不存在会创建

配置用户的sudo权限, 完成推送

若要无需提权使用 docker 命令, 资产上需存在 docker 组, 并改变 docker 命令使用的管道文件 /var/run/docker.sock 的属组为 docker
5. SSH 访问收敛
master-01
# 只允许vpn访问
iptables -t raw -I PREROUTING -i eth0 -p tcp --dport 8080 -j DROP
iptables -t raw -I PREROUTING -i eth0 -p tcp --dport 2222 -j DROP
iptables -I INPUT 1 -p tcp --dport 22 -s 127.0.0.1 -j ACCEPT
# 放行 vpn 访问
iptables -I INPUT 2 -p tcp --dport 22 -s 10.10.10.0/24 -j ACCEPT
# 无法指定自定义docker网络的网卡名, 用通配符 + 来表示
iptables -I INPUT 3 -p tcp --dport 22 -i br-+ -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP
app-01/02
iptables -I INPUT 1 -p tcp -s 192.168.100.10 --dport 22 -j ACCEPT
iptables -I INPUT 2 -p tcp -s 10.10.10.0/24 --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP
db-01/02
iptables -t raw -I PREROUTING 1 -i lo -j ACCEPT
iptables -t raw -I PREROUTING 2 -s 192.168.100.0/24 -j ACCEPT
iptables -t raw -I PREROUTING 3 -s 10.10.10.0/24 -j ACCEPT
iptables -t raw -A PREROUTING -j DROP