我有一台 PC(运行 Fedora 20),它被用作“软件交换机”,用于控制某些外部设备的网络连接。有八个这样的设备;这台 PC 除了有自己的以太网连接外,还有两个 4 端口以太网卡。默认情况下,八个设备接口会转发到外部接口,不会进行任何过滤。
所需的功能是能够阻止往返于给定设备的所有流量。目前,我们使用 来实现这一点bridge link set dev <device> state 0
,它将设备的桥接状态设置为“禁用”。但是,这似乎也会阻止来自设备的 DHCP 流量。网络的 DHCP 服务器可通过外部接口访问,因此看起来桥接器正在阻止此流量,这意味着如果设备尝试更新其 IP,则会失败;就我尝试在设备上执行的测试而言,这是有问题的。
我想做的是阻止所有流量除 DHCP 外对于给定的设备,跨桥接。似乎命令bridge
无法做到这一点,所以我可能希望将桥接状态永久保留为“转发”。经过一些研究,它似乎ebtables
是我需要的工具,但配置它似乎需要比我更多的 DHCP 和网络知识!通过阅读一些ebtables
教程,我认为我需要允许端口 67 和 68 上的流量(我相信这些是用于 DHCP 的唯一端口?)并阻止所有其他流量。
我的问题是:
- 是否可以配置
ebtables
来做我想要的事情? - 这是
ebtables
完成这项工作的最佳工具吗?和/或它之上是否有任何抽象层可以使其更容易配置?(我正在考虑ferm
。iptables
) - 假设我朝着正确的方向前进,我该如何配置
ebtables
以阻止所有 DHCP 流量?
答案1
是的,您需要 ebtables 在桥上应用 netfilter 规则。
匹配规则ip
带有参数--ip-source-port
和--ip-destination-port
。
您可以配置 ebtables 来允许您想要的流量,然后明确丢弃任何其他流量。
DHCP 客户端端口为 UDP 68,DHCP 服务器端口为 UDP 67。
我认为正确的命令语法和顺序是:
ebtables -I INPUT -i eth0 -o eth0 -p ip -j DROP
ebtables -I INPUT -i eth0 -o eth0 -p ip --ip-protocol udp --ip-source-port 67 -j ACCEPT
ebtables -I INPUT -i eth0 -o eth0 -p ip --ip-protocol udp --ip-source-port 68 -j ACCEPT
ebtables -I INPUT -i eth0 -o eth0 -p ip --ip-protocol udp --ip-destination-port 67 -j ACCEPT
ebtables -I INPUT -i eth0 -o eth0 -p ip --ip-protocol udp --ip-destination-port 68 -j ACCEPT
ebtables-save