使用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 02.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 -p2.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-server3.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 dnsmasq4.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.14.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.sh5.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.sh5.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.v65.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 show6.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 dhcp6c6.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 radvd6.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 br07.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 07.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 on8.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 -p8.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 sshd9.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 fail2ban9.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 br02. 无法访问外网
# 检查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.com3. 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 dnsmasq4. 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 radvd10.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 -nn10.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 root11.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 save11.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 312911.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.key11.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:严格路由模式,确保所有流量都经过TUNstack:协议栈类型,system使用系统协议栈,gvisor使用用户态协议栈sniff:启用协议嗅探,自动识别流量类型mtu:最大传输单元
智能分流规则:
- DNS请求优先处理
- 广告域名拦截
- 局域网流量直连
- 中国大陆网站和IP直连
- 国外服务走代理
- 默认策略:代理
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/*.db11.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 ACCEPT11.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 -f11.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 -> proxy11.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/modules2. 流量未被代理:
# 检查路由规则
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.com3. 国内网站无法访问:
# 检查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-box4. 性能问题:
# 调整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 -p5. 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=bbr11.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>&111.5.12 安全建议#
1. 限制sing-box配置文件权限:
sudo chmod 600 /etc/sing-box/config.json
sudo chown root:root /etc/sing-box/config.json2. 使用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路由器具有以下优势:
- 完全控制:完整的系统访问权限,可以自由定制
- 强大功能:支持高级网络功能,如VLAN、QoS、VPN等
- 高性能:可以使用更强大的硬件,处理更高的流量
- 灵活扩展:可以安装各种服务,如网站服务器、文件服务器等
- 免费开源:无需购买昂贵的商用设备
- 学习价值:深入理解网络原理和Linux系统
注意事项#
⚠️ 安全提醒
- 定期更新系统和软件包
- 使用强密码和密钥认证
- 定期检查防火墙规则
- 监控系统日志
⚠️ 稳定性建议
- 使用UPS确保电源稳定
- 定期备份配置文件
- 测试故障切换方案
- 监控系统资源使用
⚠️ 性能考虑
- 根据带宽需求选择合适的硬件
- 启用硬件加速功能
- 优化内核参数
- 定期清理连接跟踪表
通过正确的配置和维护,Debian路由器可以成为家庭或小型企业网络的可靠核心设备,提供专业级的网络服务。
参考资料#
相关文章推荐:
通过邮件回复





