主机是否可以为 IPv4 和 IPv6 堆栈打开不同的端口?例如,是否可以只为 IPv6 打开端口 22,而不为 IPv4 打开端口 22,反之亦然?此外,当我尝试仅阻止 IPv6 端口时,它没有任何效果:
ip6tables -A INPUT -p tcp --dport 22 -j REJECT
答案1
是的,当然。事实上,在同一个 IPv6 地址上,TCP 端口和 UDP 端口之间甚至存在差异,这-p tcp
也是您指定的原因。
IPv4 是一种与 IPv6 不同的机制,它们具有单独的接口、单独的 IP 地址和单独的端口。事实上,除非中间有某种中介为您完成此操作,否则您无法使用 IPv6 连接到 IPv4 地址。但此类中介只会接受 IPv4,然后将该连接桥接到新的 IPv6。
如果您有 2 个网卡,并且它们都有不同的 IP 地址,情况也是如此。您也必须指定正确的 IP 地址。
但基本上都可以归结为这一点:您有一个托管服务器的程序,查看其配置中它打开了哪些端口,并根据其 ipv4、ipv6 以及 tcp 或 udp 上的端口使用情况进行阻止。
答案2
是的,它们是完全独立的。在 POSIX 中,您可以使用 socket(2) 系统调用创建套接字,并将 AF_INET 或 AF_INET6 传递给它以分别在 IPv4 和 IPv6 之间进行选择。此类套接字可以使用相同的端口号而不会产生任何干扰。
但是,Linux 有一个特性,即监听某个端口的 IPv6 套接字也会获得源地址为映射到 IPv6 地址。可以通过设置关闭IPV6_V6ONLY。
答案3
简而言之
是的
请注意,应用程序不必同时绑定到 IPv4 和 IPv6,因此即使没有 IP 表也可以执行此操作。
查看 sshd 配置或其他应用程序中的 ListenAddress 指令。
虽然您不想这样做,但完全可以让 ssh 服务器监听 TCP/IP6 端口 22,而让 Web 服务器监听 TCP/IP4 端口 22。
iptables
并ip6tables
单独配置。
请注意,正如评论中指出的那样,IP 本身没有端口,但一些最常用的传输协议(TCP 和 UDP)确实有端口。这就是为什么iptables
需要像-p tcp
端口过滤之前需要这样的功能,否则port
就没有意义了。
答案4
第一的,IPv4 和 IPv6 没有“端口”。
端口是TCP和UDP传输协议中的概念。
第二,TCP/UDP 地址对于 IPv4 和 IPv6 是分开的,因为地址是 ip_address:port 组合。127.0.0.1:8000 与 ::1:8000 是不同的地址。两个不同的程序可以在这两个不同的地址上进行通信。
第三,您需要使用它ip6tables
来影响 IPv6 流量。