chrislamp Asked: 2021-06-06 06:32:54 +0800 CST2021-06-06 06:32:54 +0800 CST 2021-06-06 06:32:54 +0800 CST IPv4 端口是否与 IPv6 端口分开? 772 主机是否可以为 IPv4 和 IPv6 堆栈提供不同的开放端口?例如,是否可以只为 IPv6 而不是为 IPv4 打开端口 22,反之亦然?此外,当我尝试仅为 IPv6 阻止端口时,它没有任何效果: ip6tables -A INPUT -p tcp --dport 22 -j REJECT ipv6 iptables 5 个回答 Voted Best Answer LPChip 2021-06-06T07:24:36+08:002021-06-06T07:24:36+08:00 当然是。事实上,在同一 IPv6 地址上,TCP 上的端口与 UDP 上的同一端口之间甚至存在差异,这也是您指定的原因-p tcp。 IPv4 是与 IPv6 不同的机制,它们具有单独的接口,具有单独的 IP 地址和单独的端口。事实上,您不能使用 IPv6 连接到 IPv4 地址,除非您在中间有某种中介来为您做这件事。但是这样的中介会简单地接受 IPv4,然后将该连接桥接到新的 IPv6。 如果您有 2 个网卡,它们都具有不同的 IP 地址,情况也是如此。然后,您还必须指定正确的 IP 地址。 但这基本上都归结为:你有一个托管服务器的程序,查看它的配置它打开了哪些端口,并根据它的 ipv4、ipv6 和 tcp 或 udp 中的一个或两个上的端口使用情况进行阻止。 Roman Odaisky 2021-06-06T16:03:58+08:002021-06-06T16:03:58+08:00 是的,它们是完全分开的。在 POSIX 中,您使用 socket(2) 系统调用创建套接字,并将 AF_INET 或 AF_INET6 传递给它以分别在 IPv4 和 IPv6 之间进行选择。这样的套接字可以使用相同的端口号而不会受到任何干扰。 但是,Linux 具有这样的功能,即在某个端口上侦听的 IPv6 套接字也将获得 IPv4 流量,其源地址映射到 IPv6 地址。这可以通过设置IPV6_V6ONLY来关闭。 Rodney 2021-06-07T01:49:33+08:002021-06-07T01:49:33+08:00 简而言之 是的 请注意,应用程序不必同时绑定到 IPv4 和 IPv6,因此即使没有 IP 表,您也可以这样做。 查看 sshd 配置或其他应用程序中的 ListenAddress 指令。 并不是说您想这样做,但完全有可能让 ssh 服务器监听 TCP/IP6 端口 22,而 Web 服务器监听 TCP/IP4 端口 22。 iptables并ip6tables单独配置。 请注意,正如评论中所指出的,IP 本身没有端口,但一些最常用的传输协议(TCP 和 UDP)确实有端口。这就是为什么iptables需要类似的东西-p tcp才能按端口过滤,否则port毫无意义。 DannyNiu 2021-06-08T17:26:04+08:002021-06-08T17:26:04+08:00 我想从技术角度回答。 IPv4 端口是否与 IPv6 端口分开? 端口的概念位于“传输层”,而 IP 协议位于“互联网层”。由于 IP 地址是独立的(对于大多数部分,请参见下文),因此端口也自然是独立的。 但是,应该注意的是,为了便于从 IPv4 迁移到 IPv6,IPv6 地址空间中的一些地址被映射到 IPv4。这意味着当某些 IPv4 套接字被占用时,它们的 IPv6 对应部分也可能变得不可用。细节取决于特定的操作系统实现。 Paul Draper 2021-06-09T14:34:46+08:002021-06-09T14:34:46+08:00 首先, IPv4 和 IPv6 没有“端口”。 端口是 TCP 和 UDP 传输协议添加的概念。 其次, TCP/UDP 地址对于 IPv4 和 IPv6 是分开的,因为地址是 ip_address:port 组合。127.0.0.1:8000 与 ::1:8000 是不同的地址。两个不同的程序可以在这两个不同的地址上进行通信。 第三,您需要使用ip6tables来影响 IPv6 流量。
当然是。事实上,在同一 IPv6 地址上,TCP 上的端口与 UDP 上的同一端口之间甚至存在差异,这也是您指定的原因
-p tcp
。IPv4 是与 IPv6 不同的机制,它们具有单独的接口,具有单独的 IP 地址和单独的端口。事实上,您不能使用 IPv6 连接到 IPv4 地址,除非您在中间有某种中介来为您做这件事。但是这样的中介会简单地接受 IPv4,然后将该连接桥接到新的 IPv6。
如果您有 2 个网卡,它们都具有不同的 IP 地址,情况也是如此。然后,您还必须指定正确的 IP 地址。
但这基本上都归结为:你有一个托管服务器的程序,查看它的配置它打开了哪些端口,并根据它的 ipv4、ipv6 和 tcp 或 udp 中的一个或两个上的端口使用情况进行阻止。
是的,它们是完全分开的。在 POSIX 中,您使用 socket(2) 系统调用创建套接字,并将 AF_INET 或 AF_INET6 传递给它以分别在 IPv4 和 IPv6 之间进行选择。这样的套接字可以使用相同的端口号而不会受到任何干扰。
但是,Linux 具有这样的功能,即在某个端口上侦听的 IPv6 套接字也将获得 IPv4 流量,其源地址映射到 IPv6 地址。这可以通过设置IPV6_V6ONLY来关闭。
简而言之
是的
请注意,应用程序不必同时绑定到 IPv4 和 IPv6,因此即使没有 IP 表,您也可以这样做。
查看 sshd 配置或其他应用程序中的 ListenAddress 指令。
并不是说您想这样做,但完全有可能让 ssh 服务器监听 TCP/IP6 端口 22,而 Web 服务器监听 TCP/IP4 端口 22。
iptables
并ip6tables
单独配置。请注意,正如评论中所指出的,IP 本身没有端口,但一些最常用的传输协议(TCP 和 UDP)确实有端口。这就是为什么
iptables
需要类似的东西-p tcp
才能按端口过滤,否则port
毫无意义。我想从技术角度回答。
端口的概念位于“传输层”,而 IP 协议位于“互联网层”。由于 IP 地址是独立的(对于大多数部分,请参见下文),因此端口也自然是独立的。
但是,应该注意的是,为了便于从 IPv4 迁移到 IPv6,IPv6 地址空间中的一些地址被映射到 IPv4。这意味着当某些 IPv4 套接字被占用时,它们的 IPv6 对应部分也可能变得不可用。细节取决于特定的操作系统实现。
首先, IPv4 和 IPv6 没有“端口”。
端口是 TCP 和 UDP 传输协议添加的概念。
其次, TCP/UDP 地址对于 IPv4 和 IPv6 是分开的,因为地址是 ip_address:port 组合。127.0.0.1:8000 与 ::1:8000 是不同的地址。两个不同的程序可以在这两个不同的地址上进行通信。
第三,您需要使用
ip6tables
来影响 IPv6 流量。