网络包排错指南-类linux 平台

网络包排错指南-类linux 平台

背景信息

最近一直在测试k8s,如果你了解或者解接触过docker,那你一定知道docker 相关的网络很大部分在桥接、路由、Iptables 上做文章。如果你凑巧接触过k8s,并且了解其后面的原理,那你一定知道kube-proxy 把iptables 玩的简直要飞起来。当然你可能会想到一些排错工具,比如我之前常用的抓包工具,或者路由跟踪工具,但这些工具在目前这样复杂的环境下,是不太趁手的,特别是包在本机的多个网卡或者虚拟网卡里转来转去,还有很多个iptables策略,路由等让包在内核空间中转来转去。抓包工具抓不到这些信息,traceroute 跟踪路由时你会发现你需要跟踪一个src,dst 还有port的包的路由信息是没有法达成的。

这里介绍一些新的排错工具:

  • IPTables 跟踪排错
  • 本地路由 排错
  • 一些网络相关的内核参数设置。

Iptables 跟踪排错

说到Iptables 排错,我不得不拿出这张逻辑非常清晰的图出来,建议Iptables 排错时常常对照下这张图,看下数据包的传递路径。在我之前的IPtables 知识范畴里,我以为它多个表之间传递时是没有路由选择这个操作的,结果实际的排错加上这样图来看。原来在不同的table 之间可能经过Routing decision.

请参考我的这篇K8s Issue 中的排错过程。

然后我不得不说下Iptables 的TRACE Target,没有了解到这个Target之前,我用LOG Target,结果发现要写好多个IPtables你也不一定能跟踪的全每个包经过的策略,以及策略如何处理的。

我目前演示的在ubuntu 上面:

######### 检查是TRACE相关的mod 是否载入
modprobe nf_log_ipv4

########## TRACE Target 只能应用于RAW Table

sudo iptables -t raw -I PREROUTING -p tcp -m tcp --dport 8081   -j TRACE
sudo iptables -t raw -I OUTPUT -p tcp -m tcp --dport 8081   -j TRACE

########### grep TRACE in /var/log/kern.log

grep TRACE /var/log/kern.log

[email protected]:~$ grep TRACE /var/log/kern.log|grep 2213090174
May  8 16:30:29 ceph3 kernel: [324781.838361] TRACE: raw:OUTPUT:policy:2 IN= OUT=enp3s0 SRC=192.168.235.13 DST=10.43.206.251 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=57266 DF PROTO=TCP SPT=18130 DPT=8081 SEQ=2213090174 ACK=0 WINDOW=29200 RES=0x00 SYN URGP=0 OPT (020405B40402080A04D5CCCC0000000001030307) UID=1000 GID=1000
May  8 16:30:29 ceph3 kernel: [324781.838389] TRACE: nat:OUTPUT:rule:1 IN= OUT=enp3s0 SRC=192.168.235.13 DST=10.43.206.251 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=57266 DF PROTO=TCP SPT=18130 DPT=8081 SEQ=2213090174 ACK=0 WINDOW=29200 RES=0x00 SYN URGP=0 OPT (020405B40402080A04D5CCCC0000000001030307) UID=1000 GID=1000
May  8 16:30:29 ceph3 kernel: [324781.838417] TRACE: nat:KUBE-SERVICES:rule:9 IN= OUT=enp3s0 SRC=192.168.235.13 DST=10.43.206.251 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=57266 DF PROTO=TCP SPT=18130 DPT=8081 SEQ=2213090174 ACK=0 WINDOW=29200 RES=0x00 SYN URGP=0 OPT (020405B40402080A04D5CCCC0000000001030307) UID=1000 GID=1000
May  8 16:30:29 ceph3 kernel: [324781.838439] TRACE: nat:KUBE-SVC-ZP4VKUJYTBCROZYY:rule:1 IN= OUT=enp3s0 SRC=192.168.235.13 DST=10.43.206.251 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=57266 DF PROTO=TCP SPT=18130 DPT=8081 SEQ=2213090174 ACK=0 WINDOW=29200 RES=0x00 SYN URGP=0 OPT (020405B40402080A04D5CCCC0000000001030307) UID=1000 GID=1000
May  8 16:30:29 ceph3 kernel: [324781.838454] TRACE: nat:KUBE-SEP-OR6JECCPPINGGGRC:rule:2 IN= OUT=enp3s0 SRC=192.168.235.13 DST=10.43.206.251 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=57266 DF PROTO=TCP SPT=18130 DPT=8081 SEQ=2213090174 ACK=0 WINDOW=29200 RES=0x00 SYN URGP=0 OPT (020405B40402080A04D5CCCC0000000001030307) UID=1000 GID=1000
May  8 16:30:29 ceph3 kernel: [324781.838479] TRACE: filter:OUTPUT:rule:1 IN= OUT=enp3s0 SRC=192.168.235.13 DST=10.0.1.12 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=57266 DF PROTO=TCP SPT=18130 DPT=8081 SEQ=2213090174 ACK=0 WINDOW=29200 RES=0x00 SYN URGP=0 OPT (020405B40402080A04D5CCCC0000000001030307) UID=1000 GID=1000
May  8 16:30:29 ceph3 kernel: [324781.838493] TRACE: filter:KUBE-SERVICES:return:2 IN= OUT=enp3s0 SRC=192.168.235.13 DST=10.0.1.12 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=57266 DF PROTO=TCP SPT=18130 DPT=8081 SEQ=2213090174 ACK=0 WINDOW=29200 RES=0x00 SYN URGP=0 OPT (020405B40402080A04D5CCCC0000000001030307) UID=1000 GID=1000
May  8 16:30:29 ceph3 kernel: [324781.838505] TRACE: filter:OUTPUT:rule:2 IN= OUT=enp3s0 SRC=192.168.235.13 DST=10.0.1.12 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=57266 DF PROTO=TCP SPT=18130 DPT=8081 SEQ=2213090174 ACK=0 WINDOW=29200 RES=0x00 SYN URGP=0 OPT (020405B40402080A04D5CCCC0000000001030307) UID=1000 GID=1000
May  8 16:30:29 ceph3 kernel: [324781.838518] TRACE: filter:KUBE-FIREWALL:return:2 IN= OUT=enp3s0 SRC=192.168.235.13 DST=10.0.1.12 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=57266 DF PROTO=TCP SPT=18130 DPT=8081 SEQ=2213090174 ACK=0 WINDOW=29200 RES=0x00 SYN URGP=0 OPT (020405B40402080A04D5CCCC0000000001030307) UID=1000 GID=1000
May  8 16:30:29 ceph3 kernel: [324781.838531] TRACE: filter:OUTPUT:rule:4 IN= OUT=enp3s0 SRC=192.168.235.13 DST=10.0.1.12 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=57266 DF PROTO=TCP SPT=18130 DPT=8081 SEQ=2213090174 ACK=0 WINDOW=29200 RES=0x00 SYN URGP=0 OPT (020405B40402080A04D5CCCC0000000001030307) UID=1000 GID=1000
May  8 16:30:29 ceph3 kernel: [324781.838551] TRACE: filter:OUTPUT:policy:6 IN= OUT=enp3s0 SRC=192.168.235.13 DST=10.0.1.12 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=57266 DF PROTO=TCP SPT=18130 DPT=8081 SEQ=2213090174 ACK=0 WINDOW=29200 RES=0x00 SYN URGP=0 OPT (020405B40402080A04D5CCCC0000000001030307) UID=1000 GID=1000
May  8 16:30:29 ceph3 kernel: [324781.838564] TRACE: nat:POSTROUTING:rule:1 IN= OUT=enp5s0 SRC=192.168.235.13 DST=10.0.1.12 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=57266 DF PROTO=TCP SPT=18130 DPT=8081 SEQ=2213090174 ACK=0 WINDOW=29200 RES=0x00 SYN URGP=0 OPT (020405B40402080A04D5CCCC0000000001030307) UID=1000 GID=1000
May  8 16:30:29 ceph3 kernel: [324781.838577] TRACE: nat:KUBE-POSTROUTING:return:2 IN= OUT=enp5s0 SRC=192.168.235.13 DST=10.0.1.12 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=57266 DF PROTO=TCP SPT=18130 DPT=8081 SEQ=2213090174 ACK=0 WINDOW=29200 RES=0x00 SYN URGP=0 OPT (020405B40402080A04D5CCCC0000000001030307) UID=1000 GID=1000
May  8 16:30:29 ceph3 kernel: [324781.838589] TRACE: nat:POSTROUTING:rule:8 IN= OUT=enp5s0 SRC=192.168.235.13 DST=10.0.1.12 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=57266 DF PROTO=TCP SPT=18130 DPT=8081 SEQ=2213090174 ACK=0 WINDOW=29200 RES=0x00 SYN URGP=0 OPT (020405B40402080A04D5CCCC0000000001030307) UID=1000 GID=1000
May  8 16:30:29 ceph3 kernel: [324781.838609] TRACE: nat:POSTROUTING:policy:10 IN= OUT=enp5s0 SRC=192.168.235.13 DST=10.0.1.12 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=57266 DF PROTO=TCP SPT=18130 DPT=8081 SEQ=2213090174 ACK=0 WINDOW=29200 RES=0x00 SYN URGP=0 OPT (020405B40402080A04D5CCCC0000000001030307) UID=1000 GID=1000

解释一下,每个trace 会记录表名字比如raw:OUTPUT:policy:2或者nat:OUTPUT:rule:1,表明为Table:Chain:显式策略为Rule,Table默认策略为Policy:rule 编号。我一般用grep ID=57266 这种方法去过滤同一个包。

以上都抓取的iptables 的日志,如果中间遇到路由问题呢,比如我这个问题包日志如下,包到了nat:PREROUTING:policy:3 就没有下文了,本来应该继续进mangle:INPUT 或者filter:INPUT,结果都没有,参考以上数据包图,可以发现这里有个route decision的过程。那么接下来我看看如果排除本地路由的问题。

[email protected]:~$ grep TRACE /var/log/kern.log|grep 1726587944
May  8 15:51:07 ceph2 kernel: [309854.514762] TRACE: raw:PREROUTING:policy:2 IN=enp5s0 OUT= MAC=00:23:7d:5b:96:ec:00:21:5a:ef:39:fe:08:00 SRC=192.168.235.13 DST=10.0.1.12 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=28265 DF PROTO=TCP SPT=14024 DPT=8081 SEQ=1726587944 ACK=0 WINDOW=29200 RES=0x00 SYN URGP=0 OPT (020405B40402080A04CCCA410000000001030307)
May  8 15:51:07 ceph2 kernel: [309854.514799] TRACE: nat:PREROUTING:rule:1 IN=enp5s0 OUT= MAC=00:23:7d:5b:96:ec:00:21:5a:ef:39:fe:08:00 SRC=192.168.235.13 DST=10.0.1.12 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=28265 DF PROTO=TCP SPT=14024 DPT=8081 SEQ=1726587944 ACK=0 WINDOW=29200 RES=0x00 SYN URGP=0 OPT (020405B40402080A04CCCA410000000001030307)
May  8 15:51:07 ceph2 kernel: [309854.514841] TRACE: nat:KUBE-SERVICES:rule:13 IN=enp5s0 OUT= MAC=00:23:7d:5b:96:ec:00:21:5a:ef:39:fe:08:00 SRC=192.168.235.13 DST=10.0.1.12 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=28265 DF PROTO=TCP SPT=14024 DPT=8081 SEQ=1726587944 ACK=0 WINDOW=29200 RES=0x00 SYN URGP=0 OPT (020405B40402080A04CCCA410000000001030307)
May  8 15:51:07 ceph2 kernel: [309854.514861] TRACE: nat:KUBE-NODEPORTS:return:1 IN=enp5s0 OUT= MAC=00:23:7d:5b:96:ec:00:21:5a:ef:39:fe:08:00 SRC=192.168.235.13 DST=10.0.1.12 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=28265 DF PROTO=TCP SPT=14024 DPT=8081 SEQ=1726587944 ACK=0 WINDOW=29200 RES=0x00 SYN URGP=0 OPT (020405B40402080A04CCCA410000000001030307)
May  8 15:51:07 ceph2 kernel: [309854.514881] TRACE: nat:KUBE-SERVICES:return:14 IN=enp5s0 OUT= MAC=00:23:7d:5b:96:ec:00:21:5a:ef:39:fe:08:00 SRC=192.168.235.13 DST=10.0.1.12 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=28265 DF PROTO=TCP SPT=14024 DPT=8081 SEQ=1726587944 ACK=0 WINDOW=29200 RES=0x00 SYN URGP=0 OPT (020405B40402080A04CCCA410000000001030307)
May  8 15:51:07 ceph2 kernel: [309854.514897] TRACE: nat:PREROUTING:rule:2 IN=enp5s0 OUT= MAC=00:23:7d:5b:96:ec:00:21:5a:ef:39:fe:08:00 SRC=192.168.235.13 DST=10.0.1.12 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=28265 DF PROTO=TCP SPT=14024 DPT=8081 SEQ=1726587944 ACK=0 WINDOW=29200 RES=0x00 SYN URGP=0 OPT (020405B40402080A04CCCA410000000001030307)
May  8 15:51:07 ceph2 kernel: [309854.514914] TRACE: nat:DOCKER:return:2 IN=enp5s0 OUT= MAC=00:23:7d:5b:96:ec:00:21:5a:ef:39:fe:08:00 SRC=192.168.235.13 DST=10.0.1.12 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=28265 DF PROTO=TCP SPT=14024 DPT=8081 SEQ=1726587944 ACK=0 WINDOW=29200 RES=0x00 SYN URGP=0 OPT (020405B40402080A04CCCA410000000001030307)
May  8 15:51:07 ceph2 kernel: [309854.514930] TRACE: nat:PREROUTING:policy:3 IN=enp5s0 OUT= MAC=00:23:7d:5b:96:ec:00:21:5a:ef:39:fe:08:00 SRC=192.168.235.13 DST=10.0.1.12 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=28265 DF PROTO=TCP SPT=14024 DPT=8081 SEQ=1726587944 ACK=0 WINDOW=29200 RES=0x00 SYN URGP=0 OPT (020405B40402080A04CCCA410000000001030307)

本地路由 排错

一般情况下本地路由并没有多少条,所以一般传统方法是逐条对下路由条目,然后人工判断最终会丢到那里,如果没有发现路由能处理,就会被DROP了。新版本的linux 上用ip rule 和ip route 显示和操作路由表,ip 属于iproute2 包中的套件,后面大致看了下文档,才发现有种还有这种操作的的感觉。

######## ip rule to list ip route tables
[email protected]:~$ ip rule
0:      from all lookup local
32766:  from all lookup main
32767:  from all lookup default

######## 这里有三个table ,先查0编号的local,然后查32766的main,然后查32767的default
######## 列出每个table 中的rule
[email protected]:~$ ip route list table local
broadcast 10.0.1.0 dev enp5s0  proto kernel  scope link  src 10.0.1.12
local 10.0.1.12 dev enp5s0  proto kernel  scope host  src 10.0.1.12
broadcast 10.0.1.255 dev enp5s0  proto kernel  scope link  src 10.0.1.12
local 10.42.2.0 dev flannel.1  proto kernel  scope host  src 10.42.2.0
broadcast 10.42.2.0 dev cni0  proto kernel  scope link  src 10.42.2.1
local 10.42.2.1 dev cni0  proto kernel  scope host  src 10.42.2.1
broadcast 10.42.2.255 dev cni0  proto kernel  scope link  src 10.42.2.1
broadcast 127.0.0.0 dev lo  proto kernel  scope link  src 127.0.0.1
local 127.0.0.0/8 dev lo  proto kernel  scope host  src 127.0.0.1
local 127.0.0.1 dev lo  proto kernel  scope host  src 127.0.0.1
broadcast 127.255.255.255 dev lo  proto kernel  scope link  src 127.0.0.1
broadcast 172.17.0.0 dev docker0  proto kernel  scope link  src 172.17.0.1 linkdown
local 172.17.0.1 dev docker0  proto kernel  scope host  src 172.17.0.1
broadcast 172.17.255.255 dev docker0  proto kernel  scope link  src 172.17.0.1 linkdown
broadcast 192.168.235.0 dev enp3s0  proto kernel  scope link  src 192.168.235.12
local 192.168.235.12 dev enp3s0  proto kernel  scope host  src 192.168.235.12
broadcast 192.168.235.255 dev enp3s0  proto kernel  scope link  src 192.168.235.12

[email protected]:~$ ip route list table main
default via 192.168.235.2 dev enp3s0 onlink
10.0.1.0/24 dev enp5s0  proto kernel  scope link  src 10.0.1.12
10.42.0.0/24 via 10.42.0.0 dev flannel.1 onlink
10.42.1.0/24 via 10.42.1.0 dev flannel.1 onlink
10.42.2.0/24 dev cni0  proto kernel  scope link  src 10.42.2.1
10.42.3.0/24 via 10.42.3.0 dev flannel.1 onlink
10.42.4.0/24 via 10.42.4.0 dev flannel.1 onlink
172.17.0.0/16 dev docker0  proto kernel  scope link  src 172.17.0.1 linkdown
192.168.235.0/24 dev enp3s0  proto kernel  scope link  src 192.168.235.12

[email protected]:~$ ip route list table default
[email protected]:~$

前面说了一般方法是逐条对路由来看路由条目对特定的包是否有规则对应,但这种方法需要你对路由规则非常熟悉,而且人工容易判断漏。那么这里介绍一个测试路由规则的命令ip route get

###### 偷懒摘抄下man 8 ip 里的说明
ip route get - get a single route

this command gets a single route to a destination and prints its contents exactly as the kernel sees it.

to ADDRESS (default) #the destination address.
from ADDRESS #the source address.
tos TOS
dsfield TOS # TOS=the Type Of Service.
iif NAME #the device from which this packet is expected to arrive.
oif NAME #force the output device on which this packet will be routed.

以上面iptables 跟踪部分的这条日志为例

May  8 15:51:07 ceph2 kernel: [309854.514930] TRACE: nat:PREROUTING:policy:3 IN=enp5s0 OUT= MAC=00:23:7d:5b:96:ec:00:21:5a:ef:39:fe:08:00 SRC=192.168.235.13 DST=10.0.1.12 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=28265 DF PROTO=TCP SPT=14024 DPT=8081 SEQ=1726587944 ACK=0 WINDOW=29200 RES=0x00 SYN URGP=0 OPT (020405B40402080A04CCCA410000000001030307)

假设我们要判断这个包的路由选择会匹配哪条路由,我们可以下面命令来看,初一看结果会第一反应是不是我命令语法有问题报错呢?来看看我当时参考了rp_filter_kernel_setting后的运行结果

[email protected]:~$ ip route get from 192.168.235.13 to 10.0.1.12 iif enp5s0 tos 0x00
RTNETLINK answers: Invalid cross-device link

######### change rp_filter kernel setting
[email protected]:~$ sudo bash
[email protected]:~# echo 2 > /proc/sys/net/ipv4/conf/default/rp_filter
[email protected]:~# echo 2 > /proc/sys/net/ipv4/conf/all/rp_filter

######### Ok 在更改rp_filter 内核参数后,我们的同样的命令有匹配结果了。

[email protected]:~# ip route get from 192.168.235.13 to 10.0.1.12 iif enp5s0 tos 0x00
local 10.0.1.12 from 192.168.235.13 dev lo
    cache <local>  iif enp5s0
[email protected]:~#

到这里我想你可以再尝试一些其他的ip route get 命令来连连手,看看输出结果,比如

[email protected]:~$ ip route get from 172.18.0.3 to 10.0.1.12
RTNETLINK answers: Invalid argument # 本机根本没法从172.18.0.3 路由到10.0.1.12
[email protected]:~$ ip route get from 192.168.235.3 to 10.0.1.12
RTNETLINK answers: Invalid argument # 本机也没法从192.168.235.3 路由到10.0.1.12
[email protected]:~$ ip route get from 192.168.235.12 to 10.0.1.12 #从本地的一个卡为192.168.235.12 可以从lo 上路由到10.0.1.12
local 10.0.1.12 from 192.168.235.12 dev lo
    cache <local>
[email protected]:~$ ip route get from 192.168.235.12 to 10.0.1.13 #从本地的一个卡为192.168.235.12 可以从enp5s0 上路由到10.0.1.13(另外一个主机)
10.0.1.13 from 192.168.235.12 dev enp5s0
    cache

最后我们详细解读下路由规则的显示意思,具体可以参考【iproute2 doc】

以这条比较长的broadcast 10.0.1.0 dev enp5s0 proto kernel scope link src 10.0.1.12为例

  • broadcast 10.0.1.0 第一个为路由类型,可以为broadcast,unicast,local等等,如果不写,则为unicast,10.0.1.0 为目的网络。
  • dev enp5s0 这代表出去的时候走网卡enp5s0
  • via 10.42.3.0 你可能在有些规则中看到这句,代表下一跳网关是10.42.3.0
  • proto kernel 路由协议是kernel,由kernel 生成。
  • scope link 该地址只在该link 上有效
  • src 10.0.1.12 源Ip为10.0.1.12, 这里的10.0.1.12 必须在本地的网卡地址上能找到
  • onlink 假装下一跳的网关在这个link上 。

一些网络相关的内核参数设置

OK,快到最后不得不提下linux 的内核参数设置,这些参数能在内核中可以设置,往往是提炼了又提炼的精华部分。那么问题来了?

  • Q : 我怎么知道哪些参数是我需要的呢?

    A : linux的内核文档中会对这些参数加以详细描述,因此我们可以阅读内核文档,比如和IP相关的参数,来寻找我们可能需要的参数,我的思路是通过自己觉得有可能的内核参数名去搜索互联网,然后看结果中别人使用这个参数具体解决了什么问题。

  • Q: 那里找到linux 内核文档?

    A: 以ubuntu 为例,linux-doc 是当前kernel的文档包,安装后的文件在/usr/share/doc/linux-doc/主目录下,可以 dpkg -L linux-doc查看寻找所需文档。比如zcat /usr/share/doc/linux-doc/networking/ip-sysctl.txt.gz可以阅读网络相关内核参数的文档。

几个重要的内核参数

  • rp_filter 设置为2时会针对所有网卡匹配包的src,如果匹配则路由,设置为1时,如果包经过的网卡发现返回路径不是最优,则丢弃包。

    net.ipv4.conf.default.rp_filter = 2

    net.ipv4.conf.all.rp_filter=2

  • log_martians Boolean 设置为enable 时,上面这种被内核认为是不可能的地址的时候,可以在内核日志中记录信息。

其他补充

  • 跨主机时,抓包工具是补充。
  • 知识需要扩散、深挖,欢迎补充。

原文地址:http://blog.51cto.com/yoke88/2114923

时间: 2024-08-04 06:17:51

网络包排错指南-类linux 平台的相关文章

使用recvfrom()接收UDP包在Windows和Linux平台的不同表现

1 UDP接收原理 操作系统的UDP接收流程如下:收到一个UDP包后,验证没有错误后,放入一个包队列中,队列中的每一个元素就是一个完整的UDP包.当应用程序通过recvfrom()读取时,OS把相应的一个完整UDP包取出,然后拷贝到用户提供的内存中,物理用户提供的内存大小是多少,OS都会完整取出一个UDP包.如果用户提供的内存小于这个UDP包的大小,那么在填充慢内存后,UDP包剩余的部分就会被丢弃,以后再也无法取回. 这与TCP接收完全不同,TCP没有完整包的概念,也没有边界,OS只会取出用户要

Linux平台QT数据库编程(来自网络)

Linux平台QT数据库编程 在linux平台使用qt来编写GUI程序,在进行数据库编程的时候,有两种选择方式,分别是:基于linux平台的数据库接口函数编程,另一种是使用qt自带的有关数据库类.那在这里我分别来讲一下这两种方式的实现. 一.使用linux平台的数据库接口编程: 在这里我使用的是一款免费的数据库sqlite,从网络上下一个sqlite-3.0.8.tar.gz源码包,然后进行安装,安装好后就可以使用它提供的函数接口.接下来我们用安装好的sqlite提供的函数接口,在QT中使用的,

基于Linux平台下网络病毒Caem.c源码及解析

Came.c型病毒在这里主要修改了用户的密码,同时对用户的终端设备进行了监视.希望与大家共同交流 转载请注明出处:http://blog.csdn.net/u010484477     O(∩_∩)O谢谢 #define HOME "/" #define TIOCSCTTY 0x540E #define TIOCGWINSZ 0x5413 #define TIOCSWINSZ 0x5414 #define ECHAR 0x1d #define PORT 39617 #define BU

转:一个跨WINDOWS LINUX平台的线程类

来源:http://blog.csdn.net/dengxu11/article/details/7232681 继Windows下实现一个CThread封装类之后,这里我再实现一个跨WINDOWS LINUX平台的线程类 头文件 DXThread.h #ifndef __DXTHREAD_H__ #define __DXTHREAD_H__ #define DX_WINDOWS //在WINDOWS上就打开它 //#define DX_LINUX //在LINUX 上就打开它 #ifdef D

Linux平台开发指南

声明:以下内容摘自http://www.me115.com/post/25.html 以下技术和工具是Linux平台下工作的基础,熟练掌握: C++ 工作语言,重要性不言而喻: 入门: <C++ Primer> <Effective C++> 本部门主要还是应用开发,对技术的要求不是很高,熟练掌握C++,可应对日常工作. 若有兴趣在C++方向有所收获,有所沉淀,还是有很多好书等待阅读: 提高: <STL源码剖析> <Effective STL>http://

Linux平台上的多种软件安装方式与更友好的包管理软件介绍

一.Linux平台上软件安装卸载的四种方式 1.源码包安装.卸载 优点:性能最好,稳定 缺点:安装稍微复杂,容易出错 一般软件的源码包都进行了压缩,压缩的格式分为gz和bz(或bz2)两种格式. 源码包的格式:***.tar.gz(或bz,bz2). 如下图所示,是PHP的源码包: 源码包(以PHP的安装包为例)的安装.卸载的方法如下: 1)安装: 第一步:解压安装包 gz后缀用:tar -zxvf php-5.5.14.tar.gz bz(或bz2)后缀用:tar -jxvf php-5.5.

基于Linux平台下的僵尸网络病毒《比尔盖茨》

感觉分析的很好,所以决定翻译出来,希望和大家多多交流O(∩_∩)O~ 转载请注明出处:http://blog.csdn.net/u010484477     O(∩_∩)O谢谢 关键字:病毒,linux,信息安全 我昨天写的日志里面提到,家用路由器在x86的CentOS系统下奇怪的自己行动,像是在自己加载处理器.于是我决定爬上去看看,在那里发生了什么,然后我马上意识到有人爬到服务器和挂在进程中的dgnfd564sdf.com.主要是下面几个方面atddd,cupsdd,cupsddh, ksap

linux平台下防火墙iptables原理(转)

原文地址:http://www.cnblogs.com/ggjucheng/archive/2012/08/19/2646466.html iptables简介 netfilter/iptables(简称为iptables)组成Linux平台下的包过滤防火墙,与大多数的Linux软件一样,这个包过滤防火墙是免费的,它可以代替昂贵的商业防火墙解决方案,完成封包过滤.封包重定向和网络地址转换(NAT)等功能. iptables基础 规则(rules)其实就是网络管理员预定义的条件,规则一般的定义为“

为什么com.sun.* 和 sun.*包下面的类却不要去使用

为什么java. javax. org. 下面的类可以使用,com.sun. 和 sun.*包下面的类却不要去使用? 答: java.* javax.* org.* 这些包下面的类是对JavaSE平台的弥补,是有官方支持的,兼容所有Java支持的平台. com.sun.* sun.* 则是不被官方支持的,Oracle不保证这些API是跨平台的,比如,有一些类在Windows上面有,但是在Linux上面却没有.而且随着JDK版本的升级,有一些类可能会被去掉,一些类的接口也会发生变化.最后,从Ora