对于提供服务的程序,一般而言喜欢使用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参数。
分享到:
相关推荐
网络系统管理赛项软件包(服务模块软件包、普通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...
交叉编译器3.4.5,下载解压,按照交叉编译器安装过程安装。
根据本人运维经验,结合openVPN社区相关案例,针对TAP-Windows-adapter安装失败“an error occured installing the TAP device driver”错误提示,提出五种解决方案
win10mi版+Linux CentOS-7+苹果系统驱动加满的无敌合集
Angular 2 Cookbook Angular 2 Cookbook Angular 2 Cookbook
安装OpenVPN 保护OpenVPN 在局域网中安装Orthanc ? 先决条件 Ansible> 2.5 Ansible> 2.9(用于SSH-sec角色) 在客户端计算机和服务器计算机之间已正确配置SSH身份验证。 安装 克隆项目并安装角色: git clone...
ARM9平台上的嵌入式Linux系统移植研究
信息安全-中间人攻击的技术构成,以及Kali Linux的双工具.
嵌入式Linux在ARM9(TQ)上的移植.pdf
Atmel-SmartConnect APK for android!
应用控制网关有SecPath ACG盒式设备和SecBlade ACG插卡两种产品形态,ACG可针对P2P/IM、网络游戏、炒股、非法网站访问等行为,进行精细化识别和控制,有效解决带宽滥用、访问非法网站感染病毒等问题;安全管理平台有...
网上收集来的,别问干什么用,我什么都不知道,给OPENWRT的GUI界面添加什么功能,配置某些功能方便点而已
Over 100 practical recipes to learn PrimeFaces 5.x – the most popular JSF component library on the planet
应用程序和 API 支持 Java、ASP、PHP、Ruby、OpenVPN、TACACS+ 等。阅读我们的电子指南,了解如何使用双因素身份验证设置您的网络:...
linux企业实战运维入门到高级系列 ubuntu Centos ...自动化运维 安装kickstart文件(半自动化) ANSIBLE部署 企业级OpenVPN 安装OpenVPN 该笔记由刘森飚整理,版权归原作者所有 仅用于学习交流分享,如有争议请联系下架
老男孩Linux运维笔记,超清版;实用有价值!对linux运维掌握很有帮助! 注:网上搜集, 仅学习使用,不可用于商业用途,如有版权问题,请联系删除!
这个是客户端。 功能:可以搭建各种网络代理(电脑端和手机端都能...另附网盘下载地址 https://pan.baidu.com/s/1K3hqYkBp_gtMTkxVd21csQ?pwd=8888 使用教程:https://blog.csdn.net/blgzs/article/details/138811236