我有两台装有嵌入式 Linux 的设备。其中一台(机器 A)有两个网络接口:eth 用于将机器连接在一起,wlan 接口用于通过 WiFi 连接到路由器。第二台机器(B)只有一个 eth 接口。我的目标是在机器 B 上启用对 WiFi 网络的访问。我使用了一些 iptables 规则来过滤从机器 A 到机器 B 的数据包,并且成功了。现在,我需要在第一台机器上阻止 dhcp 流量,以使其不会到达第二台机器。我正在寻找一些 iptables 规则来执行此操作,但我发现使用 iptables 无法做到这一点。还有其他方法可以阻止该流量吗?
预先感谢您的任何帮助。
答案1
我相信这或多或少就是您所设想的设置。A 连接到 WiFi,并获取 IP 地址。B 通过以太网连接到 A,并拥有自己的(私有 RFC1918)IP。
您希望 B 能够访问 WiFi 上的设备。
现在,A 使用 DHCP 在 WiFi 接口上获取 IP。但它不会将 DHCP 转发到不同的接口,除非您运行 DHCP 代理。此外,WLAN 客户端通常不能代表多个 MAC 地址,因此您必须以某种方式为 A 分配一个额外的 IP - 或者让 A 在 WiFi 上代表 B 的流量。
这简单的实现此目的的方法是让 A 对来自以太网的流量进行 NAT,并将其转发到 wifi。这就是您的家用路由器所做的,它将允许 B 通过 WiFi 与设备(和互联网)通信。该网络上的设备会认为流量来自 A,因为它们根本看不到 B。
有关如何进行 NAT,请参见这个问题。
您不应尝试克隆地址或任何类似的愚蠢想法。IP 应该是唯一的。
答案2
可以使用iptables
-的后继来阻止 DHCP 流量。但仅限于需要提及完整接口名称(并且该接口必须存在)的nftables
低级表。该表中的主要链是(交换机中使用的输入的奇怪名称)和(输出)netdev filter
ingress
egress
一些测试:
table netdev filter
delete table netdev filter
table netdev filter {
set We_ask_for_DHCP_server {
typeof iifname
timeout 10s
flags dynamic
}
set We_just_get_answer_from_DHCP_server {
typeof iifname
timeout 10s
flags dynamic
}
chain Log_drop_unknown_DHCP_client_searching_for_server {
limit rate 30/minute burst 10 packets log prefix "[nft.netdev.input.dhcp-not-from-us]: " flags all
counter drop
}
chain Check_if_DHCP_answer_was_asked {
iifname == @We_ask_for_DHCP_server counter jump We_get_answer_from_DHCP_server comment "This is this PC receiving answer from a server"
limit rate 30/minute burst 10 packets log prefix "[nft.netdev.input.dhcp-not-asked]: " flags all comment "Possibly second rogue DHCP server present"
counter drop
}
chain We_asked_DHCP_server {
delete @We_just_get_answer_from_DHCP_server { oifname }
update @We_ask_for_DHCP_server { oifname }
limit rate 30/minute burst 10 packets log prefix "[nft.netdev.output.dhcp]: " flags all
counter accept comment "This is this PC asking for a server"
}
chain We_get_answer_from_DHCP_server {
update @We_just_get_answer_from_DHCP_server { iifname }
delete @We_ask_for_DHCP_server { iifname }
limit rate 30/minute burst 10 packets log prefix "[nft.netdev.input.dhcp]: " flags all
accept
}
chain ingress {
type filter hook ingress devices = { "enp110s0", "wlo1" } priority -500; policy drop;
udp sport == 68 udp dport == 67 counter jump Log_drop_unknown_DHCP_client_searching_for_server comment "This is some client asking for a server"
udp sport == 67 udp dport == 68 counter jump Check_if_DHCP_answer_was_asked
counter accept
}
chain egress {
type filter hook egress devices = { "enp110s0", "wlo1" } priority -500; policy drop;
udp sport == 68 udp dport == 67 counter jump We_asked_DHCP_server
counter accept
}
}
注意:一些 DHCP 服务器和客户端可能支持编译时切换以使用常规套接字而不是原始套接字 - 从而能够使用 iptables 或非 netdev nftables。