热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

OpenVPN遇到的Secondary地址问题

对于提供服务的程序,一般而言喜欢使用0.0.0.0这个地址,但是如果这个服务是UDP的,那么就有可能出现一些问题,比如如果某块网卡配置了多个IP地址,那么问题就可能重现。最近使用OpenVPN的时候就遇到了这样的问题。OpenVPN建议使用UDP协议,然而正是由于使用

对于提供服务的程序,一般而言喜欢使用0.0.0.0这个地址,但是如果这个服务是UDP的,那么就有可能出现一些问题,比如如果某块网卡配置了多个IP地址,那么问题就可能重现。最近使用OpenVPN的时候就遇到了这样的问题。OpenVPN建议使用UDP协议,然而正是由于使用了UDP协议才出现了问题。以下几个要点帮助解决这样的问题,记之备忘:

1.udp服务没有bind到特定地址,而是0.0.0.0

2.没有bind地址的udp服务的返回包在路由后添加源地址

3.对于没有bind到特定地址的udp服务器的返回包,内核协议栈在路由后为其添加符合条件的网卡上的第一个最匹配的primary(非secondary)地址

4.Linux的Netfilter的OUTPUT挂接在路由后,并且1中所述的服务器的第一个返回包在此HOOK处初始化NAT使用的nf_conntrack数据结构(后面说原因)

5.udp客户端连接udp服务器的secondary地址,该连接包在进入udp服务器的PREROUTING这个HOOK的时候会初始化一个nf_conntrack(忽略port):

5.1    client address/server secondary address<->server secondary address/client address

6.udp服务器的返回包的源IP由于3,并没有被初始化成secondary address,因此在经过OUTPUT这个HOOK点时,由于没有找到既有的conntrack,又初始化了一条新的contrack:

6.1    server primary address/client address<->client address/server primay address

7.紧接着进入SNAT的规则链去匹配,匹配到了不该匹配到的条目,该条目本应该作用于主动外出的数据包的,对于进入的数据包,理应在PREROUTING的时候就已经匹配过了。

8.因此需要添加一条规则,将udp客户端连接的secondary地址定向到primary地址:

iptables -t nat -A PREROUTING [一系列的udp匹配条件] -i eth3 -j DNAT --to-destination $primary_address

该条规则使得udp客户端的连接包在PREROUTING这个点上就能初始化nf_conntrack数据结构

9.unique_tuple回调函数中一般都有以下的一句话:

if (maniptype == IP_NAT_MANIP_DST)

return 0;

也就是说,对于DNAT来讲,不改变端口,而对于SNAT来讲,需要根据内核协议栈的一系列算法来重新选择一个源端口,该算法恨是简单,就是只要选择了端口后的一个tuple与其它的tuple不冲突即可,因此对于本例而言,由于目的端口大于1024,因此从1024开始选择,1024就没有被6.1这样的tunple使用,那么就是它了。

因此,千万不能将SNAT用作修改服务返回包,因此理论上,服务是被动连接的,在返回包发出之前,客户端的连接包早已该将nf_conntrack建立好才对,如果非要如此错误使用的话,得到的结果很可能就是服务器返回包的源端口被修改掉(UDP情况),好在OpenVPN还可以在客户端用float参数。


推荐阅读
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • UDP千兆以太网FPGA_verilog实现(四、代码前期准备UDP和IP协议构建)
    UDP:userDatagramprotocol用户数据报协议无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IETFRFC76 ... [详细]
  • 学习SLAM的女生,很酷
    本文介绍了学习SLAM的女生的故事,她们选择SLAM作为研究方向,面临各种学习挑战,但坚持不懈,最终获得成功。文章鼓励未来想走科研道路的女生勇敢追求自己的梦想,同时提到了一位正在英国攻读硕士学位的女生与SLAM结缘的经历。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 本文介绍了在Hibernate配置lazy=false时无法加载数据的问题,通过采用OpenSessionInView模式和修改数据库服务器版本解决了该问题。详细描述了问题的出现和解决过程,包括运行环境和数据库的配置信息。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 本文介绍了如何使用iptables添加非对称的NAT规则段,以实现内网穿透和端口转发的功能。通过查阅相关文章,得出了解决方案,即当匹配的端口在映射端口的区间内时,可以成功进行端口转发。详细的操作步骤和命令示例也在文章中给出。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • 概述H.323是由ITU制定的通信控制协议,用于在分组交换网中提供多媒体业务。呼叫控制是其中的重要组成部分,它可用来建立点到点的媒体会话和多点间媒体会议 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了VoLTE端到端业务详解|VoLTE用户注册流程相关的知识,希望对你有一定的参考价值。书籍来源:艾怀丽 ... [详细]
  • SQL Server 2008 到底需要使用哪些端口?
    SQLServer2008到底需要使用哪些端口?-下面就来介绍下SQLServer2008中使用的端口有哪些:  首先,最常用最常见的就是1433端口。这个是数据库引擎的端口,如果 ... [详细]
author-avatar
WingKeii-
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有