项目

通用

个人资料

操作

IPv6 配置

背景

默认情况下,如果未设置 server.bindserver.port,lighttpd 会在 80 端口(“0.0.0.0:80”)监听 IPv4 通配符地址(INADDR_ANY)。要更改默认端口,请设置 server.port

总结:在单独的行中明确指定 IPv4 和 IPv6 地址(或通配符) (参见下面的“推荐的 IPv6 设置”)

对于 IPv6 通配符“::”(in6addr_any)和 IPv4 映射的 IPv6 地址(例如“::ffff:127.0.0.1”),有一个名为 IPV6_V6ONLY 的 IPPROTO_IPV6 内核套接字选项,它会使套接字仅绑定到 IPv6 地址,而不绑定到等效的 IPv4 地址。如果对于 AF_INET6 (IPv6) 地址族,此套接字选项不存在,那么套接字是否仅绑定到 IPv6 地址取决于内核的默认配置。换句话说,在某些系统上,无论 lighttpd 是否设置了 IPV6_V6ONLY,IPv6 套接字都将强制使用 IPV6_V6ONLY。这些系统包括现代 Debian Linux、FreeBSD、Mac OS X 以及其他可能的默认配置。在这些系统上,两条单独的套接字指令才能让 lighttpd 同时监听 IPv4 和 IPv6 地址,例如 0.0.0.0 和 [::]。 (参见下面的“推荐的 IPv6 设置”)

推荐的 IPv6 设置

(适用于 lighttpd 1.4.27 或更高版本,或 Linux 操作系统 sysctl net.ipv6.bindv6only = 1,或其他等效操作系统)
在服务器上监听所有 TCP 地址

# listen to IPv4
server.bind = "0.0.0.0" 
server.port = "80" 

# listen to IPv6
$SERVER["socket"] == "[::]:80" {  }

# SSL/TLS
$SERVER["socket"] == "0.0.0.0:443" { ssl.engine = "enable" }
$SERVER["socket"] ==    "[::]:443" { ssl.engine = "enable" }
# SSL/TLS options shared among $SERVER["socket"] with ssl.engine = "enable" 
#<shared ssl.* options>

仅针对通配符地址上的 HTTPS 并在 443 端口监听

server.bind = "0.0.0.0"                                       # (default; implied)
server.port = "443" 
$SERVER["socket"] == "0.0.0.0:443" { ssl.engine = "enable" }  # (redundant with default)
$SERVER["socket"] ==    "[::]:443" { ssl.engine = "enable" }
# SSL/TLS options shared among $SERVER["socket"] with ssl.engine = "enable" 
#<shared ssl.* options>
ssl.engine = "enable" 

监听“真实”IPv6 地址

示例 (IPv6 本地主机 [::1])

  • server.bind = "[::1]"
  • $SERVER["socket"] == "[::1]:80" { ... }

这些配置没有问题 - 它们在任何情况下都只监听 IPv6。

监听未指定地址(通配符)

示例 (通配符地址)
  • 完全不设置 server.bind,但在全局上下文中使用 server.use-ipv6 = "enable"
  • $SERVER["socket"] == ":80" { server.use-ipv6 = "enable" ... }

这些配置监听 IPv6 的“任意”地址;根据您的系统,这可能也会接受 IPv4 连接(Linux 上的默认设置,除非您的发行版禁用了它;请检查 sysctl net.ipv6.bindv6only)。
因此,如果内核默认设置发生变化,此类配置可能随时失效。

监听 [::]

如果您使用 1.4.27+ 版本或 Linux 系统 sysctl net.ipv6.bindv6only = 1,则这将仅监听 IPv6。否则,它将同时监听 IPv6 和 IPv4。

示例 (通配符地址)
  • server.bind = "[::]"
  • $SERVER["socket"] == "[::]:80" { ... }

1.4.27 版本中的变更

自 1.4.27 版本起,lighttpd 将为非空主机名的 IPv6 套接字设置“V6_ONLY”选项;也就是说,这两个仍然会像以前一样使用系统默认的 V6_ONLY 设置
server.bind = ""
server.use-ipv6 = "enable"
$SERVER["socket"] == ":443" { server.use-ipv6 = "enable" }

但对于这些情况,自 1.4.27 版本起(或者如果 sysctl net.ipv6.bindv6only 为 1),lighttpd 将仅监听 IPv6。
server.bind = "[::]"
server.bind = "localhost"
server.use-ipv6 = "enable"
$SERVER["socket"] "[::]:443" { }
$SERVER["socket"] "localhost:443" { server.use-ipv6 = "enable" }

如果您在相关代码块中设置 server.set-v6only = "disable",则可以恢复旧行为。不建议将此选项作为长期解决方案,因为我们可能会在几个版本后再次将其删除。

更新者 gstrauss 近 4 年前 · 12 次修订