
简介这份资源面向需要在网络边缘部署防护体系的运维人员与Linux学习者围绕Debian系统讲解如何搭建一台兼具内外网隔离与访问控制能力的安全网关属于偏实操的中级网络配置资料。压缩包内共1个doc文档约24KB以文字与配置片段形式呈现便于在终端旁对照查阅。文档依次覆盖网关主机设置、IP伪装与端口映射三大环节网卡部分给出/etc/network/interfaces静态配置写法及ifconfig、route命令替代方案并说明DNS与MAC地址绑定的处理方式随后通过安装ipmasq实现LAN主机共享单一公网IP访问Internet最后以iptables脚本完成DNAT与SNAT端口映射并开启内核转发。目前已有207人学习适合希望理解双网卡网关原理、掌握iptables NAT规则编写与排错思路的读者参考。1. 双网卡 Debian 网关从一台裸机到能扛事的边界设备手里攒了一台退役的工控机两个千兆口想让它顶在机柜最前面当网关用——这大概是很多运维和嵌入式方向的朋友都动过的念头。Debian 在这类场景里出镜率极高原因不复杂包管理干净、内核裁剪可控、长期支持周期长装完之后基本不用再操心系统层面的幺蛾子。但真把两块网卡插上、配完 IP、打开转发之后你会发现事情远没有echo 1 ip_forward那么简单LAN 里的机器能 ping 通网关却上不了网、FTP 被动模式连不上、端口映射写了但外部访问超时、重启之后规则全丢。这篇笔记就围绕一台双网卡 Debian 主机把网关主机设置、IP 伪装、端口映射这三块拆开讲透顺带把 iptables 规则持久化和常见翻车点一并交代。适合手里有闲置硬件、想自己搭一台可控边界设备的读者也适合正在学 Linux 网络栈、需要一份能照着复现的实操参考的人。2. 网关主机设置双网卡地址、路由与 DNS 的落地配置网关主机的第一件事不是装软件而是把两块网卡的地址、路由和 DNS 理清楚。eth0 朝外接 Internet通常拿一个静态公网地址eth1 朝内接 LAN一般用 192.168.0.1 这类私有地址做内网默认网关。这两块网卡的角色一旦定下来后面所有转发、NAT、过滤规则才有明确的出入口方向。很多人上来就急着装 ipmasq结果 LAN 侧机器连网关都 ping 不通回头查半天发现是 eth1 的 netmask 写错或者网线插反了。所以这一章先把地基打牢。2.1 用 /etc/network/interfaces 固化双网卡配置Debian 传统网络配置走/etc/network/interfaces虽然现在不少发行版转向了 netplan 或 NetworkManager但在网关这种追求稳定、少依赖的场景里interfaces 文件依然是最省心的选择。下面是一份双网卡静态配置的模板eth0 的公网地址和网关用占位符表示实际替换成你自己的# /etc/network/interfaces auto lo iface lo inet loopback # 外网口接 Internet auto eth0 iface eth0 inet static address 203.0.113.10 netmask 255.255.255.0 gateway 203.0.113.1 # 内网口接 LAN auto eth1 iface eth1 inet static address 192.168.0.1 network 192.168.0.0 netmask 255.255.255.0 broadcast 192.168.0.255这段配置的逻辑很直白auto eth0和auto eth1让两块网卡在系统启动时自动拉起iface eth0 inet static声明 eth0 使用静态 IPv4 地址gateway字段只在外网口上写内网口不要写默认网关否则系统可能生成两条默认路由导致出站流量走错方向。network和broadcast在内网口上写清楚能减少一些老设备 ARP 解析时的困惑。参数上需要留意几个点。address必须是该网段内未被占用的地址公网地址如果和 MAC 绑定还得先确认运营商侧已经放行。netmask决定同网段范围公网如果是 /29 或 /30 的小子网netmask 要相应改成 255.255.255.248 或 255.255.255.252。gateway是运营商给的下一跳写错的话外网直接不通。改完文件后用systemctl restart networking或ifdown eth0 ifup eth0生效别直接 reboot先看ip addr和ip route的输出是否符合预期。2.2 临时调试用 ifconfig 与 route但别把它当长期方案有些场景下不方便改配置文件比如远程操作怕断网或者只是想快速验证地址通不通。这时候可以用ifconfig和route临时配# 临时配置外网口 ifconfig eth0 203.0.113.10 netmask 255.255.255.0 up route add default gw 203.0.113.1 # 临时配置内网口 ifconfig eth1 192.168.0.1 netmask 255.255.255.0 up # 查看当前路由表 route -n这几条命令的含义分别是给 eth0 配地址并拉起、添加默认路由指向运营商下一跳、给 eth1 配内网地址、最后用route -n确认路由表里默认路由只有一条且指向 eth0 的网关。ifconfig和route属于 net-tools 包新版 Debian 默认可能没装需要apt install net-tools。临时配置的好处是即时生效、不碰文件坏处是重启即失而且和 interfaces 文件里的配置可能冲突。我一般只在排障时用确认地址和路由没问题后立刻写回 interfaces 文件并重启网络服务避免留下两套不一致的配置。2.3 DNS 与 MAC 地址两个容易被忽略的细节DNS 在/etc/resolv.conf里配加一行nameserver即可# /etc/resolv.conf nameserver 202.120.2.101 nameserver 223.5.5.5这里建议至少写两个 nameserver第一个不通时系统会尝试第二个。但要注意如果系统装了 resolvconf 或 systemd-resolved直接改/etc/resolv.conf可能被覆盖需要改对应的源配置。网关本身能解析域名LAN 侧机器才能通过它做 DNS 转发否则内网机器只能靠 IP 访问外网。MAC 地址修改是另一个特殊场景。如果运营商把 IP 和某个 MAC 绑定换机器后需要把新网卡的 MAC 改成原来绑定的那个ifconfig eth0 down ifconfig eth0 hw ether 00:1a:2b:3c:4d:5e ifconfig eth0 uphw ether后面跟的是十二位十六进制 MAC 地址。改完再重新配 IP 和路由。这个操作在虚拟化环境里也常用比如克隆虚拟机后网卡 MAC 变了导致上不了网。需要提醒的是MAC 修改只在当前会话有效要持久化得写进 interfaces 文件或用 udev 规则而且部分网卡驱动不支持随意改 MAC改完用ip link show eth0确认一下实际生效的地址。3. IP 伪装与转发让 LAN 机器共享一个公网出口地址配好、LAN 侧能 ping 通网关之后下一步是让内网机器真正能访问 Internet。这里涉及两个层面内核的 IP 转发开关以及 NAT 伪装规则。很多人以为装了 ipmasq 就万事大吉其实 ipmasq 只是帮你生成了一套 iptables 规则底层还是靠内核转发和 NAT 表。理解这两层排障时才能定位到具体是哪一环断了。3.1 内核转发开关一切的前提Linux 默认不转发数据包这是安全设计。要让网关把 eth1 收到的包转到 eth0 发出去必须打开转发# 临时开启 echo 1 /proc/sys/net/ipv4/ip_forward # 永久生效写入 sysctl 配置 echo net.ipv4.ip_forward 1 /etc/sysctl.conf sysctl -p第一句直接写 proc 文件立即生效但重启丢失第二句写入/etc/sysctl.conf并sysctl -p重新加载重启后依然有效。判断转发是否打开用cat /proc/sys/net/ipv4/ip_forward返回 1 才算开。如果 LAN 侧能 ping 通网关但完全上不了外网先查这个值十有八九是没开或者被其他配置覆盖了。3.2 安装 ipmasq 并理解它做了什么Debian 下最省事的 NAT 方案是装 ipmasqsudo apt-get install ipmasq安装过程中会弹几个配置问题一般默认即可。装完后 LAN 侧机器把网关指向 192.168.0.1应该就能访问 Internet 了。ipmasq 的本质是一组 shell 脚本根据当前网络接口和地址自动生成 iptables 的 NAT 规则核心就是一条 MASQUERADE# ipmasq 生成的规则大致等价于 iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE-t nat指定 NAT 表-A POSTROUTING表示在路由决策之后、数据包发出前做处理-o eth0限定从外网口出去的流量-j MASQUERADE是动态源地址转换把内网包的源地址改成 eth0 的地址。用 MASQUERADE 而不是 SNAT 的好处是当 eth0 是动态获取地址时它会自动读取当前地址不用手写死。但 ipmasq 有个坑它生成的规则和手动写的 iptables 规则可能互相覆盖。如果你后面要加端口映射或过滤规则建议先iptables -t nat -L -n看看 ipmasq 到底写了什么再决定是继续用它还是换成自己维护规则集。我一般会在确认 ipmasq 工作正常后把它的规则导出成脚本然后卸载 ipmasq改由自己控制避免两套逻辑打架。3.3 手动 NAT 规则更可控的替代方案不想依赖 ipmasq 的话手动写 NAT 规则同样简单# 清空现有 NAT 规则 iptables -t nat -F # 添加源地址伪装 iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE # 确认规则 iptables -t nat -L POSTROUTING -n -v-s 192.168.0.0/24限定只对来自内网网段的流量做伪装比不写源地址更安全避免网关自己发出的流量也被误处理。-o eth0限定出口。-v查看规则时能看到匹配计数如果计数一直是 0说明内网流量根本没走到这条规则需要回头查转发开关和路由。手动规则的好处是清晰、可控坏处是重启丢失需要配合iptables-save和iptables-restore做持久化这个后面章节会讲。4. 端口映射把内网服务暴露到公网的 DNAT 写法NAT 让内网能出去端口映射让外面能进来。典型场景是 LAN 里有一台 FTP 服务器 192.168.0.2或者一台 Windows 主机需要远程桌面要从 Internet 直接访问。这靠的是 DNAT在 PREROUTING 链上把发往公网地址某端口的数据包改写目标地址和端口转发到内网主机。4.1 加载必要的内核模块在做 DNAT 之前先把相关模块加载上尤其是涉及 FTP 这种带协议跟踪的场景/sbin/modprobe iptable_filter /sbin/modprobe ip_tables /sbin/modprobe iptable_nat /sbin/modprobe ip_nat_ftp /sbin/modprobe ip_conntrack /sbin/modprobe ip_conntrack_ftpiptable_filter和ip_tables是过滤功能的基础iptable_nat提供 NAT 能力ip_conntrack做连接跟踪ip_nat_ftp和ip_conntrack_ftp专门处理 FTP 协议——因为 FTP 的数据连接端口是动态协商的没有这两个模块被动模式基本连不上。这些模块在现代内核里多数会自动加载但显式 modprobe 一遍不亏尤其在精简系统上。4.2 DNAT 规则FTP 与远程桌面的映射实例下面是一段完整的端口映射脚本包含清空规则、设置默认策略、添加 DNAT 和 SNAT#!/bin/sh # 加载模块 /sbin/modprobe iptable_filter /sbin/modprobe ip_tables /sbin/modprobe iptable_nat /sbin/modprobe ip_nat_ftp /sbin/modprobe ip_conntrack /sbin/modprobe ip_conntrack_ftp # 清空所有规则 iptables -F iptables -P INPUT ACCEPT iptables -P FORWARD ACCEPT iptables -P OUTPUT ACCEPT iptables -F -t nat # FTP 映射公网 21 端口 - 内网 192.168.0.2 的 21 端口 iptables -t nat -A PREROUTING -p tcp -i eth0 -d 203.0.113.10 --dport 21 \ -j DNAT --to 192.168.0.2:21 # 远程桌面映射公网 2345 端口 - 内网 192.168.0.116 的 3389 端口 iptables -t nat -A PREROUTING -p tcp -i eth0 -d 203.0.113.10 --dport 2345 \ -j DNAT --to 192.168.0.116:3389 # 内网出站 SNAT iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j SNAT --to 203.0.113.10 # 开启转发 echo 1 /proc/sys/net/ipv4/ip_forward逐条看-p tcp指定协议-i eth0限定从外网口进入-d 203.0.113.10是公网目标地址--dport 21是外部访问的端口-j DNAT --to 192.168.0.2:21把目标改写成内网 FTP 的地址和端口。远程桌面那条同理外部访问公网 2345 端口实际落到内网 192.168.0.116 的 3389。最后一条 SNAT 是给内网出站流量做源地址转换这里用 SNAT 写死了公网地址如果地址是动态的换成 MASQUERADE 更合适。参数上最容易出错的是-d后面的公网地址。如果网关有多个公网 IP必须写清楚外部访问的是哪一个否则规则不匹配。--dport是外部看到的端口--to里的端口是内网服务实际监听的端口两者可以不同比如外部 2345 映射到内部 3389这种端口转换在隐藏真实服务端口时很有用。4.3 规则持久化别让重启清空一切iptables 规则默认存在内存里重启就没了。生产环境必须做持久化# 保存当前规则 iptables-save /etc/iptables/rules.v4 # 开机自动恢复安装 iptables-persistent apt install iptables-persistent # 安装时会询问是否保存当前规则选是即可iptables-save把当前所有表的规则导出成文本iptables-persistent包会在开机时读取/etc/iptables/rules.v4并恢复。装完之后每次改完规则记得重新iptables-save一次否则下次重启又回到旧规则。也可以把规则写成一个脚本放到/etc/network/if-up.d/下网络拉起时自动执行这种方式更灵活适合规则经常调整的场景。5. 避坑与排查网关跑起来之后最容易翻车的五件事网关这东西配好那一刻能用不代表一直能用。下面这五条是我自己踩过或者帮别人排过的坑每条按现象、原因、解决来说遇到问题可以对照着查。现象一LAN 机器能 ping 通网关但打不开任何网页。原因内核转发没开或者 NAT 规则没生效。ping 通网关只说明二层和三层到网关的链路没问题转发和 NAT 是另外两回事。 解决cat /proc/sys/net/ipv4/ip_forward确认返回 1iptables -t nat -L POSTROUTING -n -v看 MASQUERADE 或 SNAT 规则是否存在、匹配计数是否在涨。计数不动就说明流量没走到 NAT回头查路由和接口方向。现象二FTP 能登录但列目录卡死或者被动模式连不上。原因FTP 协议的数据连接是动态端口的没有加载ip_nat_ftp和ip_conntrack_ftp模块时NAT 无法正确跟踪和转换数据连接。 解决lsmod | grep ftp确认模块已加载没有就modprobe ip_nat_ftp和modprobe ip_conntrack_ftp。如果用的是 vsftpd 或 proftpd也可以考虑在服务端配置被动端口范围并在网关上把该范围一并映射减少对协议跟踪模块的依赖。现象三端口映射写了外部访问超时内网直接访问正常。原因DNAT 规则里的-d公网地址写错或者-i接口不对或者 FORWARD 链默认策略是 DROP 把转发包丢了。 解决先iptables -t nat -L PREROUTING -n -v看规则匹配计数不涨就是没匹配上检查-d地址和-i接口。计数涨了但外部还是不通查iptables -L FORWARD -n -v确认没有 DROP 规则拦截必要时加一条iptables -A FORWARD -j ACCEPT临时放行测试。现象四重启之后所有规则消失网关变回普通主机。原因iptables 规则没有持久化或者持久化文件没被正确加载。 解决用iptables-save /etc/iptables/rules.v4保存确认iptables-persistent已安装并启用。也可以写一个启动脚本放在/etc/network/if-up.d/下确保网络起来后自动执行。每次改完规则都要重新保存别改完就完事。现象五内网某台机器能上网另一台不行配置看起来一样。原因可能是那台机器的网关或 DNS 没指对也可能是它的 IP 和网内其他设备冲突还可能是网关上针对该 IP 有残留的过滤规则。 解决在出问题的机器上ip route确认默认网关是 192.168.0.1cat /etc/resolv.conf确认 DNS 指向。然后在网关上iptables -L -n -v看有没有针对该 IP 的 DROP 或 REJECT 规则。最后用arping或ip neigh检查是否有 IP 冲突。6. 进阶技巧用 conntrack 和日志把网关变成可观测设备规则跑通只是及格线真正让网关扛得住折腾的是让它变得可观测。我后来养成的习惯是任何一条新加的 DNAT 或过滤规则上线前先挂一条 LOG 规则看流量确认匹配行为符合预期后再去掉日志。具体做法是在目标规则前面插一条# 在 NAT 表 PREROUTING 链顶部插入日志规则观察发往 21 端口的流量 iptables -t nat -I PREROUTING 1 -p tcp -i eth0 --dport 21 \ -j LOG --log-prefix FTP-DNAT: --log-level 4 # 查看内核日志 dmesg -w | grep FTP-DNAT-I PREROUTING 1表示插入到链的第一条确保在 DNAT 之前记录原始目标信息。--log-prefix给日志加个标记方便 grep。--log-level 4是 warning 级别避免被淹没在大量 debug 信息里。dmesg -w实时跟踪内核日志能看到每个匹配包的五元组。确认规则生效后用iptables -t nat -D PREROUTING 1删掉日志规则避免日志刷爆磁盘。另一个实用工具是 conntrack用来查看当前连接跟踪表# 安装 conntrack 工具 apt install conntrack # 查看所有跟踪的连接 conntrack -L # 只看与内网 FTP 相关的连接 conntrack -L | grep 192.168.0.2conntrack -L输出当前所有被跟踪的连接包括源、目的、状态和超时时间。当端口映射时通时不通或者 NAT 后连接状态异常时这个命令能直接告诉你内核眼里这条连接长什么样。比如 FTP 的数据连接如果没被正确跟踪conntrack -L里就看不到对应的 RELATED 条目问题定位就非常直接。还有一个我踩过的坑网关跑久了 conntrack 表满新连接被丢弃。默认nf_conntrack_max可能只有几万条内网机器一多、P2P 一跑就爆。查当前值和上限sysctl net.netfilter.nf_conntrack_count sysctl net.netfilter.nf_conntrack_max如果 count 接近 max就调大上限并缩短超时sysctl -w net.netfilter.nf_conntrack_max262144 sysctl -w net.netfilter.nf_conntrack_tcp_timeout_established3600写入/etc/sysctl.conf持久化。从那以后我每次给网关加新规则都会顺手看一眼 conntrack 的 count 和 max确认还有余量。这个习惯帮我省过好几次半夜被叫起来查“网络又断了”的后悔药。希望帮到你。本文还有配套的精品资源点击获取