前言:为什么网络设置很重要

搭建好家庭服务器后,还有最重要的一步:网络设置。无论硬件多好、操作系统安装得多完美,如果网络设置不正确,从外部就无法访问,只是一台孤立的电脑而已。

本篇将全面讲解如何让您的家庭服务器能够从任何地方安全访问。从固定IP设置开始,到端口转发、DDNS设置、SSH远程访问、安全加固,以及WireGuard VPN,一步步讲解。虽然一开始看起来可能很复杂,但按照步骤操作,您将建立起专业级的网络环境。

1. 理解内部网络与设置固定IP

1.1 内部IP与外部IP的区别

在开始网络设置之前,首先需要准确理解IP地址的概念。家庭网络中存在两种IP地址。

外部IP(公网IP)是互联网服务提供商(ISP)分配给您家庭的地址。全球唯一,外部通过它找到您的网络。通常分配给路由器的WAN口。

内部IP(私有IP)是路由器分配给家庭内各设备的地址。使用192.168.x.x、172.16.x.x、10.x.x.x网段,只能在同一内部网络内通信。

1.2 为服务器设置固定IP

服务器必须始终拥有相同的IP地址。DHCP自动分配的IP在重启或一段时间后可能会改变,导致端口转发等设置失效。

Ubuntu/Debian上使用Netplan设置固定IP:

# 查看当前网络接口
ip addr show

# 编辑Netplan配置文件
sudo nano /etc/netplan/00-installer-config.yaml

将配置文件内容修改如下:

network:
  version: 2
  ethernets:
    enp0s3:  # 改为实际接口名称
      dhcp4: no
      addresses:
        - 192.168.1.100/24  # 想要的固定IP
      routes:
        - to: default
          via: 192.168.1.1  # 路由器IP(网关)
      nameservers:
        addresses:
          - 8.8.8.8
          - 8.8.4.4

应用设置:

# 应用设置
sudo netplan apply

# 确认IP变更
ip addr show

提示:设置固定IP时,最好选择路由器DHCP范围之外的地址。例如,如果DHCP使用192.168.1.2~192.168.1.99,服务器使用192.168.1.100以上的地址可以避免冲突。

2. 理解和设置端口转发

2.1 什么是端口转发?

端口转发是将从外部进入特定端口的流量转发到内部网络特定设备的功能。路由器默认会阻止外部访问,所以要访问服务器必须设置端口转发。

例如,要从外部通过SSH连接,需要告诉路由器"把22端口的连接转发到192.168.1.100"。

2.2 主要端口号

服务 端口号 说明
SSH 22 远程终端连接
HTTP 80 Web服务器
HTTPS 443 安全Web服务器
FTP 21 文件传输
Samba 445 Windows文件共享
WireGuard 51820 VPN

2.3 在路由器上设置端口转发

端口转发设置在路由器管理页面进行。在浏览器中访问路由器IP(通常是192.168.1.1或192.168.0.1),找到端口转发或虚拟服务器菜单。

一般设置项:

  • 服务名称:便于识别的名称(例如:SSH, Web Server)
  • 外部端口:从外部访问时使用的端口
  • 内部IP:服务器的固定IP地址
  • 内部端口:服务器上实际服务的端口
  • 协议:TCP、UDP或两者

安全提示:将SSH端口从22改为其他端口(例如:2222、22022)可以避免大部分自动化攻击。这种情况下,外部端口设为想要的端口,内部端口保持22即可。

3. 通过DDNS解决动态IP问题

3.1 为什么需要DDNS

大多数家庭宽带使用动态IP。也就是说,ISP可能会定期或在路由器重启时更改外部IP。如果每次IP变化都要确认新地址,会非常不方便。

DDNS(动态DNS)可以解决这个问题。它将变化的IP地址自动关联到固定的域名,这样您可以始终通过类似myserver.duckdns.org这样的地址访问。

3.2 设置Duck DNS

Duck DNS是免费的DDNS服务。设置简单且稳定。

第1步:创建Duck DNS账户

  1. 访问https://www.duckdns.org
  2. 使用社交账号登录
  3. 创建想要的子域名(例如:myserver)
  4. 确认并保存Token值

第2步:在服务器上设置自动更新脚本

# 创建脚本目录
mkdir -p ~/duckdns
cd ~/duckdns

# 创建更新脚本
nano duck.sh

脚本内容:

#!/bin/bash
echo url="https://www.duckdns.org/update?domains=myserver&token=YOUR_TOKEN&ip=" | curl -k -o ~/duckdns/duck.log -K -

设置脚本执行权限并测试:

# 授予执行权限
chmod 700 duck.sh

# 测试执行
./duck.sh

# 确认结果(应该输出OK)
cat duck.log

第3步:设置crontab自动执行

# 编辑crontab
crontab -e

# 添加每5分钟执行一次
*/5 * * * * ~/duckdns/duck.sh >/dev/null 2>&1

3.3 No-IP替代方案

No-IP也是流行的DDNS服务。免费账户需要每30天手动确认一次,但提供更多域名选项。

# 安装No-IP动态更新客户端
cd /usr/local/src
sudo wget https://www.noip.com/client/linux/noip-duc-linux.tar.gz
sudo tar xzf noip-duc-linux.tar.gz
cd noip-2.1.9-1
sudo make
sudo make install

# 配置和运行
sudo /usr/local/bin/noip2 -C
sudo /usr/local/bin/noip2

4. SSH远程访问设置

4.1 SSH服务器安装和基本设置

SSH(Secure Shell)是远程管理服务器最基本、最安全的方式。

# 安装SSH服务器(大多数已经安装)
sudo apt update
sudo apt install openssh-server

# 检查SSH服务状态
sudo systemctl status ssh

# 设置开机自启
sudo systemctl enable ssh

4.2 SSH安全加固设置

默认设置也能工作,但为了安全最好修改一些设置。

# 编辑SSH配置文件
sudo nano /etc/ssh/sshd_config

建议修改的设置:

# 更改端口(可选,从默认22更改)
Port 22022

# 禁止root直接登录
PermitRootLogin no

# 密码认证(设置密钥后改为no)
PasswordAuthentication yes

# 禁止空密码
PermitEmptyPasswords no

# 最大认证尝试次数
MaxAuthTries 3

# 登录宽限时间
LoginGraceTime 60

# 只允许特定用户(可选)
AllowUsers yourusername

应用设置:

# 检查配置语法
sudo sshd -t

# 重启SSH服务
sudo systemctl restart ssh

4.3 SSH密钥认证设置

使用SSH密钥代替密码可以大大提高安全性。没有密钥文件就无法连接,因此可以防止暴力破解攻击。

在客户端(本地PC)上生成密钥:

# 生成密钥对(Windows PowerShell或Linux/Mac终端)
ssh-keygen -t ed25519 -C "your_email@example.com"

# 或RSA方式(兼容性更好)
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

将公钥发送到服务器:

# Linux/Mac上
ssh-copy-id -p 22022 username@server_ip

# Windows PowerShell上
type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh -p 22022 username@server_ip "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

测试密钥认证后禁用密码认证:

# 测试密钥连接
ssh -p 22022 username@server_ip

# 成功后在服务器上禁用密码认证
sudo nano /etc/ssh/sshd_config
# 将PasswordAuthentication改为no

sudo systemctl restart ssh

5. 使用fail2ban加强安全

5.1 什么是fail2ban?

fail2ban是监控日志文件、检测重复登录失败并自动封禁相关IP的工具。可以有效防御SSH暴力破解攻击。

5.2 fail2ban安装和设置

# 安装
sudo apt update
sudo apt install fail2ban

# 复制默认配置文件
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

# 编辑配置
sudo nano /etc/fail2ban/jail.local

SSH保护的主要设置:

[DEFAULT]
# 封禁时间(秒)
bantime = 3600

# 监控时间窗口
findtime = 600

# 最大失败次数
maxretry = 3

# 排除在封禁之外的IP(自己的IP)
ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24

[sshd]
enabled = true
port = 22022  # 根据SSH端口修改
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 3600
# 启动并启用fail2ban
sudo systemctl start fail2ban
sudo systemctl enable fail2ban

# 查看状态
sudo fail2ban-client status
sudo fail2ban-client status sshd

# 查看被封禁的IP
sudo fail2ban-client get sshd banned

# 解封特定IP
sudo fail2ban-client set sshd unbanip 123.456.789.0

6. 搭建WireGuard VPN服务器

6.1 为什么需要VPN

使用VPN(虚拟专用网络)从外部连接时,可以像在家庭内网一样访问所有服务。不需要单独开放端口,安全性也更高。

WireGuard是最新的VPN协议,设置简单、速度快、安全性高。比OpenVPN更轻量、更现代。

6.2 WireGuard服务器设置

# 安装WireGuard
sudo apt update
sudo apt install wireguard

# 生成服务器密钥对
cd /etc/wireguard
umask 077
wg genkey | sudo tee privatekey | wg pubkey | sudo tee publickey

# 查看密钥
sudo cat privatekey
sudo cat publickey

创建服务器配置文件:

sudo nano /etc/wireguard/wg0.conf
[Interface]
# 服务器的VPN内部IP
Address = 10.0.0.1/24
# 服务器的私钥
PrivateKey = 服务器私钥内容
# WireGuard端口
ListenPort = 51820
# 数据包转发设置
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

[Peer]
# 客户端1的公钥
PublicKey = 客户端公钥
# 分配给客户端的IP
AllowedIPs = 10.0.0.2/32

启用IP转发:

# IP转发设置
sudo nano /etc/sysctl.conf
# 取消注释 net.ipv4.ip_forward=1

# 应用
sudo sysctl -p

启动WireGuard:

# 启动接口
sudo wg-quick up wg0

# 查看状态
sudo wg show

# 设置开机自启
sudo systemctl enable wg-quick@wg0

6.3 客户端设置

生成客户端密钥(在服务器上):

wg genkey | tee client_privatekey | wg pubkey > client_publickey

客户端配置文件:

[Interface]
PrivateKey = 客户端私钥
Address = 10.0.0.2/24
DNS = 8.8.8.8

[Peer]
PublicKey = 服务器公钥
Endpoint = your.ddns.domain:51820
AllowedIPs = 0.0.0.0/0  # 所有流量通过VPN
# 或 AllowedIPs = 192.168.1.0/24, 10.0.0.0/24  # 只有特定网络
PersistentKeepalive = 25

WireGuard官方应用可在Windows、Mac、iOS、Android上使用。可以导入配置文件或通过二维码方便地设置。

7. 防火墙设置

7.1 UFW基本设置

UFW(Uncomplicated Firewall)是Ubuntu的默认防火墙工具。可以用简单的命令管理防火墙规则。

# 查看UFW状态
sudo ufw status

# 设置默认策略
sudo ufw default deny incoming
sudo ufw default allow outgoing

# 允许SSH(如果更改了端口,使用该端口)
sudo ufw allow 22022/tcp

# 允许HTTP/HTTPS
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

# 允许WireGuard
sudo ufw allow 51820/udp

# 启用UFW
sudo ufw enable

# 查看规则
sudo ufw status verbose

8. 总结与网络检查清单

到目前为止,我们学习了家庭服务器的网络设置和远程访问。最后让我们检查所有设置是否正确。

设置完成检查清单

  • 服务器是否分配了固定IP?
  • 路由器上是否设置了必要的端口转发?
  • DDNS是否正常更新IP?
  • SSH密钥认证是否正常工作?
  • fail2ban是否已启用?
  • 防火墙是否正确设置?
  • VPN连接是否正常?(可选)

外部访问测试

# 从外部SSH连接测试(使用移动数据等外部网络)
ssh -p 22022 username@your.ddns.domain

# 端口开放确认(使用外部服务)
# https://www.yougetsignal.com/tools/open-ports/

现在您的家庭服务器已经可以从任何地方安全访问了。下一篇将介绍文件服务器的搭建。将讲解Samba进行Windows共享、NFS设置,以及高效的磁盘管理方法。