Linux实现IP和MAC绑定
Linux 作为网关路由器实现IP和MAC绑定,防止其它设备使用有权限的IP访问相关业务,IP和MAC对不上就直接 DROP 转发,不让它过网关。
这是 FORWARD 层 IP+MAC 绑定强制校验,不靠 ARP,直接判“报文本身”。
✅ 实现原理(最关键)
- • 利用
iptables -m mac --mac-source配合 -s 源IP - • ✅ 先放行 IP 与 MAC 正确配对 的 FORWARD
- • ❌ 再 DROP 同一源 IP 但 MAC 不对 的包
- • 未登记 IP → 也 DROP(默认拒绝转发)
效果:IP 和 MAC 对不上 ⇒ 不能转发 ⇒ 不能上网 / 不能访问内网
✅ 标准配置(可直接用)
假设:
- •
192.168.1.100 ↔ 00:11:22:33:44:55 - •
192.168.1.101 ↔ 00:aa:bb:cc:dd:ee
# 开启转发(如未开)sysctl -w net.ipv4.ip_forward=1# 放行已建连回包(必须)iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT################################# 主机 1iptables -A FORWARD -i eth0 -o eth1 -s 192.168.1.100 -m mac --mac-source 00:11:22:33:44:55 -j ACCEPTiptables -A FORWARD -i eth0 -o eth1 -s 192.168.1.100 -j DROP################################# 主机 2iptables -A FORWARD -i eth0 -o eth1 -s 192.168.1.101 -m mac --mac-source 00:aa:bb:cc:dd:ee -j ACCEPTiptables -A FORWARD -i -o eth1 eth0 -s 192.168.1.101 -j DROP################################# (可选)未登记 IP 也拒绝iptables -P FORWARD DROP
📌 效果说明
✅ 如果想限制所有转发
去掉 -o eth1,只保留:
iptables -A FORWARD -i eth0 \ -s 192.168.1.100 \ -m mac --mac-source 00:11:22:33:44:55 \ -j ACCEPTiptables -A FORWARD -i eth0 -s 192.168.1.100 -j DROP
✅ 多端口 / 全 TCP 照常加条件
iptables -A FORWARD -i eth0 \ -s 192.168.1.100 \ -p tcp -m multiport --dports 80,443 \ -m mac --mac-source 00:11:22:33:44:55 \ -j ACCEPT
⚠️ 必须满足
- • Linux 与 PC 同一二层(中间只能交换机,不能再有 NAT 路由器)
- • MAC 可被伪造(这是 IP–MAC 弱绑定,非强认证)
💡也可以使用最强组合(推荐)
| |
| 静态 ARP(ip neigh add ... nud permanent) |
| |
两道一起 ⇒ 基本杜绝私接 / IP 冒用
ARP 层面的 IP-MAC 绑定 —— 也就是在 Linux 网关的 ARP 表中手动设置静态 ARP 条目,让系统只接受指定 IP 对应的指定 MAC,其他 MAC 发来的该 IP 的 ARP 应答全部忽略,从而从二层切断通信。
这样做的好处是:即使对方改了 IP,也无法通过网关转发数据,因为 ARP 解析阶段就被拦截了。
✅ 核心方法:Linux 静态 ARP(arp -f / ip neigh add)
1️⃣ 查看当前 ARP 表(确认内网接口)
ip neigh show dev eth0
假设内网网卡为 eth0
2️⃣ 添加静态 ARP 绑定(IP → MAC)
# 语法:ip neigh add <IP> lladdr <MAC> nud permanent dev <网卡>ip neigh add 192.168.1.100 lladdr 00:11:22:33:44:55 nud permanent dev eth0ip neigh add 192.168.1.101 lladdr 00:aa:bb:cc:dd:ee nud permanent dev eth0ip neigh add 192.168.1.102 lladdr 00:ff:11:22:33:44 nud permanent dev eth0
nud permanent = 永久有效,不会老化,不接受更新
3️⃣ 验证绑定
ip neigh show dev eth0
输出示例:
192.168.1.100 dev eth0 lladdr 00:11:22:33:44:55 PERMANENT192.168.1.101 dev eth0 lladdr 00:aa:bb:cc:dd:ee PERMANENT192.168.1.102 dev eth0 lladdr 00:ff:11:22:33:44 PERMANENT
4️⃣ 测试效果
- • ✅ 合法主机(IP+MAC 匹配):正常通信,网关正常转发
- • ❌ 非法主机(IP 对但 MAC 错):Linux 网关不会更新 ARP 表,该 IP 的 ARP 请求/应答被忽略 → 无法完成二层寻址 → 无法通过网关转发任何数据
5️⃣ 持久化(重启后保留)
方法一:写入 /etc/iproute2/static-arp.conf(部分发行版支持)
192.168.1.100 dev eth0 lladdr 00:11:22:33:44:55 nud permanent192.168.1.101 dev eth0 lladdr 00:aa:bb:cc:dd:ee nud permanent192.168.1.102 dev eth0 lladdr 00:ff:11:22:33:44 nud permanent
然后启动时执行:
ip neigh add -f /etc/iproute2/static-arp.conf
方法二:写入开机启动脚本(最通用)
创建 /etc/network/if-up.d/arp-bind:
#!/bin/ship neigh add 192.168.1.100 lladdr 00:11:22:33:44:55 nud permanent dev eth0ip neigh add 192.168.1.101 lladdr 00:aa:bb:cc:dd:ee nud permanent dev eth0ip neigh add 192.168.1.102 lladdr 00:ff:11:22:33:44 nud permanent dev eth0
chmod +x /etc/network/if-up.d/arp-bind
方法三:systemd 服务(推荐)
创建 /etc/systemd/system/arp-bind.service:
[Unit]Description=Static ARP bindings for gatewayAfter=network.target[Service]Type=oneshotExecStart=/usr/sbin/ip neigh add 192.168.1.100 lladdr 00:11:22:33:44:55 nud permanent dev eth0ExecStart=/usr/sbin/ip neigh add 192.168.1.101 lladdr 00:aa:bb:cc:dd:ee nud permanent dev eth0ExecStart=/usr/sbin/ip neigh add 192.168.1.102 lladdr 00:ff:11:22:33:44 nud permanent dev eth0RemainAfterExit=yes[Install]WantedBy=multi-user.target
systemctl enable arp-bind.servicesystemctl start arp-bind.service
✅ 完整方案(ARP 绑定 + iptables 双重保险)
| | |
| | 阻止 MAC 不对的主机完成 ARP 解析 → 无法通信 |
| | |
# 静态 ARP 绑定ip neigh add 192.168.1.100 lladdr 00:11:22:33:44:55 nud permanent dev eth0ip neigh add 192.168.1.101 lladdr 00:aa:bb:cc:dd:ee nud permanent dev eth0# iptables FORWARD 白名单(可选增强)iptables -P FORWARD DROPiptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPTiptables -A FORWARD -i eth0 -s 192.168.1.100 -m mac --mac-source 00:11:22:33:44:55 -j ACCEPTiptables -A FORWARD -i eth0 -s 192.168.1.100 -j DROPiptables -A FORWARD -i eth0 -s 192.168.1.101 -m mac --mac-source 00:aa:bb:cc:dd:ee -j ACCEPTiptables -A FORWARD -i eth0 -s 192.168.1.101 -j DROP
⚠️ 注意事项
| |
| 内网主机必须直接连接到这台 Linux 网关(中间可以是交换机,但不能有路由器/NAT) |
| 内网主机的默认网关必须设为 Linux 内网口 IP |
| |
| 只影响 Linux 网关自身 ARP 表,不影响内网其他主机之间的通信 |
| 如果攻击者同时改 IP 和 MAC 为一个已知合法组合,仍然可以通过(属于弱绑定) |