☰
双网卡Debian网关实战:IP伪装、端口映射与iptables持久化
2026/10/6 15:07:28 网站建设 项目流程

简介:这份资源面向需要在网络边缘部署防护体系的运维人员与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 up

hw 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 方案是装 ipmasq:

sudo 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_ftp

iptable_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确认返回 1;iptables -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.1,cat /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.2

conntrack -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_max=262144 sysctl -w net.netfilter.nf_conntrack_tcp_timeout_established=3600

写入/etc/sysctl.conf持久化。从那以后我每次给网关加新规则,都会顺手看一眼 conntrack 的 count 和 max,确认还有余量。这个习惯帮我省过好几次半夜被叫起来查“网络又断了”的后悔药。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询