linuxudp命令 linux中的du命令

Linux使用TPROXY进行UDP的透明代理 在进行TCP的代理时,只要在NET表上无脑进行REDIRECT就好了 。例如使用ss-redir,你只要把tcp的流量redirect到ss-redir监听的端口上就OK了 。但是当你使用这种方法的时候,就会不正常,因为对于UDP进行redirect之后,原始的目的地址和端口就找不到了 。
这是为什么呢?
ss-redir的原理很简单:使用iptables对PREROUTING与OUTPUT的TCP/UDP流量进行REDIRECT(REDIRECT是DNAT的特例),ss—redir在捕获网络流量后,通过一些技术手段获取REDIRECT之前的目的地址(dst)与端口(port),连同网络流量一起转发至远程服务器 。
针对TCP连接,的确是因为Linux Kernel连接跟踪机制的实现才使获取数据包原本的dst和port成为可能,但这种连接跟踪机制并非只存在于TCP连接中,UDP连接同样存在,conntrack -p udp便能看到UDP的连接跟踪记录 。内核中有关TCP与UDP的NAT源码/net/netfilter/nf_nat_proto_tcp.c和/net/netfilter/nf_nat_proto_udp.c几乎一模一样,都是根据NAT的类型做SNAT或DNAT 。
那这究竟是怎么一回事?为什么对于UDP连接就失效了呢?
回过头来看看ss-redir有关获取TCP原本的dst和port的源码,核心函数是getdestaddr:
在内核源码中搜了下有关SO_ORIGINAL_DST的东西,看到了getorigdst:
We only do TCP and SCTP at the moment 。Oh,shit!只针对TCP与SCTP才能这么做,并非技术上不可行,只是人为地阻止罢了 。
为了在redirect UDP后还能够获取原本的dst和port,ss-redir采用了TPROXY 。Linux系统有关TPROXY的设置是以下三条命令:
大意就是在mangle表的PREROUTING中为每个UDP数据包打上0x2333/0x2333标志,之后在路由选择中将具有0x2333/0x2333标志的数据包投递到本地环回设备上的1080端口;对监听0.0.0.0地址的1080端口的socket启用IP_TRANSPARENT标志,使IPv4路由能够将非本机的数据报投递到传输层,传递给监听1080端口的ss-redir 。IP_RECVORIGDSTADDR与IPV6_RECVORIGDSTADDR则表示获取送达数据包的dst与port 。
可问题来了:要知道mangle表并不会修改数据包 , 那么TPROXY是如何做到在不修改数据包的前提下将非本机dst的数据包投递到换回设备上的1080端口呢?
这个问题在内核中时如何实现的,还待研究,但是确定是TPROXY做了某些工作 。
TPROXY主要功能:
TPROXY要解决的两个重要的问题
参考:
linux shell命令行向udp端口发送数据先nc -uv,然后在输入数据即可
nc -uvz可以用来测试udp端口是否开启监听
比如要向本地10001端口发送数据,可以使用
echo "hello"/dev/udp/localhost/10001
方法二的好处在于,发送完数据后自动退出 。当我们需要在命令行下循环向特定udp端口发送数据时,我们只能使用方法二 。
例如
while true
do
echo "xxxx"/dev/udp/localhost/10001
done
Linux增加TCP和UDP的本地端口分配范围【linuxudp命令 linux中的du命令】 ip_local_port_range,TCP和UDP本地端口范围,默认为[32768 , 60999],其中,最小值要求大于等于ip_unprivileged_port_start参数 。
ip_unprivileged_port_start , 非特权端口开始值,默认为1024.如果应用程序需要绑定小于此值的端口号,需要root权限 。
临时调整
永久调整
在/etc/sysctl.d目录下,创建配置文件,将需要调整的参数加入其中即可 。配置文件名格式为number-appname.conf 。appname可以直接用应用系统运行时的os用户名 。
执行以下命令,使之生效 。替换掉命令中的文件名 。
例如:
linuxudp命令的介绍就聊到这里吧,感谢你花时间阅读本站内容 , 更多关于linux中的du命令、linuxudp命令的信息别忘了在本站进行查找喔 。

推荐阅读