免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 3690 | 回复: 24
打印 上一主题 下一主题

[内核入门] 自己设想3种比较端口和pid的关系方法,不是bashshell,请大家帮帮 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-07-31 08:41 |只看该作者 |倒序浏览
在c中,给一个端口号和一个pid号,看看他们是不是关联的,就是说if判断这个端口号是不是属于这个pid号:
第一种方法:
int main(int argc,char *argv[])
{
if(argc<2)
{
printf("参数少,挂了\n");
return 1;
}
int port=atoi(argv[1]);
int pid=atoi(argv[2]);
关键就是下面这句,不知道怎么才能把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,要是能再详细点那就感激不尽了


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

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
2 [报告]
发表于 2014-07-31 09:38 |只看该作者
回复 1# wantaugust

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


   

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


   

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
4 [报告]
发表于 2014-07-31 10:56 |只看该作者
回复 3# wantaugust

建议你在 kernel 里面做吧。

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


   

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
5 [报告]
发表于 2014-07-31 10:59 |只看该作者
回复 3# wantaugust


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

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

   

论坛徽章:
0
6 [报告]
发表于 2014-07-31 11:01 |只看该作者
回复 4# Godbach
大神,说心里话,我做梦都想在核里实现真心希望我能达到那个层次,但是我是小白,刚接触linux不到一年,学了鸟哥的东西后就开始玩防火墙了
内核我有点打触
你给推荐本书吧,看了就能在内核里比对pid的书,谢谢

   

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
7 [报告]
发表于 2014-07-31 11:02 |只看该作者
回复 6# wantaugust

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


   

论坛徽章:
0
8 [报告]
发表于 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习惯了,如果没有针对某个软件的放行阻止动作心里就不踏实,连网银都不敢上,可能这是强迫症吧


   

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
9 [报告]
发表于 2014-07-31 11:33 |只看该作者
回复 8# wantaugust

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

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


   

论坛徽章:
0
10 [报告]
发表于 2014-07-31 11:42 |只看该作者
回复 9# Godbach

比如说wps,这样的软件我经常使用,但是不能让他上网,不能禁用呀
   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP