OpenVPN遇到的Secondary地址问题
来源:互联网 发布:ntfs for mac怎么卸载 编辑:程序博客网 时间:2024/06/06 07:44
对于提供服务的程序,一般而言喜欢使用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参数。
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参数。
- OpenVPN遇到的Secondary地址问题
- openvpn/git在win10上容易遇到的问题
- 遇到的地址越界问题
- OpenVPN的效率问题
- OpenVPN中虚拟ip地址的分配
- 微信中遇到无法获取地址的问题
- 遇到的一些OpenVPN连接不上的常见问题
- OpenVPN碰到Windows-一些问题的解决
- OpenVPN碰到Windows-一些问题的解决
- OpenVPN中TAP-win32d的net30问题
- OpenVPN莫名其妙断线的问题及其解决
- Secondary NameNode的作用
- 使用TortoiseSVN连svn+ssh的地址遇到的问题
- OpenVPN中虚拟ip地址的自定义分配
- OpenVPN 中虚拟ip地址的自定义分配--总结
- 树莓派设置静态IP地址遇到的问题
- 三级联动地址选择器,遇到的问题记录
- php 取地址&符号使用遇到的一个问题
- 用简单的驱动,自己写一个连接池
- ubuntu 如何让桌面显示“我的电脑”及去掉桌面上的“磁盘图标”
- 环境搭建
- TCP/IP协议详解
- linux之无名管道pipe
- OpenVPN遇到的Secondary地址问题
- 3G网络下TCP性能差的解释
- Shell 中位运算符的应用(特别举例按位非)
- websphere启动时初始化报错解决方法
- Java性能的优化
- 一道理解c#中对象(引用类型)相互赋值和方法覆盖(overriding)的题目
- 之后的打算
- jquery控制换行
- Android开发笔记之一 Hello World