wantaugust 发表于 2014-07-31 08:41

自己设想3种比较端口和pid的关系方法,不是bashshell,请大家帮帮

在c中,给一个端口号和一个pid号,看看他们是不是关联的,就是说if判断这个端口号是不是属于这个pid号:
第一种方法:
int main(int argc,char *argv[])
{
if(argc<2)
{
printf("参数少,挂了\n");
return 1;
}
int port=atoi(argv);
int pid=atoi(argv);
关键就是下面这句,不知道怎么才能把prot传入lsof -i :中,更不知道怎么返回pid的值,system只能返回里面语句是否成功
system("lsof -i :port|cut -d * * -f 2");//这句目的是查询一个端口所属的pid,并返回这个pid的值
if(??????)//没有返回值我就没法判断了
printf("端口%d是pid%d的端口 \n");
else
printf("注意:端口%d不是pid%d的端口 \n")
return 0;
}

第二种方法:想从/proc/pid中的某个文件中cat出pid占用的端口号,但是不知道到底是哪个文件里有端口号,cat | grep一下午脑子都成浆糊了,求大神指点
char path[]="/proc/pid/**********";
fd=open(path, O_CREAT | O_RDONLY, 0644);
number=read(fd, buf, 255));

第三种方法:自己想通过pid号,调用某个linux提供的函数返回这个pid的端口号(假设一个pid只能占用一个端口),如int a=linuxfunction(pid);本人小白,不懂内核,估计上面的那个语句真要实现可能是多个函数调用才能实现。但是貌似这个方法效率最高,资源占用最少,也是我最想知道的。各位大神,给几个工作过程的函数名就行,我自己慢慢baidu,要是能再详细点那就感激不尽了


以上三种方法都想学会,请各位前辈指教,谢谢

Godbach 发表于 2014-07-31 09:38

回复 1# wantaugust

你这就是纯 C 编程的问题吧,用什么 popen 之类的执行以下 lsof -i, 然后逐行分析,比较 PID 和 port 是否是你命令行参数指定的。


   

wantaugust 发表于 2014-07-31 10:17

回复 2# Godbach
大神出手很是激动:D
我是将ip包通过iptables转到用户空间的,每一个包都从中读取他的tcp或者udp的来源端口号,
然后调用上面的子程序,并把这个端口号传入子程序中,然后比对这个端口是不是我允许放行的pid的端口。
每一个包都是这样一个工作过程,我在终端lsof -i后发现,这个命令居然要7妙中才能执行结束,要是每个tcpudp包都这样这个防火墙就没意义了
能在帮着想想别的办法吗,谢谢


   

Godbach 发表于 2014-07-31 10:56

回复 3# wantaugust

建议你在 kernel 里面做吧。

kernel 里面基本上所有资源都你都可见,操作比较方便。你只需要在kernel里面实现通过一个数据包查找它所属的进程ID就可以了。


   

Godbach 发表于 2014-07-31 10:59

回复 3# wantaugust


你的需求还是有点让人费解。

首先,这些报文肯定是要 deliver 到你本地进程的吧。要是给本地开启监听端口进程的话,那么你本身通过 iptables 就可以阻断了。

   

wantaugust 发表于 2014-07-31 11:01

回复 4# Godbach
大神,说心里话,我做梦都想在核里实现真心希望我能达到那个层次,但是我是小白,刚接触linux不到一年,学了鸟哥的东西后就开始玩防火墙了
内核我有点打触
你给推荐本书吧,看了就能在内核里比对pid的书,谢谢

   

Godbach 发表于 2014-07-31 11:02

回复 6# wantaugust

你先详细具体的说一下你的需求吧


   

wantaugust 发表于 2014-07-31 11:24

回复 7# Godbach
谢谢大神帮忙:D
1单机iptables,
2建立一个文本文件,里面是允许放行的软件名,如firefox,yum,transmision,
3当启动这些软件时,他们的pid及子pid的所有占用端口都动态的被捕获,用于后面的比对,
4iptables output政策是drop ,
5每一个本机放行的数据包都进行比对,看看这个包是不是允许放行的软件的pid产生的数据包,如果是就在queue的断言中返回方行,不是就在断言中返回drop
总而言之就是实现可指定软件的《软件防火墙》,因为我以前用windos习惯了,如果没有针对某个软件的放行阻止动作心里就不踏实,连网银都不敢上,可能这是强迫症吧


   

Godbach 发表于 2014-07-31 11:33

回复 8# wantaugust

那你是不是可以在应用空间直接监控要启动的软件,然后禁用那些你允许的软件就行了。

应用软件启动不了,就没有所谓的网络连接了。


   

wantaugust 发表于 2014-07-31 11:42

回复 9# Godbach

比如说wps,这样的软件我经常使用,但是不能让他上网,不能禁用呀
   
页: [1] 2 3
查看完整版本: 自己设想3种比较端口和pid的关系方法,不是bashshell,请大家帮帮