为什么监听ipv6地址可以处理ipv4连接

背景

netstat 查看监听的服务端口时,却只显示了 tcp6 的监控, 但是服务明明是可以通过 tcp4 的 ipv4 地址访问的,那为什么没有显示 tcp4 的监听呢?

  • 范例一:sshd
# netstat -lnp |grep -i sshd
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1305/sshd
tcp6       0      0 :::22                   :::*                    LISTEN      1305/sshd
  • 范例二:nginx
yum install -y nginx
nginx
# netstat -lnp | grep :80
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      5082/nginx: master
tcp6       0      0 :::80                   :::*                    LISTEN      5082/nginx: master
  • 范例三:httpd
yum install -y httpd
httpd
# netstat -lnp |grep -i httpd
tcp6       0      0 :::80                   :::*                    LISTEN      45950/httpd

关闭 ipv6 并且重启 httpd

# sysctl net.ipv6.conf.all.disable_ipv6=1
# systemctl restart httpd

看下 httpd 监听的地址:
netstat -tlnp | grep :80
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      33697/httpd

现在已经只监听到 ipv4 地址了。

源码查看

/* If we have the unspecified IPv4 address (0.0.0.0) and
 * the unspecified IPv6 address (::) is next, we need to
 * swap the order of these in the list. We always try to
 * bind to IPv6 first, then IPv4, since an IPv6 socket
 * might be able to receive IPv4 packets if V6ONLY is not
 * enabled, but never the other way around.
 * ... 省略 ...
 */

上面提到,ipv6 实际上是在当 V6ONLY 没有开启的时候,可以处理 ipv4 的请求的,反之不然;
V6ONLY 是在什么时候开启呢?

#if APR_HAVE_IPV6
#ifdef AP_ENABLE_V4_MAPPED
    int v6only_setting = 0;
#else
    int v6only_setting = 1;
#endif
#endif

现在,关键是看 AP_ENABLE_V4_MAPPED 是怎么定义的。
在 configure(注意,如果是直接通过代码数获取的,可能没有这个文件,而只有 configure.ac/in 文件)文件中, 可以找到:

 Check whether --enable-v4-mapped was given.
if test "${enable_v4_mapped+set}" = set; then :
  enableval=$enable_v4_mapped;
  v4mapped=$enableval
else
    case $host in
    *freebsd5*|*netbsd*|*openbsd*)
        v4mapped=no
        ;;
    *)
        v4mapped=yes
        ;;
    esac
    if ap_mpm_is_enabled winnt; then
                v4mapped=no
    fi
fi
if test $v4mapped = "yes" -a $ac_cv_define_APR_HAVE_IPV6 = "yes"; then

$as_echo "#define AP_ENABLE_V4_MAPPED 1" >>confdefs.h

以,在 Linux 中,默认情况下,AP_ENABLE_V4_MAPPED 是 1,那么 v6only_setting = 0, httpd 就会直接监听 ipv6,因为此时 ipv6 的 socket 能够处理 ipv4 的请求;另外,bind() 系统调用会对用户空间的进程透明处理 ipv6 没有开启的情况,此时会监听到 ipv4。

如果我们在编译 httpd 的时候使用 --disable-v4-mapped 参数禁止 ipv4 mapped,那么默认情况下, httpd 会分别监听在 ipv4 和 ipv6,而非只监听 ipv6,如下所示:

# netstat -tlnp | grep :80
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      40576/httpd
tcp6       0      0 :::80                   :::*                    LISTEN      40576/httpd

如果在 /etc/httpd/conf/httpd.conf 中将 Listen 设置为只监听 ipv6 地址,如下:

Listen :::80
那么,将可以看到 netstat 只显示 tcp6 的监听:
# systemctl restart httpd
# netstat -tlnp | grep :80
tcp6       0      0 :::80                   :::*                    LISTEN      40980/httpd

此时:你会发现现在不能通过 ipv4 地址访问 httpd 了。

系统级别:内核参数bindv6only

在这里插入图片描述
通过查看RFC2553获得了一些信息
RFC2553描述了IPv4映射地址和IPv6通配绑定套字的特殊行为。规格允许:
通过AF_INET6通配绑定套接字接受IPv4连接
使用特殊形式的地址 (如 ::ffff:10.1.1.1 ) 通过AF_INET6套接字传输IPv4数据包。
通过RFC2553规定的规则,linux默认(默认bindv6only=0)所有来自IPv4地址的访问转换为IPv6地址的格式从而处理来自于IPv4的连接

当bindv6only这个内核参数设置为0时,对所有来自于ipv4的请求都绑定到ipv6地址。简单说就是端口可以接收ipv4的包,也可以接收ipv6的包。当bindv6only这个内核参数设置为1时,对于来自ipv4的请求就打开多个端口进行监听和处理。Ipv4与ipv6所监听的端口是分开的。

echo 1 > /proc/sys/net/ipv6/bindv6only
  • 当bindv6only这个内核参数设置为0时
    对所有来自于ipv4的请求都绑定到ipv6地址。简单说就是端口可以接收ipv4的包,也可以接收ipv6的包。
  • 当bindv6only这个内核参数设置为1时
    对于来自ipv4的请求就打开多个端口进行监听和处理。Ipv4与ipv6所监听的端口是分开的。

进程级别:setsockopt

opt = 1;
setsockopt(s, IPPROTO_IPV6, IPV6_V6ONLY, (char *)&opt, sizeof(int))

设置socket参数项IPV6_V6ONLY,建立的socket监听就只会监听 ipv6地址的端口;

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Wing FTP Server 是一款专业的跨平台 FTP 服务器端, 支持可伸缩的处理器架构并采用异步IO处理, 所以在速度和效率方面领先于其他同类产品。当然他还非常稳定可靠, 在高负载的情况下也能持续地正常运行, 非常适合企业内部文件传输。除了基本功能外, 他还提供一个基于 Web 的管理端和客户端, 何时何地都能管理你的服务器。它还支持可编程的事件, 计划任务, Lua 脚本扩展, 虚拟文件夹, 上传下载比率分配, 磁盘容量分配, ODBC/Mysql 存储账户, 多国语言等特性。 强大的 FTP 服务器软件 Wing FTP Server 中文多语特别版强大的 FTP 服务器软件 Wing FTP Server 中文多语特别版 Wing FTP Server 主要特性 多种传输协议 支持 FTP, FTPS, SFTP 以及 HTTP/S的web客户端. 你可以使用免费的FTP Rush来进行FTP/SFTP文件传输 跨平台 可在 Windows, Linux, Mac OS X, Solaris等操作系统上运行. 基于web的管理端 只需要一个浏览器, 你便可在何时何地管理你的FTP服务器. iOS & Android App 我们在新版本中添加了Android/iOS的App, 便于手机用户传输文件. 可编程的事件管理器 事件触发时, 可执行Lua脚本, 发送电子邮件 或 执行第三方的应用程序. 负载均衡 & 高可用 可以使用Wing Gateway对WingFTP进行集群, 以满足高可用 (或者负载均衡) 的需求. Weblink & Upload link 方便地创建和分享文件共享链接(用于下载和上传), 让你的客户不用再登录客户端. 数据库存储 & LDAP验证 通过 XML文件,ODBC 或 MySQL数据库来存储大量的用户数据. 还可以用LDAP或活动目录来做用户验证. Wing FTP Server 安全特性 安全的文件传输 可以通过FTPS (基于SSL的FTP), SFTP (基于SSH的FTP) 以及 HTTPS 协议来安全地传输文件. FIPS 140-2 支持更加安全的FIPS 140-2 验证加密模块(证书编号:1747). Anti-Hammering 可以有效地防止黑客的密码猜测, 保护你的服务器. 访问IP限制 你可以添加IP访问规则来屏蔽来自某些IP地址连接. 账户过期时间 可以设置帐号的自动过期时间, 让一些老的账号不再有效. SFV校验 服务器端的快速SFV文件校验来保证文件的完整性. Wing FTP Server 其他特性 基于web的客户端 只需要一个浏览器, 便可何时何地上传或下载你的文件. 支持多个域 相当于在一个IP地址上运行多台虚拟服务器. 磁盘配额及比例 每个用户都可以分配到独立的磁盘空间, 上传/下载比例, 以及网络带宽. 可编程的计划任务 使用Lua脚本来完成你的计划任务. Lua API 提供了丰富的API供Lua脚本调用. 支持IPv6 可以像添加IPv4监听器一样添加IPv6监听器. 虚拟目录 可以映射虚拟目录到物理路径, 当然你可以使用Windows下的UNC资源. 审计报告 所有的客户端操作将被保存到审计数据库, 可以用作实时分析和生成报告. 多种语言 目前支持14种语言 – English, Français, Deutsch, Italiano, Türkçe, Český, Română, Nederlands, Português, Español, 简体中文, 繁體中文, 日本語, 한국어.
Flask是一种流行的Python Web开发框架,用于构建Web应用程序。IPv6IPv4分别是互联网协议的第六版和第四版,用于在网络中唯一标识和定位设备。那么如何在Flask中同时支持IPv6IPv4呢? 首先,Flask框架本身对于使用的IP版本是没有限制的,它可以处理IPv6IPv4的请求。Flask通过Werkzeug库来处理网络请求,而Werkzeug的HTTP请求对象(request)中包含了关于客户端的IP信息。 当客户端需要与Flask应用程序建立连接时,Flask会获取请求对象中的IP地址信息。对于支持IPv6的客户端,Flask可以直接处理IPv6格式的请求。对于只支持IPv4的客户端,IPv4地址会转换为IPv6格式后再进行处理。 另外,如果你的服务器同时拥有IPv6IPv4地址,你可以在Flask应用程序的启动过程中,绑定两个地址同时监听请求。这样,无论是IPv6请求还是IPv4请求,Flask都可以接受并处理。 使用Flask支持IPv6IPv4,你还需要注意一些其他的因素: 1. DNS解析:确保你的域名可以同时解析为IPv6IPv4地址,以便客户端可以根据自身的支持情况选择合适的IP版本。 2. IP过滤:在处理来自客户端的请求时,你可能需要注意IP过滤和防火墙设置,以确保能够正常处理IPv6IPv4的请求。 3. 应用逻辑:根据业务需求,你可能需要对IPv6IPv4请求做一些特殊处理,比如不同的路由规则、身份验证等。 总之,Flask框架本身支持同时处理IPv6IPv4请求。你只需要确保服务器拥有IPv6IPv4地址,并进行适当的配置,就可以在Flask应用程序中实现IPv6IPv4的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值