ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Debian 旧服务器改造安全网关:nftables 与 DNS 加固实战

Debian 旧服务器改造安全网关:nftables 与 DNS 加固实战 简介这份文档面向具备一定 Linux 基础的运维人员与网络爱好者讲解如何以 Debian Linux 为平台搭建一台兼顾内外网隔离与访问控制的安全网关适合需要为小型局域网提供共享上网与端口转发方案的读者参考。资源包内仅含 1 个 doc 文档体积约 24KB篇幅精炼便于快速通读与对照实践。内容围绕网关主机设置、IP 伪装与端口映射三条主线展开先给出双网卡 eth0/eth1 的 interfaces 配置与 ifconfig、route、DNS、MAC 绑定等命令示例再说明通过 ipmasq 实现局域网共享上网最后用 iptables 脚本演示 DNAT/SNAT 端口映射与 ip_forward 转发开启并附有可直接套用的脚本片段。目前已有 207 人学习适合希望低成本构建安全网关、快速掌握 iptables 转发规则的读者查阅。1. 用 Debian 做安全网关为什么老服务器比新路由器更值得折腾家里或小公司那台退役的旧服务器装个 Debian 当网关往往比买一台消费级路由器更靠谱。原因不复杂Debian 的包管理能让你精确控制每一个进出流量iptables/nftables 的规则可以细到端口和连接状态而消费级路由器固件通常只给你几个勾选项。标题里说的“安全网关”核心不是堆功能而是把“默认拒绝、按需放行”这条原则落到每一层——从内核转发到 DNS 解析再到日志审计。适合谁手头有闲置 x86 设备、愿意敲命令、对网络边界有基本概念的人。如果你只想要一个能上网的盒子那这篇不适合你但如果你想知道流量到底去了哪、谁在半夜扫你的端口Debian 网关能给你完整的黑匣子。2. 网关的底层逻辑从内核转发到 nftables 规则链2.1 为什么先关掉net.ipv4.ip_forward再按需打开很多人装完 Debian 第一件事就是echo 1 /proc/sys/net/ipv4/ip_forward然后发现内网能上网了但安全策略完全没生效。正确的顺序是先确认转发关闭配好防火墙规则最后再打开转发。这样任何一条错误规则都不会导致流量裸奔。# 查看当前转发状态0 表示关闭 cat /proc/sys/net/ipv4/ip_forward # 永久关闭转发默认就是 0但有些镜像会改 echo net.ipv4.ip_forward0 /etc/sysctl.d/99-gateway.conf sysctl -p /etc/sysctl.d/99-gateway.conf逻辑说明/proc/sys/net/ipv4/ip_forward是运行时开关sysctl.d下的配置文件是持久化。参数99-gateway.conf里的99只是加载顺序避免被其他文件覆盖。注意如果你用的是 Debian 13 (trixie)默认内核已经启用了nf_tables后端iptables命令实际是nftables的兼容层建议直接学nft语法。2.2 nftables 表、链、规则的三层结构nftables 把规则组织成表table→ 链chain→ 规则rule。表按地址族划分网关最常用的是inet族同时处理 IPv4 和 IPv6。# 创建 inet 族表名为 gateway nft add table inet gateway # 创建 input 链类型 filter钩子 input优先级 0 nft add chain inet gateway input { type filter hook input priority 0 \; policy drop \; } # 允许已建立的连接和本地回环 nft add rule inet gateway input ct state established,related accept nft add rule inet gateway input iif lo accept # 允许内网 SSH假设内网段是 192.168.10.0/24 nft add rule inet gateway input ip saddr 192.168.10.0/24 tcp dport 22 accept逻辑说明policy drop是默认拒绝所有没匹配到的包都会被丢弃。ct state established,related让回包能进来否则你连出去都收不到响应。iif lo是回环接口必须放行。参数priority 0表示过滤优先级数字越小越早执行。注意nft命令里的分号需要转义写成脚本时建议用nft -f加载文件避免转义地狱。2.3 转发链和 NAT 的配合内网要上网需要forward链放行再加postrouting做源地址转换SNAT。# 创建 forward 链默认拒绝 nft add chain inet gateway forward { type filter hook forward priority 0 \; policy drop \; } # 允许内网到外网的已建立连接 nft add rule inet gateway forward ct state established,related accept nft add rule inet gateway forward iifname eth1 oifname eth0 accept # 创建 postrouting 链做 SNAT nft add chain inet gateway postrouting { type nat hook postrouting priority 100 \; } nft add rule inet gateway postrouting oifname eth0 masquerade逻辑说明iifname eth1是内网接口oifname eth0是外网接口方向不能反。masquerade会自动使用出口接口的 IP 做源地址转换适合动态 IP 场景。参数priority 100是 NAT 链的标准优先级低于过滤链。注意如果外网是固定 IP用snat to 你的公网IP比masquerade性能略好但差别不大。3. 把 Debian 配成网关的完整操作路径3.1 网卡命名与 IP 设定的坑Debian 13 默认使用可预测网卡名比如enp3s0、enp4s0但旧服务器上可能是eth0、eth1。先用ip link确认。# 查看所有网卡和状态 ip -br link show # 查看当前 IP ip -br addr show假设内网口是enp3s0外网口是enp4s0。用nmcli或直接改/etc/network/interfaces。如果装了 NetworkManager用nmcli更稳。# 内网口静态 IP nmcli con add type ethernet ifname enp3s0 con-name lan \ ipv4.method manual ipv4.addresses 192.168.10.1/24 \ ipv4.never-default yes # 外网口 DHCP nmcli con add type ethernet ifname enp4s0 con-name wan \ ipv4.method auto ipv4.never-default no逻辑说明ipv4.never-default yes防止内网口抢默认路由。ipv4.method auto让外网口从上游拿地址。参数con-name是连接名随便取但要有意义。注意如果上游是光猫桥接外网口可能需要 PPPoE用nmcli con add type pppoe这里不展开。3.2 用 nftables 文件管理规则别一条条敲命令行敲nft只适合调试持久化要用文件。创建/etc/nftables.conf#!/usr/sbin/nft -f flush ruleset table inet gateway { chain input { type filter hook input priority 0; policy drop; ct state established,related accept iif lo accept ip saddr 192.168.10.0/24 tcp dport 22 accept ip saddr 192.168.10.0/24 udp dport 53 accept ip saddr 192.168.10.0/24 tcp dport 53 accept icmp type echo-request limit rate 5/second accept } chain forward { type filter hook forward priority 0; policy drop; ct state established,related accept iifname enp3s0 oifname enp4s0 accept } chain postrouting { type nat hook postrouting priority 100; oifname enp4s0 masquerade } }逻辑说明flush ruleset清空所有旧规则避免残留。limit rate 5/second限制 ICMP 频率防 ping 洪水。DNS 放行 UDP 和 TCP 53因为大响应会走 TCP。注意/etc/nftables.conf需要nftables.service开机加载systemctl enable --now nftables。3.3 打开转发并验证规则加载后再开转发。echo net.ipv4.ip_forward1 /etc/sysctl.d/99-gateway.conf sysctl -p /etc/sysctl.d/99-gateway.conf # 验证 cat /proc/sys/net/ipv4/ip_forward nft list ruleset逻辑说明sysctl -p重新加载配置。nft list ruleset检查规则是否生效。注意如果内网机器上不了网先ping 192.168.10.1确认网关可达再ping 8.8.8.8确认转发最后ping www.debian.org确认 DNS。4. 安全加固DNS、日志和反垃圾邮件网关的联动4.1 用 Unbound 做本地 DNS 缓存和过滤网关自带 DNS 能减少外网查询还能挡掉已知恶意域名。apt install unbound -y编辑/etc/unbound/unbound.conf.d/gateway.confserver: interface: 192.168.10.1 access-control: 192.168.10.0/24 allow do-not-query-localhost: no hide-identity: yes hide-version: yes qname-minimisation: yes forward-zone: name: . forward-addr: 9.9.9.9 forward-addr: 1.1.1.1逻辑说明interface监听内网口。access-control只允许内网查询防止开放解析。hide-identity和hide-version隐藏版本信息。qname-minimisation减少泄露。forward-zone指定上游 DNS。注意如果上游是光猫可能劫持 53 端口建议用 DoT 或换端口但这里不展开。4.2 日志把 nftables 的丢弃记录留下来默认drop不记录排错时很痛苦。加一条日志规则。nft add rule inet gateway input log prefix INPUT-DROP: drop逻辑说明log prefix会在内核日志里加前缀方便journalctl -k | grep INPUT-DROP。注意日志量大时加limit rate否则磁盘会被刷爆。4.3 反垃圾邮件网关的端口转发如果内网有邮件服务器需要把 25、465、587 转发进去。nft add rule inet gateway forward iifname enp4s0 oifname enp3s0 tcp dport { 25, 465, 587 } dnat to 192.168.10.10逻辑说明dnat做目的地址转换。{ 25, 465, 587 }是集合语法。注意邮件服务器本身也要配反垃圾邮件网关只做转发不负责内容过滤。5. 避坑与排查网关翻车现场记录5.1 内网能 ping 通网关但上不了网现象ping 192.168.10.1通ping 8.8.8.8不通。原因forward链默认drop但没放行established或接口名写错。解决nft list chain inet gateway forward检查规则确认iifname和oifname与实际一致。用ip -br link核对网卡名。5.2 DNS 解析时好时坏现象网页有时能开有时不能。原因Unbound 只监听了127.0.0.1内网查询被拒。解决检查unbound.conf里interface是否为内网 IPaccess-control是否包含内网段。systemctl restart unbound后dig 192.168.10.1 www.debian.org验证。5.3 重启后规则全丢现象nft list ruleset为空。原因没启用nftables.service或者/etc/nftables.conf路径不对。解决systemctl enable --now nftablessystemctl status nftables看加载日志。Debian 13 默认用nftables.service但有些镜像没装apt install nftables。5.4 外网口 IP 变了NAT 失效现象动态 IP 更新后内网断网。原因masquerade应该自动适应但如果你写了固定snat就会失效。解决改用masquerade或者写脚本在 IP 变化时更新规则。nmcli的ipv4.method auto会触发 DHCP但不会自动重载 nftables需要dispatcher脚本。5.5 SSH 被锁在外面现象改完规则后 SSH 断连。原因input链policy drop且没放行你的管理 IP。解决本地控制台登录加一条ip saddr 你的管理IP tcp dport 22 accept。血泪经验改远程防火墙前先nft add rule加临时放行确认能连再持久化。6. 进阶用 conntrack 和流量整形把网关用透6.1 查看连接跟踪表找出谁在偷跑流量conntrack是内核的连接跟踪工具能看到所有活跃连接。apt install conntrack -y conntrack -L | head -20 conntrack -L | grep -v 192.168.10 | awk {print $5} | sort | uniq -c | sort -rn | head逻辑说明第一条列出所有连接。第二条过滤掉内网源统计外部地址出现次数快速定位异常外联。参数-L是列表-E是事件模式。注意连接数多时conntrack -L会卡用conntrack -C看总数。6.2 用 tc 限制某个 IP 的上传带宽防止内网某台机器占满上行。# 在外网口加根 qdisc tc qdisc add dev enp4s0 root handle 1: htb default 30 # 创建类限速 10mbit tc class add dev enp4s0 parent 1: classid 1:10 htb rate 10mbit ceil 10mbit # 把特定 IP 的流量分到 1:10 tc filter add dev enp4s0 protocol ip parent 1:0 prio 1 u32 \ match ip dst 192.168.10.50 flowid 1:10逻辑说明htb是分层令牌桶rate是保证带宽ceil是最大带宽。u32匹配目的 IP。注意tc对上传有效下载限速需要在上游做或者用ifb虚拟接口。6.3 验证网关是否真的安全三个检查习惯第一nft list ruleset每周看一次确认没有多余放行。第二ss -tulnp看网关本身开了哪些端口只留 SSH 和 DNS。第三journalctl -k --since 1 hour ago | grep DROP看谁在扫你。我自己的习惯是每次改完规则用另一台机器nmap扫一下外网口确认只有预期端口开放。这个方案值不值得做如果你愿意花一个周末把规则理清楚之后几年都不用换设备。希望帮到你。本文还有配套的精品资源点击获取
返回列表