跳到主要内容

从零搭建电商独立站 (一)

· 阅读需 8 分钟
Hsieh
Hsieh

安全接入层

1. VPN 安装

wireguard 比 openvpn 性能好, 比 ipsec 更快、更精简。代码量少,便于个人审计。

第一步:开启 IP 转发

作为 VPN 网关,master-01 必须允许转发网络数据包,否则客户端连上后无法访问内网的其他服务器。

  1. 开启 IPv4 转发:
echo "net.ipv4.ip_forward = 1" | tee -a /etc/sysctl.d/99-wireguard.conf
  1. 使配置立即生效:
sysctl -p /etc/sysctl.d/99-wireguard.conf

第二步:安装 WireGuard

直接使用 apt 安装即可:

apt update
apt install wireguard -y

第三步:生成服务端密钥对

WireGuard 使用非对称加密,我们需要为 master-01 生成一对公私钥。

  1. 进入 WireGuard 配置目录并确保权限安全:
cd /etc/wireguard
umask 077
  1. 生成私钥和公钥:
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
备注
  1. 请求数据包源 ip 是 wireguard 隧道 ip,目标 ip 是公司内网服务器 ip,员工电脑内核拿到数据包查路由发现要交给 wireguard 网卡
  2. wireguard 加密后查公网路由,交给公网 ip 的网卡
  3. 数据包发到 vpn 服务器的公网 ip 网卡,解析发现加密的 udp 遂交给 wireguard 网卡
  4. 解密后交给内核查路由,内核发现不是发给本服务器而且是从 wg0 网卡进的内核,于是命中 FORWARD 链,转给内网 ip 网卡
  5. 内网 ip 网卡发出时命中 POSTROUTING 链将源ip改为当前网卡的 ip 发到内网。

第五步:设置开机自启并启动服务

使用 systemd 管理 WireGuard 隧道(隧道名称即配置文件的名字 wg0):

  1. 设置开机自启并启动隧道:
systemctl enable --now wg-quick@wg0
  1. 检查服务状态:
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 客户端

  1. 访问 WireGuard 官网下载并安装 Windows 版客户端。
  2. 打开 WireGuard 客户端软件。
  3. 点击左下角的 “添加隧道” (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 客户端的公钥加进去。

  1. SSH 登录到 master-01
vi /etc/wireguard/wg0.conf
  1. 在文件最末尾追加以下 [Peer] 节点信息:
# Windows 宿主机客户端
[Peer]
PublicKey = <Windows 宿主机的客户端公钥>
# 限制该客户端只能使用这个指定的 IP,防止 IP 冲突与伪造
AllowedIPs = 10.10.10.2/32
  1. 保存退出后,重启 master-01 的 WireGuard 服务使配置生效:
systemctl restart wg-quick@wg0

第四步:拨入连接与网络验证

  1. 回到 Windows 的 WireGuard 客户端,点击 “连接” (Activate)。状态应变为绿色的 Active

  1. 进行以下验证:
  • 测试 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