shell脚本通过ebtables限制端口访问

使用ebtables和iptables禁止无线端口通过ipv4和ipv6访问设备gui,v4生效而v6不生效

引用chatgpt部分指引作答:

根据您提供的信息,您似乎想要限制设备的GUI访问,使得无线端口不能通过IPv4和IPv6访问设备的GUI。您通过使用ebtables和iptables设置了一个名为“device_web_block”的桥接链,其中的规则是:

对于IPv4,如果流量是TCP且目标端口为80或443,则将标记设置为0x50并将目标转到CONTINUE。
对于IPv6,如果流量是TCP且目标端口为80或443,则将标记设置为0x50并将目标转到CONTINUE。
如果标记匹配0x50,则阻止所有输入流量。
这个规则看起来是正确的,但是IPv6的规则可能无法生效。原因是在IPv6中,ebtables的过滤器仅限于MAC地址、以太类型和vlan id等,而不能匹配IPv6头部信息,因此无法像IPv4那样过滤IPv6流量。因此,如果您想要限制IPv6访问,可以考虑使用ip6tables等其他工具

也有可能设备未开启IPv6协议栈,或者未正确配置IPv6防火墙规则。

具体的脚本配置如下:

# 创建一个名为device_web_block的bridge chain,设置策略为ACCEPT
ebtables -N device_web_block -P ACCEPT

# 在IPv4协议上禁止访问设备的80端口和443端口,并将其标记为0x50
ebtables -A device_web_block -p IPv4 -i ra1 --ip-proto tcp --ip-dport 80 -j mark --mark-set 0x50 --mark-target CONTINUE
ebtables -A device_web_block -p IPv4 -i ra1 --ip-proto tcp --ip-dport 443 -j mark --mark-set 0x50 --mark-target CONTINUE

# 在IPv6协议上禁止访问设备的80端口和443端口,并将其标记为0x50
ebtables -A device_web_block -p IPv6 -i ra1 --ip6-proto tcp --ip6-dport 80 -j mark --mark-set 0x50 --mark-target CONTINUE
ebtables -A device_web_block -p IPv6 -i ra1 --ip6-proto tcp --ip6-dport 443 -j mark --mark-set 0x50 --mark-target CONTINUE

# 创建一个名为input_lan_rule的iptables链
iptables -N input_lan_rule

# 如果流量标记为0x50,则在input_lan_rule链上DROP该流量
iptables -A input_lan_rule -m mark --mark 0x50 -j DROP

# 在INPUT链上调用input_lan_rule链
iptables -A INPUT -j input_lan_rule

您可以使用ip6tables命令来设置IPv6防火墙规则。

  • 这篇博客: linux ebtable iptable 用法中的 6.1 iptables想要使用网桥目的端口 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 为了使这成为可能,必须在网桥代码决定帧需要发送的位置(eth0,eth1或两者)之后,才能遍历iptables链。这对第3部分提出的方案有一定影响(所以我们在这里查看路由过程,从桥某一端口进入box)。它实际上看起来像这样(在图3c的情况下)
    Figure6a 路由时遍历链的过程(桥和netfilter代码已经编译到了内核中)

    注意此图和图3c的区别,iptables的NAT POSTROUTING被移动到了最后面,晚于ebtables的各个链。
    所有的链是在bridge代码中被遍历的。这都是br-nf代码做的工作。显然这并不意味着被路由的IP数据包不会进入IP代码。而是他们在IP代码中时不会经过iptables的链而已。

    这个做法是如何实现的呢,有待看内核源码分析。

    6.2 IP DNAT作用于本地生成的数据包(因此在 iptables nat OUTPUT链中)
    本地生成的数据包的通常将通过的链是这样的:
    Figure6c

    这里iptables的nat POSTROUTING之所又在前面了,原因应该不考虑br-nf代码

    从6.1中我们知道实际情况应该是这样的(因为br-nf代码)
    Figure6d:

    请注意,当数据包在IP代码中时,iptables nat OUTPUT链被遍历,并且当数据包通过桥接决定时,iptables的filter OUTPUT链被遍历。这使得可以对另外的设备在nat OUTPUT链执行DNAT,并让我们在filter OUTPUT链中使用网桥端口作为现在。

    这一句“This makes it possible to do DNAT to another device in the nat OUTPUT chain”,应意思是说在nat OUTPUT链执行完DNAT后,数据包可能会用另一个设备(网口)将此帧发送出去。不知道这么理解是不是对的:)