-m addrtype --src-type LOCAL 可精准识别本机接口(含lo、物理网卡、docker0等)配置的所有IP,自动涵盖IPv4/IPv6及子网,无需手动维护IP段,有效防御源地址伪造;典型应用是在INPUT链中拒绝非LOCAL源访问本地端口,或在OUTPUT链中限制仅允许LOCAL地址出站。

直接用 -m addrtype --src-type LOCAL 可以识别真正来自本机进程发起的连接,从而过滤掉伪造源IP的外部请求。关键不是“封IP”,而是精准区分“谁发的包”——是本机程序主动发出的,还是别人伪造源地址打过来的。
LOCAL 类型到底匹配哪些地址
LOCAL 指的是内核认为“属于本机”的所有 IP 地址,包括:
- lo 接口上的 127.0.0.1/8 和 ::1/128
-
所有已配置在物理网卡或虚拟网卡上的 IPv4/IPv6 地址(比如
ens33上的192.168.1.103、docker0上的172.17.0.1) - 不包含路由表中仅用于转发、未实际绑定到接口的地址
它不依赖于 -s 手动写死 IP 段,也不受 IP 别名或容器网络变动影响,比 -s 127.0.0.1 -s 192.168.1.0/24 更健壮。
典型防护场景:只允许本机程序连指定端口
例如你运行了一个监听 127.0.0.1:8080 的本地服务,但不希望外部主机伪造 127.0.0.1 或本机其他 IP 发起连接(即 IP 欺骗)。可在 INPUT 链中加规则:
iptables -A INPUT -p tcp --dport 8080 ! -m addrtype --src-type LOCAL -j DROP
这条规则含义是:目标端口为 8080 的 TCP 包,如果源地址类型不是 LOCAL,就丢弃。这样即使攻击者用 curl -H "Host: localhost" http://your-server-ip:8080 尝试绕过,只要源 IP 不在本机接口上,就会被拦住。
配合 OUTPUT 链防止出站欺骗
有些应用可能误配或被篡改,尝试用非法源地址(如伪造公网 IP)向外发包。可在 OUTPUT 链限制只允许从 LOCAL 地址发出:
- 默认策略设为 DROP:
iptables -P OUTPUT DROP - 放行合法本机出口:
iptables -A OUTPUT -m addrtype --src-type LOCAL -j ACCEPT - 再按需放开 DNS、NTP 等必要出站流量(注意它们也应走本机源地址)
这能有效阻断某些恶意软件或 misconfigured 容器试图“冒充”其他设备通信的行为。
和传统 -s 匹配的区别与优势
用 -s 127.0.0.1,192.168.1.103 虽然也能达到类似效果,但存在明显短板:
- 新增网卡或 Docker 网络后需手动更新规则
- IPv6 地址(如
fe80::/64链路本地地址)容易遗漏 - 无法覆盖 lo 上所有
127.0.0.0/8子网,而 LOCAL 自动涵盖 - 不能识别
ip rule或策略路由带来的特殊地址归属
addrtype 是内核实时判断的地址语义,不是静态字符串匹配,更贴近真实网络拓扑。


















