새로 산 VPS는 자물쇠 없는 현관문이나 다름없어요. 전 세계의 스크립트 키디들이 끊임없이 문을 두드리고 있죠. 이 글에서는 그 문을 확실히 잠그는 방법을 알려드릴게요. 여러분의 openclaw가 함부로 밖으로 나돌아다니지 않도록 말이에요.

0. 들어가며

VPS 한 대를 새로 샀고, 신나서 IP와 root 비밀번호를 받았다면 그다음은 뭘까요?

많은 분들이 이렇게 하시더라고요: 곧바로 소프트웨어 설치하고 프로젝트 배포를 시작해버리죠.

이건 아주 위험한 습관이에요.

여러분의 VPS에는 공인 IP가 달려 있습니다. 즉, 전 세계 누구나 접속을 시도해볼 수 있다는 뜻이죠. 게다가 기본 설정 상태에서는:

  • 포트는 22로 탁 트여 있고
  • 사용자 이름은 누구나 아는 root이며
  • 남은 건 비밀번호 하나뿐입니다

매일 수많은 자동화 스크립트가 IP 대역을 스캔하면서 흔한 비밀번호로 무차별 대입 공격을 시도합니다. 서버가 온라인에 올라가는 순간부터 이미 공격받고 있는 거예요.

그러니까 VPS를 손에 넣자마자 해야 할 첫 번째 일은 소프트웨어 설치가 아니라 보안 초기화입니다.


1. 목표

이 글의 목표는:

  • 안전한 원격 접속 환경 구축: SSH 키 로그인 + 기본 포트 번호 변경
  • 일반 사용자 계정 생성: root 계정 직접 사용은 피하기
  • 방화벽 설정: 꼭 필요한 포트만 열어두기
  • 네트워크 가속 활성화: BBR로 네트워크 속도 날려버리기
  • 무차별 대입 공격(Brute Force) 방지: fail2ban으로 악성 IP 자동 차단하기

이 세팅들까지 마치고 나면, 여러분의 VPS는 탄탄한 기반을 갖추게 되어 각종 서비스를 안심하고 마음껏 배포할 수 있어요.


2. 계획 및 고민

왜 이런 세팅을 해야 할까요?

막 구매한 VPS는 입주하기 딱 좋은 상태로 넘겨받은 맨집(?)과 같아요.

기본 상태 위험 우리의 해결책
root 계정 바로 로그인 권한 과다, 잘못된 조작 시 치명적 일반 사용자 생성 + sudo
비밀번호 로그인 무차별 대입 공격에 뚫림 SSH 키 로그인
기본 22번 포트 스캐너들의 주요 타겟 비표준 포트로 변경
방화벽 꺼짐 모든 포트가 외부에 노출 UFW로 필요한 포트만 허용
기본 네트워크 패킷 손실률 높음, 지연 큼 BBR 혼잡 제어 알고리즘

전체 흐름

VPS初始化流程

이 순서대로 하나씩 진행해 볼게요. 각 단계마다 왜 이렇게 하는지도 쭉 설명해 드릴게요.

3. 작업 단계

3.1 최초 로그인 및 시스템 업데이트

서버 IP 확인

VPS를 구매하면, 서비스 제공업체에서 다음 정보들을 보내줄 거예요:

  • IP 주소: 예를 들어 192.168.1.100
  • 포트: 보통 22이에요 (업체에 따라 다른 포트로 바꾸기도 해요)
  • 사용자 이름: 보통 root예요
  • 비밀번호: 무작위로 생성된 문자열이에요

VPS 服务商后台的登录信息页面

SSH 접속하기

Mac / Linux 사용자: 터미널을 열고 바로 입력하세요:

1
2
ssh root@你的服务器IP
# 例如:ssh [email protected]

Windows 사용자:

  • Windows 10/11에는 OpenSSH가 기본 내장되어 있어서 PowerShell이나 CMD에서 바로 위 명령어를 쓸 수 있어요
  • 아니면 TermiusMobaXterm 같은 툴을 써도 좋아요

처음 접속하면 이런 지문(fingerprint) 확인 메시지가 뜰 거예요:

1
2
3
The authenticity of host '192.168.1.100 (192.168.1.100)' can't be established.
ED25519 key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxx.
Are you sure you want to continue connecting (yes/no/[fingerprint])?

“이 서버가 처음이네. 정말 연결할까요?” 하고 물어보는 겁니다.

yes을 입력하고 엔터를 치세요. 그다음 비밀번호를 입력하고(주의: 입력할 때 화면에 아무 글자도 안 보이는데, 이건 정상적인 보안 기능이니까 당황하지 마세요) 엔터를 치시면 됩니다.

首次 SSH 连接的完整过程,包含指纹确认

이런 식으로 프롬프트가 뜨면 로그인 성공입니다:

1
2
3
Welcome to Ubuntu 24.04 LTS (GNU/Linux 6.x.x-x-generic x86_64)
...
root@hostname:~#

💡 지문을 확인하는 이유는?

'중간자 공격(Man-in-the-Middle)'을 방지하기 위해서예요. 첫 접속 때 서버 지문을 기록해두면, 나중에 접속했을 때 지문이 바뀌어 있다면 누군가가 당신의 서버를 사칭하고 있을 가능성이 있다는 뜻이죠.

登录成功了

서버와 친해지기

로그인했다면, 우선 이 녀석의 기본 상태부터 파악해볼까요?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 查看系统版本
cat /etc/os-release

# 查看内核版本
uname -r

# 查看 CPU 核心数和型号
nproc
lscpu | grep "Model name"

# 查看内存
free -h

# 查看磁盘
df -h

服务器基本信息输出

이 정보는 나중에 문제를 찾아낼 때 요긴하게 쓰이니 잘 기억해두세요.

시스템 업데이트

서버 정보 파악이 끝났다면, 정식으로 할 첫 번째 일은 바로 시스템 업데이트예요. 새 서버의 OS 이미지는 몇 달 전 것일 수도 있고, 그동안 보안 패치가 꽤 나왔을 수 있거든요.

1
2
# 更新软件包列表 + 升级所有软件 + 清理
apt update && apt full-upgrade -y && apt autoremove -y && apt autoclean

옵션 설명:

  • apt update: 패키지 인덱스 업데이트
  • apt full-upgrade: 커널을 포함한 모든 소프트웨어 업그레이드
  • -y: 자동 확인(yes)으로, 일일이 입력할 필요 없음
  • apt autoremove: 더 이상 필요 없는 의존성 패키지 삭제
  • apt autoclean: 다운로드한 패키지 캐시 정리

apt update 和 apt upgrade 执行过程

⏱️ 업데이트 양에 따라 이 단계는 몇 분 정도 걸릴 수 있어요. 중간에 가끔 확인을 요구하면, 그냥 안내에 따라 진행하면 돼요.

재부팅이 필요한지 확인

커널 업데이트 후에는 보통 재부팅을 해야 적용돼요.

1
2
# 检查是否需要重启
cat /var/run/reboot-required 2>/dev/null && echo ">>> 需要重启" || echo ">>> 无需重启"

是否需要重启

재부팅이 필요하다는 메시지가 뜬다면:

1
reboot

재부팅 후에는 SSH 연결을 다시 맺어주면 됩니다.

자주 쓰는 도구 설치

1
apt install -y sudo curl wget git vim htop tree unzip net-tools ufw fail2ban neofetch

이 도구들이 대체 뭘 하는 건지 한번 볼게요:

도구 용도
sudo 일반 사용자가 관리자 명령 실행
curl / wget 파일 다운로드
git 버전 관리
vim 텍스트 에디터
htop 더 보기 좋은 프로세스 모니터
tree 디렉터리 구조를 트리 형태로 표시
net-tools 네트워크 도구 (ifconfig, netstat 등)
ufw 간편한 방화벽
fail2ban 무차별 대입 공격 방지
neofetch 시스템 정보 예쁘게 표시
neofetch 显示的系统信息

3.2 non-root 유저 만들기

root로 바로 쓰면 안 되나요?

root 유저는 권한이 너무 세서, 손 한 번 삐끗해서 rm -rf / 치면 날리는 게 순식간이에요. 평소엔 일반 유저로 작업하고, 관리자 권한이 필요할 때만 sudo 쓰는 게 안전합니다.

랍스터(openclaw)는 괴물인데, 감히 root 권한을 쥐여줄 수가 있나요?

유저 생성하기

1
2
# 创建用户(把 ittinker 换成你想要的用户名)
adduser ittinker

그러면 비밀번호랑 기본 정보들을 설정하라고 프롬프트가 뜹니다:

1
2
3
4
5
6
7
8
New password:              # 输入密码(不会显示)
Retype new password: # 再输入一次
Full Name []: # 可以直接回车跳过
Room Number []: # 回车跳过
Work Phone []: # 回车跳过
Home Phone []: # 回车跳过
Other []: # 回车跳过
Is the information correct? [Y/n] # 输入 Y 确认

adduser 创建用户的完整交互过程

sudo 권한 부여하기

1
2
# 把用户加入 sudo 组, ittinker 换成你自己上面创建的那个用户
usermod -aG sudo ittinker

잘 됐는지 확인해 볼까요?

1
2
3
4
5
# 切换到新用户 ittinker 换成你自己上面创建的那个用户
su - ittinker

# 测试 sudo 是否生效
sudo whoami

출력 결과가 root 라면 sudo 설정이 끝난 겁니다.
测试sudo

💡 꿀팁

exit 를 입력하면 다시 root 유저로 돌아갑니다. 앞으로의 설정 작업은 root 상태에서 진행하고, 다 끝난 뒤에 일반 유저로 전환할게요.


3.3 SSH 키 로그인 설정하기

키 인증 vs 비밀번호 인증

SSH密钥认证原理

키 인증이 비밀번호보다 훨씬 안전합니다:

  • 비밀번호는 무차별 대입 공격(brute-force)으로 뚫릴 수 있지만, 키는 거의 불가능해요
  • 매번 비밀번호 안 쳐도 돼서 훨씬 편합니다
  • 비밀번호가 유출돼도 개인 키가 없으면 로그인 자체가 안 됩니다

1단계: 로컬에서 키 페어 생성하기

내 컴퓨터(서버 말고)에서 아래 명령어를 실행해 봅시다:

1
2
# 生成 ED25519 密钥(推荐,更安全更快)
ssh-keygen -t ed25519 -C "[email protected]"

그러면 이런 메시지가 뜰 거예요:

1
Enter file in which to save the key (/Users/你/.ssh/id_ed25519):

그냥 엔터 치면 기본 경로로 저장됩니다. 저희는 여기서 ./ittinker를 사용했는데, 이건 현재 경로에 ittinker라는 이름으로 저장한다는 뜻이에요.

1
Enter passphrase (empty for no passphrase):

키에 비밀번호(패스프레이즈)를 설정해서 보안을 한 겹 더 추가할 수도 있고, 그냥 엔터 쳐서 비워둬도 됩니다.

本地生成 SSH 密钥的过程

생성이 끝나면 ~/.ssh/ 디렉토리에 두 개의 파일이 생긴 걸 확인할 수 있어요(아래는 기본 파일명이라서, 앞에서 그냥 엔터를 쳤다면 이렇게 됩니다):

  • id_ed25519: 개인 키입니다. 절대 외부에 유출되면 안 돼요!
  • id_ed25519.pub: 공개 키입니다. 이건 서버로 업로드해야 해요.

💡 ed25519 vs RSA

ed25519는 현재 권장되는 알고리즘으로, 전통적인 RSA보다 더 안전하고 키 길이도 짧아요. 만약 시스템이 너무 구버전이라 지원하지 않는다면 ssh-keygen -t rsa -b 4096를 사용하시면 됩니다.

한 가지 팁을 드리자면, ed25519로 생성된 키는 꽤 작은 반면 RSA 파일은 꽤 큽니다. AI한테 물어보고 나서야 알게 됐는데, 파일 크기는 상관없고 알고리즘 특성 때문에 그런 거래요.

2단계: 서버에 공개 키 업로드하기

방법 A: ssh-copy-id 사용하기(권장)

1
2
# 在你的电脑上执行
ssh-copy-id -i ~/.ssh/id_ed25519.pub yourname@你的服务器IP

비밀번호를 입력하면 공개 키가 서버로 자동 복사됩니다.

ssh-copy-id 执行成功

방법 B: 수동으로 복사하기

ssh-copy-id가 작동하지 않는다면, 수동으로 직접 설정해도 됩니다:

1
2
# 1. 在你的电脑上,查看公钥内容
cat ~/.ssh/id_ed25519.pub

출력된 내용(ssh-ed25519로 시작하는 긴 문자열)을 복사하세요.

1
2
3
4
5
6
7
8
9
10
11
# 2. 在服务器上,为新用户创建 .ssh 目录, ittinker 换成你刚刚创建的用户名
mkdir -p /home/ittinker/.ssh
chmod 700 /home/ittinker/.ssh

# 3. 创建 authorized_keys 文件并粘贴公钥
vim /home/ittinker/.ssh/authorized_keys
# 按 i 进入编辑模式,粘贴公钥,按 Esc,输入 :wq 保存退出

# 4. 设置正确的权限
chmod 600 /home/ittinker/.ssh/authorized_keys
chown -R ittinker:ittinker /home/ittinker/.ssh

⚠️ 권한 설정이 정말 중요해요!

SSH는 파일 권한에 민감하게 반응하거든요:

  • .ssh 디렉토리: 700 (본인만 접근 가능)
  • authorized_keys 파일: 600 (본인만 읽고 쓰기 가능)

권한이 맞지 않으면, SSH가 키를 이용한 로그인을 거부해버립니다.

3단계: 키 로그인 테스트

새 터미널 창을 하나 더 띄워서 (기존 창은 혹시 몰라 닫지 말고 그냥 두세요. 설정이 꼬였을 때 피신처가 되니까요), 키 로그인이 잘 되는지 테스트해봅시다:

1
ssh ittinker@你的服务器IP

비밀번호 입력 없이 로그인이 되면, 키 설정이 성공한 겁니다! 🎉

(만약 개인 키에 passphrase를 설정하셨다면, 개인 키 비밀번호를 입력하라는 프롬프트가 뜰 텐데 이건 정상입니다.)
使用密钥成功登录(无需服务器密码)

여기서 -i 옵션을 추가한 건, 이 키를 기본 경로가 아니라 현재 경로에 두었기 때문이에요. 명시적으로 지정해주지 않으면 시스템이 기본 키를 사용하려고 할 겁니다.


3.4 SSH 보안 강화

자, 이제 키 로그인이 잘 되니까 SSH를 한층 더 단단하게 묶어볼까요:

  1. 기본 포트 번호 바꾸기 (무차별 스캔 피하기)
  2. 비밀번호 로그인 막기
  3. root 계정으로 직접 로그인 금지하기

SSH 설정 파일 수정하기

1
2
3
4
5
# 备份原配置
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak

# 编辑配置
nano /etc/ssh/sshd_config

修改前

아래 설정들을 찾아서 수정해 줍니다. (앞에 주석 처리(#)가 되어 있다면 #를 지워주세요):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 修改端口(选一个 1024-65535 之间的数字)
Port 22000

# 禁止 root 登录
PermitRootLogin no

# 允许密钥登录
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

# 禁止密码登录(确保密钥登录测试成功后再改!)
PasswordAuthentication no

# 使用更安全的 SSH2 协议
Protocol 2

# 最大认证尝试次数
MaxAuthTries 3

# 客户端超时设置
ClientAliveInterval 300
ClientAliveCountMax 2

修改后的 sshd_config 关键配置

저장하고 빠져나옵니다 (ctrl + o).

Nano에서 저장은 ctrl + o예요. 파일명을 물어보면 그냥 엔터 치시면 되고, 종료는 ctrl + x입니다.

SSH 서비스 재시작

1
systemctl restart sshd.service

⚠️ 중요한 당부!

지금 띄워진 터미널 창은 절대 닫지 마세요! 먼저 새 창을 열어서 바꾼 설정으로 정상 로그인되는지 테스트해 보세요:

1
ssh -p 22000 yourname@你的服务器IP

로그인이 잘 되면 그때 예전 창을 닫으시면 됩니다. 만약 접속이 안 된다면, 아까 창에서 설정 다시 고치면 되니까 조급해하지 마세요.

만약 가벼운 서버(Light Server)를 구매하셨다면 이 포트를 변경할 수 없을 확률이 높아요. 반면 전통적인 ECS는 수정이 가능하니 참고해 주세요.


3.5 UFW 방화벽 설정하기

UFW防火墙规则

UFW(Uncomplicated Firewall)는 Ubuntu의 기본 방화벽 도구입니다. 설정은 식은 죽 먹기지만 기능은 아주 강력하죠.

기본 설정

1
2
3
4
5
6
7
8
9
10
11
# 设置默认策略:拒绝所有入站,允许所有出站
ufw default deny incoming
ufw default allow outgoing

# 允许 SSH(使用你设置的端口)
ufw allow 22000/tcp comment 'SSH'
ufw allow 22/tcp comment 'SSH' # 如果是轻量服务器,还是开22端口

# 允许 HTTP 和 HTTPS
ufw allow 80/tcp comment 'HTTP'
ufw allow 443/tcp comment 'HTTPS'

방화벽 활성화

1
ufw enable

이런 메시지가 뜰 거예요:

1
Command may disrupt existing ssh connections. Proceed with operation (y|n)?

y를 입력해서 확인해 줍니다.

상태 확인하기

1
ufw status verbose

ufw status 的输出结果

23022은 제가 오타 난 거예요. 여러분은 각자 상황에 맞게 알아서 설정하시면 됩니다!

출력 결과는 이런 식으로 나올 거예요:

1
2
3
4
5
6
7
8
9
10
11
12
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)

To Action From
-- ------ ----
22000/tcp (SSH) ALLOW IN Anywhere
80/tcp (HTTP) ALLOW IN Anywhere
443/tcp (HTTPS) ALLOW IN Anywhere
22000/tcp (SSH (v6)) ALLOW IN Anywhere (v6)
80/tcp (HTTP (v6)) ALLOW IN Anywhere (v6)
443/tcp (HTTPS (v6)) ALLOW IN Anywhere (v6)

자주 쓰는 명령어 치트시트

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 查看状态
ufw status

# 添加规则
ufw allow 8080/tcp

# 删除规则
ufw delete allow 8080/tcp

# 允许特定 IP 访问所有端口
ufw allow from 192.168.1.100

# 禁用防火墙(不推荐)
ufw disable

# 重置所有规则
ufw reset

3.6 BBR 가속 켜기

BBR(Bottleneck Bandwidth and Round-trip propagation time)은 Google에서 개발한 TCP 혼잡 제어 알고리즘인데, 네트워크 성능을 확 끌어올려 줍니다.

한 번에 켜기

1
2
3
4
5
6
# 添加 BBR 配置
echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf

# 使配置生效
sysctl -p

켜졌는지 확인하기

1
2
# 查看当前拥塞控制算法
sysctl net.ipv4.tcp_congestion_control

출력 결과는 이래야 합니다:

1
net.ipv4.tcp_congestion_control = bbr
1
2
# 确认 BBR 模块已加载
lsmod | grep bbr

출력 결과는 이런 식으로 나올 거예요:

1
tcp_bbr    20480  3

💡 BBR 효과

BBR을 켜면, 특히 네트워크가 불안정하거나 지연이 심한 환경에서 이런 게 체감될 거예요:

  • 다운로드 속도가 훨씬 빨라지고
  • SSH 작업이 더 쾌적해지며
  • 웹페이지 로딩도 빨라집니다

bbr 开启


3.7 무차별 대입 방어를 위해 fail2ban 설정하기

fail2ban은 로그를 모니터링하다가 로그인 실패가 반복된 IP를 발견하면 알아서 차단해 줍니다.

기본 설정

1
2
3
4
5
# 复制默认配置(不要直接修改 jail.conf)
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

# 编辑配置
vim /etc/fail2ban/jail.local

[sshd] 부분을 찾아서 아래 설정으로 맞춰주세요:

1
2
3
4
5
6
7
8
[sshd]
enabled = true
port = 22000 # 改成你的 SSH 端口
filter = sshd
logpath = /var/log/auth.log
maxretry = 3 # 最大尝试次数
bantime = 3600 # 封禁时间(秒),这里是 1 小时
findtime = 600 # 在这个时间窗口内

fail2ban

서비스 실행

1
2
3
4
5
# 重启 fail2ban
systemctl restart fail2ban

# 设置开机自启
systemctl enable fail2ban

상태 확인

1
2
3
4
5
# 查看 fail2ban 状态
fail2ban-client status

# 查看 SSH 监控状态
fail2ban-client status sshd

fail2ban-client status sshd 的输出

출력 결과는 대략 이런 식입니다:

1
2
3
4
5
6
7
8
9
Status for the jail: sshd
|- Filter
| |- Currently failed: 0
| |- Total failed: 0
| `- File list: /var/log/auth.log
`- Actions
|- Currently banned: 0
|- Total banned: 0
`- Banned IP list:

자주 쓰는 명령어

1
2
3
4
5
6
7
8
# 手动封禁 IP
fail2ban-client set sshd banip 1.2.3.4

# 手动解封 IP
fail2ban-client set sshd unbanip 1.2.3.4

# 查看被封禁的 IP
fail2ban-client status sshd

3.8 [선택] SSH Config로 여러 서버 관리하기

서버가 여러 대라면 매번 ssh -p 22000 user@ip 입력하기 귀찮겠죠. SSH Config를 쓰면 이걸 깔끔하게 단순화할 수 있어요.

설정 파일

내 로컬 PC에서 ~/.ssh/config 파일을 편집해 봅시다:

1
vim ~/.ssh/config

설정을 추가해 줍니다:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 第一台服务器
Host vps1
HostName 192.168.1.100
User yourname
Port 22000
IdentityFile ~/.ssh/id_ed25519

# 第二台服务器
Host vps2
HostName 192.168.1.101
User admin
Port 22222
IdentityFile ~/.ssh/id_ed25519

# 通用设置(应用于所有连接)
Host *
ServerAliveInterval 60
ServerAliveCountMax 3
AddKeysToAgent yes

사용 방법

이제 바로 별칭(alias)으로 접속할 수 있어요:

1
2
3
4
5
# 连接第一台服务器
ssh vps1

# 连接第二台服务器
ssh vps2

IP, 포트, 사용자 이름을 일일이 외울 필요가 없어졌네요!


3.9 [선택] Cloudflare 접근만 허용하기

웹사이트가 완전히 Cloudflare 뒤에 있다면, 80/443 포트에 대해 Cloudflare IP만 접근하도록 설정해서 보안을 한층 더 끌어올릴 수 있어요.

⚠️ 주의: 이 설정을 적용하려면 도메인이 이미 Cloudflare CDN에 연결되어 있어야 합니다.

자동 설정 스크립트

1
2
3
4
5
6
7
8
# 下载脚本
wget -O ~/.cloudflare-ufw.sh https://gist.githubusercontent.com/Xm798/12560579ce11f62027ea8da1fae37456/raw/b07ac8cfe09badf02fc70e2d8bc2da68cabbda50/cloudflare-ufw.sh

# 添加执行权限
chmod +x ~/.cloudflare-ufw.sh

# 执行脚本
~/.cloudflare-ufw.sh

이 스크립트는 다음 작업을 수행합니다:

  1. Cloudflare 공식 홈페이지에서 최신 IP 대역 가져오기
  2. UFW 규칙을 추가해서 이 IP들만 80/443 포트 접근을 허용하기
  3. UFW 다시 불러오기

자동 업데이트 예약 설정하기

Cloudflare의 IP 대역은 바뀔 수 있으니까, 매주 자동으로 업데이트되게 설정해 둡시다:

1
2
# 添加 cron 任务(每周一凌晨执行)
(crontab -l 2>/dev/null; echo "0 0 * * 1 /root/.cloudflare-ufw.sh > /dev/null 2>&1") | crontab -

3.10 타임존 설정

기본 타임존이 UTC로 되어 있을 텐데, 로그 확인하기 편하게 본인이 계신 곳의 타임존으로 바꿔주세요:

1
2
3
4
5
6
7
8
# 查看当前时区
timedatectl

# 设置为上海时区(中国用户)
sudo timedatectl set-timezone Asia/Shanghai

# 验证
date

设置时区


3.11 [선택] 자동 보안 업데이트 설정하기

시스템이 알아서 보안 패치를 설치하게 두면, 매번 수동으로 작업할 필요가 없어져서 편해요:

1
2
3
4
5
# 安装自动更新工具
sudo apt install -y unattended-upgrades

# 配置
sudo dpkg-reconfigure --priority=low unattended-upgrades

'Yes’를 선택해서 자동 업데이트를 켜주세요.

💡 이 기능은 보안 업데이트만 알아서 설치해 줍니다. 새로운 메이저 버전으로는 자동 업그레이드하지 않기 때문에 비교적 안전해요.


4. 정리

초기 설정 체크리스트

위 설정들을 다 마치셨다면, 이 체크리스트로 한 번 더 점검해 보세요:

확인 항목 명령어 예상 결과
시스템 업데이트 완료 apt update && apt list --upgradable 업그레이드할 패키지 없음
일반 사용자 sudo 권한 sudo whoami root 출력
키 로그인 정상 작동 ssh yourname@ip -p port 비밀번호 없이 로그인됨
비밀번호 로그인 비활성화 grep PasswordAuth /etc/ssh/sshd_config PasswordAuthentication no
SSH 포트 변경됨 grep Port /etc/ssh/sshd_config 설정한 포트
방화벽 활성화됨 ufw status Status: active
BBR 활성화됨 sysctl net.ipv4.tcp_congestion_control = bbr
fail2ban 실행 중 systemctl status fail2ban active (running)
시간대 설정됨 timedatectl Asia/Shanghai 또는 본인 시간대
로컬 SSH Config cat ~/.ssh/config 서버 별칭 설정됨

주요 파일 위치

1
2
3
4
/etc/ssh/sshd_config        # SSH 服务端配置
~/.ssh/authorized_keys # 允许登录的公钥
~/.ssh/config # 本地 SSH 客户端配置(在你电脑上)
/etc/fail2ban/jail.local # fail2ban 配置

보안 모범 사례

  1. 시스템 주기적 업데이트: apt update && apt upgrade
  2. 로그인 로그 정기 점검: lastb(로그인 실패), last(로그인 성공)
  3. fail2ban 차단 상태 수시로 확인
  4. 중요 설정 파일 수정 전 백업 필수

5. 트러블슈팅 기록

Q1: 키 로그인이 실패해서 계속 비밀번호를 요구하네요?

의심해 볼 수 있는 원인:

  1. 권한 문제 (가장 흔한 사례)

    1
    2
    3
    # 检查并修复权限
    chmod 700 ~/.ssh
    chmod 600 ~/.ssh/authorized_keys
  2. 공개키가 제대로 복사되지 않음

    1
    2
    3
    # 检查 authorized_keys 内容
    cat ~/.ssh/authorized_keys
    # 应该是一行完整的公钥,以 ssh-ed25519 或 ssh-rsa 开头
  3. SELinux 간섭 (CentOS/RHEL 시스템)

    1
    restorecon -Rv ~/.ssh

Q2: 포트를 바꾸고 나니 연결이 안 되나요?

문제 해결 단계:

  1. 방화벽에서 새 포트가 열려 있는지 확인하세요:

    1
    ufw status | grep 你的端口
  2. SSH 설정이 제대로 되어 있는지 확인하세요:

    1
    grep Port /etc/ssh/sshd_config
  3. SSH 서비스가 실행 중인지 확인하세요:

    1
    systemctl status sshd
  4. 아예 연결이 안 된다면, 클라우드 서비스 제공자의 VNC/콘솔로 접속해서 복구하세요.

Q2.5: 포트를 바꿨는데 아예 적용이 안 되나요? (클라우드 업체 경량 서버 기준)

증상: /etc/ssh/sshd_config를 수정하고 서비스를 재시작했는데도 22번 포트가 그대로 살아있고 새 포트는 적용되지 않는 현상.

진단 방법:

bash

1
2
# 查看是谁在监听 22 端口
netstat -lntp | grep :22

출력 결과가 아래와 비슷하다면:

1
tcp  0  0.0.0.0:22  0.0.0.0:*  LISTEN  1/init

22번 포트는 sshd 프로세스가 아니라 init(PID 1)이 리스닝하고 있다는 뜻입니다.

원인: 일부 클라우드 업체의 '라이트 애플리케이션 서버’나 '컨테이너 인스턴스’는 SSH가 플랫폼 레이어에서 프록시 처리됩니다. 그래서 서버 내부의 sshd 설정은 먹히지 않아요.

해결 방법:

인스턴스 유형 SSH 포트 변경 방법
전통적 ECS sshd_config 수정 ✅
라이트 서버 클라우드 콘솔에서 변경해야 하거나, 아예 지원하지 않을 수 있음
컨테이너 인스턴스 보통 변경 미지원

만약 인스턴스에서 포트 변경을 지원하지 않는다면, 다른 보안 조치가 훨씬 더 중요해집니다:

  • ✅ 일반 사용자 생성 + root 로그인 비활성화
  • ✅ SSH 키 로그인 + 비밀번호 로그인 비활성화
  • ✅ fail2ban으로 무차별 대입(Brute-force) 방어

이 조치들만 확실히 세팅해 두면 보안성은 여전히 아주 높습니다.

Q3: fail2ban이 나를 차단해버렸어요?

1
2
3
4
5
# 用 VNC 登录后解封
fail2ban-client set sshd unbanip 你的IP

# 把你的 IP 加入白名单,编辑 jail.local
ignoreip = 127.0.0.1/8 ::1 你的IP

Q4: UFW 활성화 후 웹사이트에 접속이 안 돼요?

1
2
3
4
5
6
# 检查 80/443 是否开放
ufw status

# 如果没有,添加规则
ufw allow 80/tcp
ufw allow 443/tcp

Q5: 명령어를 실행했는데 sudo를 찾을 수 없다고 떠요?

Debian 최소 설치 버전에는 sudo가 없을 수 있어요. root로 설치해 주세요:

1
2
apt install sudo
usermod -aG sudo ittinker

6. 원클릭 초기화 스크립트 (익숙해진 후 사용)

위 단계들에 이미 익숙해지셨다면, 이 스크립트로 빠르게 초기화할 수 있어요.

⚠️ 주의: 스크립트를 실행하기 전에 SSH 공개 키를 미리 준비해 두셨는지 확인하세요.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#!/bin/bash
# VPS 初始化脚本
# 使用方法:以 root 身份运行

set -e

# === 配置区域(根据你的需求修改)===
NEW_USER="ittinker" # 新用户名
NEW_SSH_PORT="22000" # 新 SSH 端口
TIMEZONE="Asia/Shanghai" # 时区
# =====================================

echo "=== VPS 初始化脚本 ==="
echo ""

# 1. 更新系统
echo "[1/8] 更新系统..."
apt update && apt upgrade -y

# 2. 安装基础工具
echo "[2/8] 安装基础工具..."
apt install -y sudo curl wget git vim htop tree unzip net-tools ufw fail2ban neofetch

# 3. 创建新用户
echo "[3/8] 创建用户 $NEW_USER..."
if id "$NEW_USER" &>/dev/null; then
echo "用户已存在,跳过创建"
else
adduser --gecos "" $NEW_USER
usermod -aG sudo $NEW_USER
fi

# 4. 配置 SSH 目录
echo "[4/8] 配置 SSH 目录..."
mkdir -p /home/$NEW_USER/.ssh
chmod 700 /home/$NEW_USER/.ssh
touch /home/$NEW_USER/.ssh/authorized_keys
chmod 600 /home/$NEW_USER/.ssh/authorized_keys
chown -R $NEW_USER:$NEW_USER /home/$NEW_USER/.ssh

echo ""
echo ">>> 请将你的公钥粘贴到下面(粘贴后按 Ctrl+D 结束):"
cat >> /home/$NEW_USER/.ssh/authorized_keys
echo ""

# 5. 修改 SSH 配置
echo "[5/8] 修改 SSH 配置..."
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
sed -i "s/^#*Port .*/Port $NEW_SSH_PORT/" /etc/ssh/sshd_config
sed -i "s/^#*PermitRootLogin .*/PermitRootLogin no/" /etc/ssh/sshd_config
sed -i "s/^#*PasswordAuthentication .*/PasswordAuthentication no/" /etc/ssh/sshd_config
sed -i "s/^#*PermitEmptyPasswords .*/PermitEmptyPasswords no/" /etc/ssh/sshd_config

# 6. 配置防火墙
echo "[6/8] 配置防火墙..."
ufw default deny incoming
ufw default allow outgoing
ufw allow $NEW_SSH_PORT/tcp
ufw allow 80/tcp
ufw allow 443/tcp
echo "y" | ufw enable

# 7. 开启 BBR
echo "[7/8] 开启 BBR..."
echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf
sysctl -p

# 8. 设置时区
echo "[8/8] 设置时区..."
timedatectl set-timezone $TIMEZONE

# 重启 SSH
systemctl restart sshd

echo ""
echo "=========================================="
echo " ✅ 初始化完成!"
echo "=========================================="
echo ""
echo " 新 SSH 端口: $NEW_SSH_PORT"
echo " 新用户: $NEW_USER"
echo " 时区: $TIMEZONE"
echo ""
echo " 请使用以下命令登录:"
echo " ssh -p $NEW_SSH_PORT $NEW_USER@$(curl -s ifconfig.me 2>/dev/null || echo '你的IP')"
echo ""
echo " ⚠️ 重要:请先测试新配置能否登录,再关闭当前终端!"
echo ""

7. 여기까지 따라오셨다면, 보안은 얼마나 좋아졌을까요?

단계 작업 내용 중요한 이유
시스템 업데이트 최신 패치 설치 알려진 취약점 해결
새 사용자 생성 root 계정 직접 사용 중단 실수로 인한 위험 감소
SSH 키 도입 비밀번호 대신 키 사용 무차별 대입 공격 불가
포트 변경 기본 포트 22번 회피 스캔에 노출될 확률 감소
비밀번호 로그인 차단 키 로그인만 허용 비밀번호 공격 원천 차단
root 로그인 금지 root 직접 접속 차단 공격 난이도 상승
UFW 방화벽 설정 필수 포트만 개방 공격 표면 축소
BBR 가속 네트워크 성능 최적화 접속 속도 향상
fail2ban 적용 악성 IP 자동 차단 지속적 공격 방지

여기까지 다 세팅하셨다면, 여러분의 서버 보안은 이미 전체 VPS의 **90%**를 뛰어넘었습니다.


다음 글 미리보기

다음 글에서는 SSH 키 로그인 설정 퀵 가이드를 다룰 예정입니다. 아래 내용들을 더 자세히 파볼게요:

  • 다양한 OS에서 키 생성하는 방법
  • 여러 개의 키 관리하기
  • SSH Agent 설정
  • 자주 쓰는 SSH 클라이언트 설정

이 글의 마지막 업데이트: 2026년 1월

인디 개발자 툴박스 시리즈, 팔로우 환영해요!