对于提供服务的程序,一般而言喜欢使用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参数。
分享到:
相关推荐
这是将linux下的openvpn移植到windows下,可以在windows下实现基于ssl vpn功能.zip
python库。 资源全名:openvpn_status-0.1.1-py2.py3-none-any.whl
Use this to get a proxy on kali
openvpn基础知识-详细笔记文档总结
OpenVpn TAP驱动程序池溢出 信用 )电报用户名: : 此漏洞已报告给OpenVpn。 成功利用此漏洞可以帮助攻击者绕过Windows中的驱动程序唱歌强制执行和加载未签名的恶意驱动程序。 OpenVpn Tap驱动程序使用...
基于linux的+openvpn网络.pdf
简单管理openvpn3
openvpn3-arch-package
这些是相同的简单脚本...一个用于启动/停止/切换特定隧道即服务(初始化脚本)。 第二个是建立或断开隧道时调用的脚本(上/下脚本)。 还提供了pyQt GUI界面。
认证中心(CA) 权限是项目中最安全的部分。 这些设置控制和保护根CA证书。 理想情况下,授权机构应托管在与中间CA分开的计算机和网络上。 目的 创建自签名的根证书颁发机构证书 签署来自中间证书颁发机构的请求 ...
openvpn-debian Ubuntu 的 openvpn debian 包的分支,更新到最新的 openvpn 版本
网络系统管理赛项软件包(服务模块软件包、普通PC软件包、无线地勘系统等)
与原版open-build-master相比,我做了稍稍修改,已经包含Open虚拟专网2.5源代码和依赖项源代码,需要VS2019、ActivePerl、WDK10,可以直接按照我写的教程进行编译,100%可编译。
一个基于DELPHI的远程屏幕传输(差异截图)
Book Description Angular 2 introduces an entirely new paradigm of applications. It wholly embraces all the newest concepts that are built into the next generation of browsers, and it cuts away all the...
它是 OpenVPN 开源 VPN 解决方案的一个组件。 什么是虚拟 Tap 设备? 虚拟分路设备是一种软件接口,其行为类似于物理网络适配器。它允许软件应用程序与同一网络上的其他设备进行通信,通常用于 VPN 解决方案。 我...
交叉编译器3.4.5,下载解压,按照交叉编译器安装过程安装。
win10mi版+Linux CentOS-7+苹果系统驱动加满的无敌合集
根据本人运维经验,结合openVPN社区相关案例,针对TAP-Windows-adapter安装失败“an error occured installing the TAP device driver”错误提示,提出五种解决方案
Angular 2 Cookbook Angular 2 Cookbook Angular 2 Cookbook