跳过正文
  1. 2026s/

使用Debian作为路由器:完整配置指南

x
作者
x
熟练掌握Spring Boot、Spring Cloud等Java技术栈,专注于分布式系统设计与微服务架构。热爱技术分享,探索编程之美。
目录

使用Debian作为路由器:完整配置指南
#

在企业环境或高级家庭网络中,使用Linux系统(特别是Debian)作为路由器可以提供更强大的功能、更高的灵活性和更好的性能。本文将详细介绍如何将Debian配置为功能完整的路由器,包括DHCP服务、DNS服务、NAT配置、IPv6中继、网桥设置等核心功能。

一、准备工作
#

1.1 硬件要求
#

为了搭建一个可靠的Debian路由器,你需要准备:

  • 至少两个网络接口:一个作为WAN口(连接外网),一个或多个作为LAN口(连接内网)
  • 适当的CPU和内存:建议至少双核CPU,2GB RAM(根据网络流量和服务需求调整)
  • 稳定的存储设备:推荐使用SSD,提高系统响应速度

1.2 网络规划
#

假设我们的网络拓扑如下:

Internet
    |
 [WAN口: eth0 - DHCP获取公网IP]
    |
[Debian路由器]
    |
 [网桥: br0 - 192.168.1.1/24]
    |
 [LAN口: eth1 - bridge slave]
    |
内网设备

网络参数规划:

  • WAN接口:eth0(从ISP获取IP)
  • LAN网桥:br0(192.168.1.1/24)
  • LAN物理接口:eth1(作为br0的slave)
  • DHCP地址池:192.168.1.100 - 192.168.1.200
  • DNS服务器:本地DNS + 上游转发

1.3 安装Debian系统
#

首先安装Debian系统(推荐使用Debian 12 “Bookworm"或更新版本):

# 安装基础系统后,更新系统包
sudo apt update
sudo apt upgrade -y

# 安装必要的网络工具
sudo apt install -y net-tools bridge-utils iptables \
    isc-dhcp-server dnsmasq iputils-ping traceroute \
    tcpdump ethtool

二、网络接口配置
#

2.1 配置网络接口
#

Debian 12使用systemd-networkd或传统的/etc/network/interfaces进行网络配置。这里我们使用传统方式,更直观易懂。

编辑网络配置文件:

sudo nano /etc/network/interfaces

配置内容如下:

# Loopback接口
auto lo
iface lo inet loopback

# WAN接口 - 从ISP获取IP
auto eth0
iface eth0 inet dhcp
    # 可选:设置metric确保路由优先级
    metric 100

# LAN物理接口 - 作为bridge的slave
auto eth1
iface eth1 inet manual
    # 不配置IP,因为它将成为网桥的一部分

# LAN网桥接口
auto br0
iface br0 inet static
    address 192.168.1.1
    netmask 255.255.255.0
    network 192.168.1.0
    broadcast 192.168.1.255
    # 将eth1添加到网桥
    bridge_ports eth1
    bridge_stp off
    bridge_fd 0
    bridge_maxwait 0

2.2 启用IP转发
#

要让Debian作为路由器工作,必须启用IP转发功能:

# 临时启用IP转发
sudo sysctl -w net.ipv4.ip_forward=1
sudo sysctl -w net.ipv6.conf.all.forwarding=1

# 永久启用IP转发
sudo nano /etc/sysctl.conf

/etc/sysctl.conf中添加或取消注释以下行:

# IPv4转发
net.ipv4.ip_forward=1

# IPv6转发
net.ipv6.conf.all.forwarding=1
net.ipv6.conf.default.forwarding=1

# 优化网络性能
net.ipv4.tcp_fin_timeout=30
net.ipv4.tcp_keepalive_time=1200
net.ipv4.tcp_syncookies=1
net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_timestamps=1
net.ipv4.tcp_max_syn_backlog=8192

# 防止IP欺骗
net.ipv4.conf.all.rp_filter=1
net.ipv4.conf.default.rp_filter=1

# 忽略ICMP重定向
net.ipv4.conf.all.accept_redirects=0
net.ipv6.conf.all.accept_redirects=0

# 禁用源路由
net.ipv4.conf.all.accept_source_route=0
net.ipv6.conf.all.accept_source_route=0

应用配置:

sudo sysctl -p

2.3 重启网络服务
#

应用网络配置:

# 重启网络服务
sudo systemctl restart networking

# 验证网络接口
ip addr show
ip link show br0

# 验证网桥配置
brctl show

你应该看到类似输出:

bridge name     bridge id               STP enabled     interfaces
br0             8000.xxxxxxxxxxxx       no              eth1

三、配置DHCP服务
#

DHCP服务负责为内网设备自动分配IP地址。我们使用isc-dhcp-server

3.1 安装和配置DHCP服务器
#

sudo apt install -y isc-dhcp-server

3.2 配置DHCP服务器
#

编辑DHCP配置文件:

sudo nano /etc/dhcp/dhcpd.conf

配置内容:

# 全局配置
default-lease-time 600;
max-lease-time 7200;
authoritative;

# 日志级别
log-facility local7;

# 定义子网和地址池
subnet 192.168.1.0 netmask 255.255.255.0 {
    # DHCP地址池范围
    range 192.168.1.100 192.168.1.200;
    
    # 网关地址(路由器自身)
    option routers 192.168.1.1;
    
    # DNS服务器(指向路由器自身)
    option domain-name-servers 192.168.1.1;
    
    # 域名
    option domain-name "home.local";
    
    # 广播地址
    option broadcast-address 192.168.1.255;
    
    # 默认租约时间
    default-lease-time 600;
    max-lease-time 7200;
}

# 静态IP分配示例(可选)
# host desktop {
#     hardware ethernet 00:11:22:33:44:55;
#     fixed-address 192.168.1.50;
# }

3.3 指定DHCP监听接口
#

编辑DHCP服务器默认配置:

sudo nano /etc/default/isc-dhcp-server

指定监听的接口:

# 指定DHCP服务器监听的接口
INTERFACESv4="br0"
INTERFACESv6=""

3.4 启动DHCP服务
#

# 启动并启用DHCP服务
sudo systemctl enable isc-dhcp-server
sudo systemctl start isc-dhcp-server

# 检查服务状态
sudo systemctl status isc-dhcp-server

# 查看DHCP租约
sudo cat /var/lib/dhcp/dhcpd.leases

四、配置DNS服务
#

我们使用dnsmasq作为轻量级DNS服务器,它同时提供DNS缓存和DHCP功能。由于我们已经使用isc-dhcp-server,这里只使用dnsmasq的DNS功能。

4.1 安装dnsmasq
#

sudo apt install -y dnsmasq

4.2 配置dnsmasq
#

先停止服务,备份原配置:

sudo systemctl stop dnsmasq
sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.bak

创建新的配置文件:

sudo nano /etc/dnsmasq.conf

配置内容:

# 监听的接口
interface=br0

# 不监听的接口
except-interface=eth0

# 监听地址
listen-address=127.0.0.1,192.168.1.1

# 绑定到接口,防止DNS泄漏
bind-interfaces

# 域名
domain=home.local

# 扩展hosts文件
expand-hosts

# 不使用/etc/hosts
#no-hosts

# 禁用DHCP功能(因为使用isc-dhcp-server)
no-dhcp-interface=br0

# DNS缓存大小
cache-size=1000

# 上游DNS服务器
# Google DNS
server=8.8.8.8
server=8.8.4.4

# Cloudflare DNS
server=1.1.1.1
server=1.0.0.1

# 国内DNS(可选,用于加速国内域名解析)
# server=223.5.5.5
# server=114.114.114.114

# 防止DNS欺骗
domain-needed
bogus-priv

# 不转发非FQDN的查询
localise-queries

# 日志查询(调试用,生产环境可关闭)
# log-queries
# log-dhcp

# 禁止读取resolv.conf(我们手动指定上游DNS)
no-resolv

# 防止上游DNS泄漏
stop-dns-rebind
rebind-localhost-ok

# 自定义hosts记录(可选)
# address=/router.home.local/192.168.1.1

4.3 启动DNS服务
#

# 启动并启用dnsmasq
sudo systemctl enable dnsmasq
sudo systemctl start dnsmasq

# 检查服务状态
sudo systemctl status dnsmasq

# 测试DNS解析
dig @192.168.1.1 google.com
nslookup google.com 192.168.1.1

五、配置NAT(网络地址转换)
#

NAT使内网设备能够通过路由器的公网IP访问互联网。

5.1 配置iptables规则
#

创建NAT规则脚本:

sudo nano /etc/iptables-rules.sh

脚本内容:

#!/bin/bash

# 清空现有规则
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X

# 设置默认策略
iptables -P INPUT ACCEPT
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# 允许已建立的连接
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

# 允许loopback
iptables -A INPUT -i lo -j ACCEPT

# 允许内网到路由器的访问
iptables -A INPUT -i br0 -j ACCEPT

# 允许ping(ICMP)
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

# 允许SSH访问(根据需要调整)
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# 允许内网访问互联网
iptables -A FORWARD -i br0 -o eth0 -j ACCEPT

# NAT配置 - MASQUERADE(动态SNAT)
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

# 如果有静态公网IP,可以使用SNAT代替MASQUERADE(性能更好)
# iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source YOUR_PUBLIC_IP

# 防止SYN flood攻击
iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j ACCEPT

# 防止端口扫描
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP

# 记录丢弃的包(可选,调试用)
# iptables -A INPUT -j LOG --log-prefix "IPTables-Dropped: " --log-level 4
# iptables -A FORWARD -j LOG --log-prefix "IPTables-Forward-Dropped: " --log-level 4

# 丢弃其他入站流量
iptables -A INPUT -j DROP

echo "IPv4 iptables rules applied successfully"

添加可执行权限:

sudo chmod +x /etc/iptables-rules.sh

5.2 IPv6 iptables配置
#

创建IPv6防火墙规则:

sudo nano /etc/ip6tables-rules.sh

脚本内容:

#!/bin/bash

# 清空现有规则
ip6tables -F
ip6tables -X
ip6tables -t nat -F
ip6tables -t nat -X
ip6tables -t mangle -F
ip6tables -t mangle -X

# 设置默认策略
ip6tables -P INPUT ACCEPT
ip6tables -P FORWARD DROP
ip6tables -P OUTPUT ACCEPT

# 允许已建立的连接
ip6tables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
ip6tables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

# 允许loopback
ip6tables -A INPUT -i lo -j ACCEPT

# 允许内网到路由器的访问
ip6tables -A INPUT -i br0 -j ACCEPT

# 允许ICMPv6(IPv6必需)
ip6tables -A INPUT -p ipv6-icmp -j ACCEPT
ip6tables -A FORWARD -p ipv6-icmp -j ACCEPT

# 允许SSH访问
ip6tables -A INPUT -p tcp --dport 22 -j ACCEPT

# 允许DHCPv6
ip6tables -A INPUT -p udp --dport 546 -j ACCEPT

# 允许内网IPv6流量转发
ip6tables -A FORWARD -i br0 -o eth0 -j ACCEPT
ip6tables -A FORWARD -i eth0 -o br0 -j ACCEPT

# NAT66(如果需要IPv6 NAT)
# ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

# 丢弃其他入站流量
ip6tables -A INPUT -j DROP

echo "IPv6 ip6tables rules applied successfully"

添加可执行权限:

sudo chmod +x /etc/ip6tables-rules.sh

5.3 持久化iptables规则
#

使用iptables-persistent包来持久化规则:

# 安装iptables-persistent
sudo apt install -y iptables-persistent

# 应用规则
sudo /etc/iptables-rules.sh
sudo /etc/ip6tables-rules.sh

# 保存规则
sudo netfilter-persistent save

# 或手动保存
sudo iptables-save | sudo tee /etc/iptables/rules.v4
sudo ip6tables-save | sudo tee /etc/iptables/rules.v6

5.4 创建systemd服务(可选)
#

创建systemd服务以在启动时自动应用规则:

sudo nano /etc/systemd/system/iptables-apply.service

服务内容:

[Unit]
Description=Apply iptables rules
After=network.target

[Service]
Type=oneshot
ExecStart=/etc/iptables-rules.sh
ExecStart=/etc/ip6tables-rules.sh
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

启用服务:

sudo systemctl daemon-reload
sudo systemctl enable iptables-apply.service

六、配置IPv6支持和中继
#

6.1 IPv6基础配置
#

确保IPv6已启用:

# 检查IPv6是否可用
ip -6 addr show

# 检查IPv6路由
ip -6 route show

6.2 配置DHCPv6客户端(WAN口)
#

如果你的ISP提供IPv6,需要在WAN口获取IPv6地址和前缀:

sudo apt install -y wide-dhcpv6-client

配置DHCPv6客户端:

sudo nano /etc/wide-dhcpv6/dhcp6c.conf

配置内容:

# WAN接口配置
interface eth0 {
    # 请求地址和前缀委托
    send ia-na 0;
    send ia-pd 0;
    send rapid-commit;
    
    request domain-name-servers;
    request domain-name;
    
    script "/etc/wide-dhcpv6/dhcp6c-script";
};

# 地址分配
id-assoc na 0 {
};

# 前缀委托
id-assoc pd 0 {
    prefix-interface br0 {
        sla-id 0;
        sla-len 0;
    };
};

启动DHCPv6客户端:

sudo systemctl enable dhcp6c
sudo systemctl start dhcp6c

6.3 配置Router Advertisement(路由器通告)
#

使用radvd为内网设备提供IPv6自动配置:

sudo apt install -y radvd

配置radvd:

sudo nano /etc/radvd.conf

配置内容:

interface br0 {
    # 启用路由器通告
    AdvSendAdvert on;
    
    # 通告间隔
    MinRtrAdvInterval 3;
    MaxRtrAdvInterval 10;
    
    # 路由器作为默认路由的生存期
    AdvDefaultLifetime 1800;
    
    # 管理配置标志(使用SLAAC)
    AdvManagedFlag off;
    AdvOtherConfigFlag on;
    
    # 链路MTU
    AdvLinkMTU 1500;
    
    # 前缀配置(使用ISP分配的前缀)
    # 如果使用DHCPv6-PD,这个会自动更新
    # prefix 2001:db8:1234:5678::/64 {
    #     AdvOnLink on;
    #     AdvAutonomous on;
    #     AdvRouterAddr on;
    # };
    
    # DNS服务器(可选)
    RDNSS 2001:4860:4860::8888 2001:4860:4860::8844 {
        AdvRDNSSLifetime 1200;
    };
    
    # DNS搜索域(可选)
    DNSSL home.local {
        AdvDNSSLLifetime 1200;
    };
};

启动radvd:

sudo systemctl enable radvd
sudo systemctl start radvd
sudo systemctl status radvd

6.4 配置IPv6中继(DHCPv6 Relay)
#

如果需要中继DHCPv6请求到上游服务器:

sudo apt install -y wide-dhcpv6-relay

配置中继:

sudo nano /etc/default/wide-dhcpv6-relay

配置内容:

# 中继接口配置
INTERFACES="-u br0 -l eth0"

# 中继选项
OPTIONS="-d"

启动中继服务:

sudo systemctl enable dhcp6relay
sudo systemctl start dhcp6relay

注意:通常不需要同时运行DHCPv6服务器和中继,根据网络需求选择一种。

七、网桥高级配置
#

7.1 查看网桥状态
#

# 查看网桥详细信息
brctl show

# 查看网桥成员接口
bridge link show

# 查看网桥转发数据库
brctl showmacs br0

# 查看网桥STP状态
brctl showstp br0

7.2 添加更多接口到网桥
#

如果你有多个LAN口要加入同一个网桥:

# 临时添加
sudo brctl addif br0 eth2

# 永久添加:编辑/etc/network/interfaces
auto eth2
iface eth2 inet manual

# 在br0配置中添加
auto br0
iface br0 inet static
    address 192.168.1.1
    netmask 255.255.255.0
    bridge_ports eth1 eth2 eth3
    bridge_stp off
    bridge_fd 0

7.3 配置VLAN(可选)
#

如果需要VLAN支持:

# 安装vlan工具
sudo apt install -y vlan

# 加载8021q模块
sudo modprobe 8021q
echo "8021q" | sudo tee -a /etc/modules

# 创建VLAN接口(例如VLAN 10)
sudo ip link add link eth1 name eth1.10 type vlan id 10
sudo ip link set eth1.10 up

# 创建VLAN网桥
sudo brctl addbr br10
sudo brctl addif br10 eth1.10
sudo ip addr add 192.168.10.1/24 dev br10
sudo ip link set br10 up

/etc/network/interfaces中配置:

auto eth1.10
iface eth1.10 inet manual
    vlan-raw-device eth1

auto br10
iface br10 inet static
    address 192.168.10.1
    netmask 255.255.255.0
    bridge_ports eth1.10
    bridge_stp off

八、性能优化与监控
#

8.1 启用硬件卸载
#

如果网卡支持,启用硬件卸载可以提升性能:

# 查看当前设置
ethtool -k eth0

# 启用TSO (TCP Segmentation Offload)
sudo ethtool -K eth0 tso on

# 启用GSO (Generic Segmentation Offload)
sudo ethtool -K eth0 gso on

# 启用GRO (Generic Receive Offload)
sudo ethtool -K eth0 gro on

持久化设置(在/etc/network/interfaces中):

auto eth0
iface eth0 inet dhcp
    post-up ethtool -K eth0 tso on gso on gro on

8.2 调整网络缓冲区
#

sudo nano /etc/sysctl.conf

添加:

# 增加网络缓冲区
net.core.rmem_max=134217728
net.core.wmem_max=134217728
net.ipv4.tcp_rmem=4096 87380 67108864
net.ipv4.tcp_wmem=4096 65536 67108864

# 增加连接跟踪表大小
net.netfilter.nf_conntrack_max=1048576

# 调整TIME_WAIT
net.ipv4.tcp_fin_timeout=15
net.ipv4.tcp_tw_reuse=1

应用配置:

sudo sysctl -p

8.3 监控工具
#

安装网络监控工具:

# 安装监控工具
sudo apt install -y iftop iptraf-ng vnstat bmon

# 实时流量监控
sudo iftop -i br0

# 网络统计
sudo iptraf-ng

# 带宽统计
vnstat -i br0
sudo vnstat -u -i br0  # 首次需要初始化

8.4 日志管理
#

配置系统日志:

# 查看网络相关日志
sudo tail -f /var/log/syslog | grep -i dhcp
sudo tail -f /var/log/syslog | grep -i dnsmasq

# 查看内核日志
sudo dmesg | grep -i network

九、安全加固
#

9.1 SSH安全配置
#

sudo nano /etc/ssh/sshd_config

推荐设置:

# 禁用root登录
PermitRootLogin no

# 使用公钥认证
PubkeyAuthentication yes
PasswordAuthentication no

# 更改默认端口(可选)
Port 2222

# 限制用户
AllowUsers your_username

重启SSH服务:

sudo systemctl restart sshd

9.2 fail2ban防护
#

安装fail2ban防止暴力破解:

sudo apt install -y fail2ban

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

配置内容:

[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 5

[sshd]
enabled = true
port = ssh
logpath = /var/log/auth.log

启动服务:

sudo systemctl enable fail2ban
sudo systemctl start fail2ban

9.3 端口敲门(可选)
#

使用knockd实现端口敲门:

sudo apt install -y knockd

sudo nano /etc/knockd.conf

配置示例:

[options]
    logfile = /var/log/knockd.log

[openSSH]
    sequence    = 7000,8000,9000
    seq_timeout = 5
    command     = /usr/sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
    tcpflags    = syn

[closeSSH]
    sequence    = 9000,8000,7000
    seq_timeout = 5
    command     = /usr/sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
    tcpflags    = syn

十、故障排查
#

10.1 常见问题诊断
#

1. 内网设备无法获取IP

# 检查DHCP服务状态
sudo systemctl status isc-dhcp-server

# 查看DHCP日志
sudo tail -f /var/log/syslog | grep dhcp

# 检查网桥是否正常
brctl show
ip addr show br0

# 手动测试DHCP
sudo dhclient -v -i br0

2. 无法访问外网

# 检查IP转发是否启用
sysctl net.ipv4.ip_forward

# 检查NAT规则
sudo iptables -t nat -L -v -n

# 检查路由表
ip route show

# 测试WAN连接
ping -I eth0 8.8.8.8

# 测试DNS
dig @8.8.8.8 google.com

3. DNS解析失败

# 检查dnsmasq状态
sudo systemctl status dnsmasq

# 测试本地DNS
dig @127.0.0.1 google.com

# 检查上游DNS连通性
ping 8.8.8.8

# 查看dnsmasq日志
sudo tail -f /var/log/syslog | grep dnsmasq

4. IPv6不工作

# 检查IPv6转发
sysctl net.ipv6.conf.all.forwarding

# 检查IPv6地址
ip -6 addr show

# 检查IPv6路由
ip -6 route show

# 测试IPv6连接
ping6 google.com

# 检查radvd状态
sudo systemctl status radvd

10.2 性能问题排查
#

# 查看系统负载
top
htop

# 查看网络连接数
sudo ss -s
sudo netstat -an | wc -l

# 查看连接跟踪表
sudo cat /proc/net/nf_conntrack | wc -l

# 查看网络接口统计
ip -s link show

# 使用tcpdump抓包分析
sudo tcpdump -i br0 -nn

10.3 网络连通性测试
#

# 测试路由器到WAN
ping -I eth0 8.8.8.8

# 测试路由器到LAN
ping -I br0 192.168.1.100

# 测试内网到外网(在客户端)
ping 8.8.8.8
traceroute 8.8.8.8

# 测试DNS解析
nslookup google.com 192.168.1.1

十一、高级功能扩展
#

11.1 流量整形(QoS)
#

使用tc实现流量控制:

# 限制出站带宽到50Mbps
sudo tc qdisc add dev eth0 root tbf rate 50mbit burst 32kbit latency 400ms

# 查看配置
sudo tc -s qdisc show dev eth0

# 删除配置
sudo tc qdisc del dev eth0 root

11.2 端口转发
#

配置端口转发以便外网访问内网服务:

# 转发外网的8080端口到内网192.168.1.100:80
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:80
sudo iptables -A FORWARD -p tcp -d 192.168.1.100 --dport 80 -j ACCEPT

# 保存规则
sudo netfilter-persistent save

11.3 透明代理
#

配置透明HTTP/HTTPS代理:

# 安装squid
sudo apt install -y squid

# 配置iptables重定向流量到squid
sudo iptables -t nat -A PREROUTING -i br0 -p tcp --dport 80 -j REDIRECT --to-port 3128
sudo iptables -t nat -A PREROUTING -i br0 -p tcp --dport 443 -j REDIRECT --to-port 3129

11.4 VPN服务器
#

安装WireGuard VPN:

sudo apt install -y wireguard

# 生成密钥
wg genkey | sudo tee /etc/wireguard/private.key
sudo chmod 600 /etc/wireguard/private.key
sudo cat /etc/wireguard/private.key | wg pubkey | sudo tee /etc/wireguard/public.key

11.5 使用sing-box TUN模式实现透明代理
#

sing-box是一个强大的通用代理平台,支持TUN模式透明代理。通过在Debian路由器上部署sing-box的TUN模式,可以实现对局域网内所有设备流量的透明代理,并利用其强大的路由功能进行智能分流。

11.5.1 sing-box简介
#

核心优势:

  • 支持多种协议(Shadowsocks、VMess、VLESS、Trojan、Hysteria等)
  • 强大的智能分流功能
  • TUN模式透明代理,无需客户端配置
  • 高性能、低资源占用
  • 支持GeoIP/GeoSite规则库

11.5.2 安装sing-box
#

# 下载最新版本的sing-box
# 访问 https://github.com/SagerNet/sing-box/releases 获取最新版本号
SING_BOX_VERSION="1.8.0"  # 替换为最新版本号

# 下载对应系统架构的二进制文件
# 对于AMD64架构
wget https://github.com/SagerNet/sing-box/releases/download/v${SING_BOX_VERSION}/sing-box-${SING_BOX_VERSION}-linux-amd64.tar.gz

# 对于ARM64架构
# wget https://github.com/SagerNet/sing-box/releases/download/v${SING_BOX_VERSION}/sing-box-${SING_BOX_VERSION}-linux-arm64.tar.gz

# 解压
tar -xzf sing-box-${SING_BOX_VERSION}-linux-amd64.tar.gz

# 安装到系统路径
sudo cp sing-box-${SING_BOX_VERSION}-linux-amd64/sing-box /usr/local/bin/
sudo chmod +x /usr/local/bin/sing-box

# 验证安装
sing-box version

# 清理下载文件
rm -rf sing-box-${SING_BOX_VERSION}-linux-amd64*

11.5.3 配置sing-box TUN模式
#

创建sing-box配置目录:

sudo mkdir -p /etc/sing-box
sudo nano /etc/sing-box/config.json

完整的TUN模式配置示例(支持智能分流):

{
  "log": {
    "level": "info",
    "timestamp": true
  },
  "dns": {
    "servers": [
      {
        "tag": "google",
        "address": "tls://8.8.8.8",
        "detour": "proxy"
      },
      {
        "tag": "local",
        "address": "223.5.5.5",
        "detour": "direct"
      },
      {
        "tag": "block",
        "address": "rcode://success"
      }
    ],
    "rules": [
      {
        "geosite": "category-ads-all",
        "server": "block",
        "disable_cache": true
      },
      {
        "geosite": "cn",
        "server": "local"
      }
    ],
    "final": "google",
    "strategy": "prefer_ipv4",
    "disable_cache": false,
    "disable_expire": false
  },
  "inbounds": [
    {
      "type": "tun",
      "tag": "tun-in",
      "interface_name": "tun0",
      "inet4_address": "172.19.0.1/30",
      "mtu": 9000,
      "auto_route": true,
      "strict_route": true,
      "stack": "system",
      "sniff": true,
      "sniff_override_destination": true
    }
  ],
  "outbounds": [
    {
      "type": "shadowsocks",
      "tag": "proxy",
      "server": "your-server.com",
      "server_port": 8388,
      "method": "aes-256-gcm",
      "password": "your-password"
      // 如果使用VLESS,配置如下:
      // "type": "vless",
      // "server": "your-server.com",
      // "server_port": 443,
      // "uuid": "your-uuid-here",
      // "flow": "xtls-rprx-vision",
      // "tls": {
      //   "enabled": true,
      //   "server_name": "your-server.com"
      // }
    },
    {
      "type": "direct",
      "tag": "direct"
    },
    {
      "type": "block",
      "tag": "block"
    },
    {
      "type": "dns",
      "tag": "dns-out"
    }
  ],
  "route": {
    "rules": [
      {
        "protocol": "dns",
        "outbound": "dns-out"
      },
      {
        "geosite": "category-ads-all",
        "outbound": "block"
      },
      {
        "geoip": "private",
        "outbound": "direct"
      },
      {
        "geosite": "cn",
        "outbound": "direct"
      },
      {
        "geoip": "cn",
        "outbound": "direct"
      },
      {
        "source_ip_cidr": [
          "192.168.1.0/24"
        ],
        "geosite": [
          "google",
          "youtube",
          "netflix",
          "telegram",
          "twitter",
          "facebook"
        ],
        "outbound": "proxy"
      }
    ],
    "final": "proxy",
    "auto_detect_interface": true
  }
}

配置说明:

TUN接口配置:

  • interface_name:TUN设备名称
  • inet4_address:TUN设备的IP地址
  • auto_route:自动设置路由规则
  • strict_route:严格路由模式,确保所有流量都经过TUN
  • stack:协议栈类型,system使用系统协议栈,gvisor使用用户态协议栈
  • sniff:启用协议嗅探,自动识别流量类型
  • mtu:最大传输单元

智能分流规则:

  1. DNS请求优先处理
  2. 广告域名拦截
  3. 局域网流量直连
  4. 中国大陆网站和IP直连
  5. 国外服务走代理
  6. 默认策略:代理

11.5.4 下载GeoIP和GeoSite数据库
#

智能分流需要GeoIP和GeoSite数据库:

# 创建geoip和geosite数据目录
sudo mkdir -p /var/lib/sing-box

# 下载GeoIP数据库
sudo wget -O /var/lib/sing-box/geoip.db https://github.com/SagerNet/sing-geoip/releases/latest/download/geoip.db

# 下载GeoSite数据库
sudo wget -O /var/lib/sing-box/geosite.db https://github.com/SagerNet/sing-geosite/releases/latest/download/geosite.db

# 设置权限
sudo chmod 644 /var/lib/sing-box/*.db

11.5.5 配置系统路由和iptables
#

为了让局域网设备的流量能够被TUN接口捕获,需要配置路由和iptables规则。

方式一:使用auto_route(推荐)

如果在配置中启用了auto_route: true,sing-box会自动配置路由规则,但仍需要确保IP转发已启用:

# 确保IP转发已启用(前面章节已配置)
sudo sysctl -w net.ipv4.ip_forward=1

方式二:手动配置路由(高级用户)

如果需要更精细的控制,可以手动配置:

# 创建路由表
sudo ip route add default via 172.19.0.1 dev tun0 table 100

# 添加规则:将来自LAN的流量导向特定路由表
sudo ip rule add from 192.168.1.0/24 table 100

# 标记来自LAN的流量
sudo iptables -t mangle -A PREROUTING -i br0 -j MARK --set-mark 1
sudo ip rule add fwmark 1 table 100

配置防火墙规则允许TUN流量:

修改之前创建的/etc/iptables-rules.sh,在NAT规则之前添加:

# 允许TUN接口流量转发
iptables -A FORWARD -i tun0 -j ACCEPT
iptables -A FORWARD -o tun0 -j ACCEPT

# 允许br0到tun0的流量
iptables -A FORWARD -i br0 -o tun0 -j ACCEPT

11.5.6 创建systemd服务
#

创建sing-box的systemd服务文件:

sudo nano /etc/systemd/system/sing-box.service

服务文件内容:

[Unit]
Description=sing-box service
Documentation=https://sing-box.sagernet.org
After=network.target nss-lookup.target

[Service]
Type=simple
User=root
WorkingDirectory=/var/lib/sing-box
ExecStart=/usr/local/bin/sing-box run -c /etc/sing-box/config.json
Restart=on-failure
RestartSec=10s
LimitNOFILE=infinity

[Install]
WantedBy=multi-user.target

启动服务:

# 重新加载systemd配置
sudo systemctl daemon-reload

# 启动sing-box服务
sudo systemctl start sing-box

# 设置开机自启动
sudo systemctl enable sing-box

# 查看服务状态
sudo systemctl status sing-box

# 查看日志
sudo journalctl -u sing-box -f

11.5.7 验证透明代理
#

检查TUN接口:

# 查看TUN接口是否创建
ip addr show tun0

# 查看路由表
ip route show

# 查看路由规则
ip rule show

从客户端测试:

在局域网内的设备上(无需任何代理配置):

# 测试国内网站(应该直连)
curl -I https://www.baidu.com

# 测试国外网站(应该走代理)
curl -I https://www.google.com

# 查看IP地址(应该显示代理服务器IP)
curl https://ip.sb
curl https://ifconfig.me

查看sing-box日志:

# 实时查看日志,观察流量分流情况
sudo journalctl -u sing-box -f

# 你应该看到类似输出:
# [INFO] [router] match rule: geosite-cn -> direct
# [INFO] [router] match rule: geoip-cn -> direct
# [INFO] [router] match rule: default -> proxy

11.5.8 高级配置选项
#

1. 多节点负载均衡:

{
  "outbounds": [
    {
      "type": "selector",
      "tag": "proxy",
      "outbounds": ["auto", "hk-node", "us-node", "jp-node"],
      "default": "auto"
    },
    {
      "type": "urltest",
      "tag": "auto",
      "outbounds": ["hk-node", "us-node", "jp-node"],
      "url": "https://www.gstatic.com/generate_204",
      "interval": "5m",
      "tolerance": 50
    },
    {
      "type": "vless",
      "tag": "hk-node",
      "server": "hk.example.com",
      "server_port": 443,
      "uuid": "your-uuid"
    },
    {
      "type": "vless",
      "tag": "us-node",
      "server": "us.example.com",
      "server_port": 443,
      "uuid": "your-uuid"
    }
  ]
}

2. 流媒体分流:

{
  "route": {
    "rules": [
      {
        "geosite": ["netflix"],
        "outbound": "us-node"
      },
      {
        "geosite": ["youtube"],
        "outbound": "hk-node"
      }
    ]
  }
}

3. 按设备分流:

{
  "route": {
    "rules": [
      {
        "source_ip_cidr": ["192.168.1.100/32"],
        "outbound": "proxy"
      },
      {
        "source_ip_cidr": ["192.168.1.101/32"],
        "outbound": "direct"
      }
    ]
  }
}

4. 使用gvisor协议栈(更好的兼容性):

{
  "inbounds": [
    {
      "type": "tun",
      "stack": "gvisor",
      "inet4_address": "172.19.0.1/30",
      "inet6_address": "fdfe:dcba:9876::1/126",
      "auto_route": true,
      "strict_route": true
    }
  ]
}

11.5.9 故障排查
#

1. TUN接口未创建:

# 检查sing-box服务状态
sudo systemctl status sing-box

# 查看详细日志
sudo journalctl -u sing-box -n 100

# 检查内核是否支持TUN
lsmod | grep tun
# 如果没有输出,加载模块
sudo modprobe tun

# 确保tun模块开机加载
echo "tun" | sudo tee -a /etc/modules

2. 流量未被代理:

# 检查路由规则
ip route show table all
ip rule show

# 检查iptables规则
sudo iptables -L -v -n
sudo iptables -t nat -L -v -n
sudo iptables -t mangle -L -v -n

# 测试DNS解析
nslookup google.com
dig google.com

3. 国内网站无法访问:

# 检查GeoIP/GeoSite数据库是否存在
ls -lh /var/lib/sing-box/

# 更新数据库
sudo wget -O /var/lib/sing-box/geoip.db https://github.com/SagerNet/sing-geoip/releases/latest/download/geoip.db
sudo wget -O /var/lib/sing-box/geosite.db https://github.com/SagerNet/sing-geosite/releases/latest/download/geosite.db

# 重启sing-box
sudo systemctl restart sing-box

4. 性能问题:

# 调整MTU值
# 在配置文件中修改 "mtu": 1400

# 使用system协议栈而非gvisor
# 在配置文件中修改 "stack": "system"

# 启用TCP BBR拥塞控制
echo "net.core.default_qdisc=fq" | sudo tee -a /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control=bbr" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

5. DNS泄漏:

# 测试DNS泄漏
# 访问 https://www.dnsleaktest.com/

# 确保DNS请求也走代理
# 在配置中确保有以下规则:
{
  "protocol": "dns",
  "outbound": "dns-out"
}

11.5.10 性能优化建议
#

1. 选择合适的协议:

  • Shadowsocks:日常使用,轻量高效
  • VLESS + XTLS:高性能需求
  • Hysteria/TUIC:弱网环境,游戏加速

2. 优化TUN配置:

{
  "inbounds": [
    {
      "type": "tun",
      "mtu": 9000,
      "stack": "system",
      "gso": true,
      "udp_timeout": "5m"
    }
  ]
}

3. 启用连接复用:

{
  "outbounds": [
    {
      "multiplex": {
        "enabled": true,
        "protocol": "h2mux",
        "max_connections": 4
      }
    }
  ]
}

4. 优化内核参数:

# 编辑 /etc/sysctl.conf
net.core.rmem_max=134217728
net.core.wmem_max=134217728
net.ipv4.tcp_rmem=4096 87380 67108864
net.ipv4.tcp_wmem=4096 65536 67108864
net.ipv4.tcp_congestion_control=bbr

11.5.11 自动更新GeoIP/GeoSite数据库
#

创建自动更新脚本:

sudo nano /usr/local/bin/update-sing-box-geo.sh

脚本内容:

#!/bin/bash

# 更新GeoIP数据库
wget -O /tmp/geoip.db https://github.com/SagerNet/sing-geoip/releases/latest/download/geoip.db
if [ $? -eq 0 ]; then
    mv /tmp/geoip.db /var/lib/sing-box/geoip.db
    echo "GeoIP database updated successfully"
fi

# 更新GeoSite数据库
wget -O /tmp/geosite.db https://github.com/SagerNet/sing-geosite/releases/latest/download/geosite.db
if [ $? -eq 0 ]; then
    mv /tmp/geosite.db /var/lib/sing-box/geosite.db
    echo "GeoSite database updated successfully"
fi

# 重启sing-box服务
systemctl restart sing-box
echo "sing-box service restarted"

添加执行权限:

sudo chmod +x /usr/local/bin/update-sing-box-geo.sh

创建定时任务:

sudo crontab -e

添加以下行(每周日凌晨2点更新):

0 2 * * 0 /usr/local/bin/update-sing-box-geo.sh >> /var/log/sing-box-geo-update.log 2>&1

11.5.12 安全建议
#

1. 限制sing-box配置文件权限:

sudo chmod 600 /etc/sing-box/config.json
sudo chown root:root /etc/sing-box/config.json

2. 使用TLS加密的协议:

  • 优先使用VLESS、Trojan等支持TLS的协议
  • 确保使用真实域名和有效证书

3. 定期更新sing-box:

# 检查版本
sing-box version

# 下载新版本并替换
# 参考安装步骤

4. 监控和日志:

# 定期检查日志
sudo journalctl -u sing-box --since "1 hour ago"

# 监控连接数
watch -n 1 'ss -s'

通过以上配置,你的Debian路由器已经具备了强大的透明代理和智能分流能力。局域网内的所有设备无需任何配置,即可自动享受智能分流带来的便利:国内网站直连(速度快),国外网站走代理(突破限制),广告自动拦截(清爽体验)。

十二、备份与恢复
#

12.1 备份配置文件
#

创建备份脚本:

#!/bin/bash

BACKUP_DIR="/backup/router-config-$(date +%Y%m%d)"
mkdir -p $BACKUP_DIR

# 备份网络配置
cp /etc/network/interfaces $BACKUP_DIR/
cp /etc/sysctl.conf $BACKUP_DIR/

# 备份DHCP配置
cp /etc/dhcp/dhcpd.conf $BACKUP_DIR/
cp /etc/default/isc-dhcp-server $BACKUP_DIR/

# 备份DNS配置
cp /etc/dnsmasq.conf $BACKUP_DIR/

# 备份防火墙规则
iptables-save > $BACKUP_DIR/iptables.rules
ip6tables-save > $BACKUP_DIR/ip6tables.rules

# 备份其他配置
cp /etc/radvd.conf $BACKUP_DIR/ 2>/dev/null || true

echo "Backup completed: $BACKUP_DIR"

12.2 系统快照
#

使用rsync创建系统快照:

sudo apt install -y rsync

sudo rsync -aAXv --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found"} / /backup/system-snapshot/

十三、总结
#

通过本文的详细配置,我们成功地将Debian系统配置为功能完整的路由器,实现了:

基础网络功能

  • 网桥配置,将物理接口作为slave
  • IP转发和路由功能
  • DHCP自动分配IP地址
  • DNS服务和缓存

NAT和防火墙

  • IPv4/IPv6 NAT配置
  • iptables安全规则
  • 防火墙持久化

IPv6支持

  • IPv6转发
  • DHCPv6客户端
  • 路由器通告(RA)
  • IPv6中继(可选)

高级功能

  • 性能优化
  • 安全加固
  • 流量监控
  • 故障排查

优势总结
#

相比商用路由器,Debian路由器具有以下优势:

  1. 完全控制:完整的系统访问权限,可以自由定制
  2. 强大功能:支持高级网络功能,如VLAN、QoS、VPN等
  3. 高性能:可以使用更强大的硬件,处理更高的流量
  4. 灵活扩展:可以安装各种服务,如网站服务器、文件服务器等
  5. 免费开源:无需购买昂贵的商用设备
  6. 学习价值:深入理解网络原理和Linux系统

注意事项
#

⚠️ 安全提醒

  • 定期更新系统和软件包
  • 使用强密码和密钥认证
  • 定期检查防火墙规则
  • 监控系统日志

⚠️ 稳定性建议

  • 使用UPS确保电源稳定
  • 定期备份配置文件
  • 测试故障切换方案
  • 监控系统资源使用

⚠️ 性能考虑

  • 根据带宽需求选择合适的硬件
  • 启用硬件加速功能
  • 优化内核参数
  • 定期清理连接跟踪表

通过正确的配置和维护,Debian路由器可以成为家庭或小型企业网络的可靠核心设备,提供专业级的网络服务。

参考资料
#


相关文章推荐:

通过邮件回复

相关文章

新时代之sing-box

新时代之sing-box:下一代通用代理平台 # sing-box 是一个通用的代理平台,支持多种协议,具有强大的路由功能和高性能表现。它是新一代的网络代理工具,相比传统的代理软件,sing-box 在功能性、性能和可配置性方面都有显著提升。

spring三级缓存介绍

6 分钟
Spring的三级缓存介绍 Spring框架在处理单例Bean的创建和依赖注入时,使用了三级缓存机制来管理Bean的生命周期和解决潜在的循环依赖问题。这些缓存主要定义在org.springframework.beans.factory.support.DefaultSingletonBeanRegistry类中。下面结合源码进行详细介绍。

Java GC进化路程

4 分钟
1. 概述 # 本博客中我们将展示不同JVM垃圾回收(GC)实现的基本原理。然后我们将学习如何在应用程序中启动特定类型的垃圾回收。

部署基于artalk的评论系统

1 分钟
部署基于artalk的评论系统 # 在现代博客和网站中,评论系统是与读者互动的重要工具。Artalk 是一个开源的评论系统,具有轻量级、易于集成和高度可定制的特点。本文将介绍如何在 Hugo 博客中部署基于 Artalk 的评论系统。

反转链表

反转链表 # 这是我写的算法可以用来参考,上边有测试用例可以用来检测代码写的对不对。