免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 鼠标左键
打印 上一主题 下一主题

linux simple personal firewall 邀您加入 [复制链接]

论坛徽章:
0
51 [报告]
发表于 2008-08-15 11:32 |只看该作者
我不会编程序...能加入吗?

论坛徽章:
0
52 [报告]
发表于 2008-08-15 11:44 |只看该作者
原帖由 fmx2001 于 2008-8-15 11:32 发表
我不会编程序...能加入吗?


当然可以啊,整理一下文档,做QA啊,好多事情要做呢。
热烈欢迎啊

论坛徽章:
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
53 [报告]
发表于 2008-08-15 14:16 |只看该作者
原帖由 鼠标左键 于 2008-8-14 14:18 发表


我确实没有仔细的看netfilter的代码,确实如泥所说,主要是学习。呵呵


啊,那还使用NF的框架吗?

论坛徽章:
0
54 [报告]
发表于 2008-08-15 16:23 |只看该作者

不错

感觉像是现在所谓的"应用代理防火墙",不过是桌面版的,而不是网关版的.
市面上买的很多防火墙已经不仅仅是包过滤了,他们也有基于应用的过滤,放在网关上的,跟本机用的肯定有区别.

Linux上面现在有SELinux,我不知道这个东东是不是只针对文件访问做了策略,它是不是也会针对应用的网络访问进行策略的订制.跟您的一样否?

论坛徽章:
0
55 [报告]
发表于 2008-08-15 17:07 |只看该作者
原帖由 Godbach 于 2008-8-15 14:16 发表


啊,那还使用NF的框架吗?


当然不用

论坛徽章:
0
56 [报告]
发表于 2008-08-15 17:11 |只看该作者
原帖由 kitlenv 于 2008-8-15 16:23 发表
感觉像是现在所谓的"应用代理防火墙",不过是桌面版的,而不是网关版的.
市面上买的很多防火墙已经不仅仅是包过滤了,他们也有基于应用的过滤,放在网关上的,跟本机用的肯定有区别.

Linux上面现在有SELinux,我不 ...

SELinux…… 没用过……
至于你说的用在网关上过滤其它机器的应用的防火墙,我没用过,也不知道是基于什么原理。但我想应该也是基于包特征过滤的吧。
这个既然叫作简单防火墙,当然是简单的啦。主要是面向桌面用户的。

论坛徽章:
0
57 [报告]
发表于 2008-08-15 19:15 |只看该作者
原帖由 Godbach 于 2008-8-15 14:16 发表


啊,那还使用NF的框架吗?

看了一下 LZ 的代码框架,的确没用 NF,是直接修改的 ip_output.c 的 ip_local_out 函数,前面插了一段代码

  1. 111 int ip_local_out(struct sk_buff *skb)
  2. 112 {
  3. 113 #ifdef CONFIG_NETWORK_SIMPLE_FIREWALL
  4. 114
  5. 115 if(lspf_load = LSPF_ALREADYLOAD)
  6. 116 {
  7. 117   if(lspf_is_allow())
  8. 118   {
  9. 119     printk("block by lspf\n");
  10. 120
  11. 121   }
  12. 122   else
  13. 123   {
  14. 124   }
  15. 125 }
  16. 126 #endif
  17. 127
复制代码

  1. 28 static struct input_dev *button_dev;
  2. 29
  3. 30
  4. 31 int lspf_load = 0;
  5. 32 module_param(lspf_load, int, S_IRUGO);
  6. 33
  7. 34 MODULE_AUTHOR("wangbin.ben");
  8. 35 MODULE_LICENSE("GPL");
  9. 36
  10. 37 int lspf_is_allow()
  11. 38 {
  12. 39   if (button_dev) {
  13. 40     input_report_key(button_dev,0x1c,  0x01);
  14. 41   }
  15. 42   return 1;
  16. 43 }
  17. 44 EXPORT_SYMBOL(lspf_is_allow);
  18. 45
  19. 46 static int  lspf_init()
  20. 47 {
  21. 48   lspf_load = LSPF_ALREADYLOAD;
  22. 49   button_dev = input_allocate_device();
  23. 50            if (!button_dev) {
  24. 51                      printk(KERN_ERR "button.c: Not enough memory\n");
  25. 52
  26. 53              }
  27. 54
  28. 55   return 0;
  29. 56 }
  30. 57 module_init(lspf_init);
  31. 58
  32. 59 static void lspf_exit()
  33. 60 {
  34. 61   lspf_load = 0;
  35. 62 }
  36. 63 module_exit(lspf_exit);
复制代码

论坛徽章:
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
58 [报告]
发表于 2008-08-15 20:41 |只看该作者
原帖由 platinum 于 2008-8-15 19:15 发表

看了一下 LZ 的代码框架,的确没用 NF,是直接修改的 ip_output.c 的 ip_local_out 函数,前面插了一段代码

111 int ip_local_out(struct sk_buff *skb)
112 {
113 #ifdef CONFIG_NETWORK_SIMPLE_FIR ...



原来已经有代码了,还以为在策划阶段呢?

论坛徽章:
0
59 [报告]
发表于 2008-08-15 23:11 |只看该作者
原帖由 Godbach 于 2008-8-15 20:41 发表



原来已经有代码了,还以为在策划阶段呢?

有,但仅有一个框架而已,里面内容全部都是空的
而且。。。这个代码风格实在是不太好看。。。
且个人感觉这种设计不是很好,反而不如直接挂在 NF 的 NF_IP_LOCAL_OUT 上,同样的功能,为什么现成的 hook 不用反而多此一举呢?

论坛徽章:
0
60 [报告]
发表于 2008-08-16 00:06 |只看该作者
原来原帖在这里,关于这个构想我觉得非常好阿,因为我也在做这样一个东西,

我发邮件和楼主讨论过了一些问题,这里再转贴一下在技术层面我的看法
首先我觉得是不是能尽量不做内核态的工作而达到你的目的,可能的方式:
1、使用 socket 选项 SO_ORIGINAL_DST
首先设置 iptables 的 DNAT 将连接转到_服务程序_的端口(或者 -j REDIRECT),然后用 socket 选项 SO_ORIGINAL_DST 获得该链接的原目的地址。 这样就可以"偷"到链接了。 当然这样做的缺陷也很大 : 1、至少会产生两个连接,一是客户端连接_服务程序_的链接,二是服务端连接其他服务器并将内容转给客户端。 2、限制在应用层,无法发出TCP控制包,比如reset客户端。 也就说即使服务器无法连接客户端的原目的地址,那么能服务器能做的只能是关闭链接,客户端只会遇到一个没有任何数据传递就关闭的奇怪链接,很类似 socks5 代理的状况。 用这种方法我写过两个程序 :

- s5snake: http://gro.clinux.org/projects/s5snake/
透明 socks5 代理
        
- netserpent: http://sourceforge.net/projects/netserpent
起初只是 s5snake 的一个广义扩展,不过已经暂停了,因为我想用第二种技术实现


2、使用 netfilter_queue
netfilter_queue 是 netfilter 提供的一个机制,使用它你就可以在用户态处理所有包了。我写过一个 netfilter_queue 的例子 :
http://blog.chinaunix.net/u/8057/showart_431074.html

楼主的构想中最关键的一点是如何获得连接的所属的进程,楼主是打算在内核层解决,我个人还是和上面一样的观点,尽量不接触到内核态。 要达到这个目的,我所知道到是两种方法:
1、 模仿 netstat 的 -p 选项
netstat -p 选项是遍历 /proc 目录,和检查 /proc/??/fd 文件做到的,比如:

$ sudo ls /proc/$(pgrep xchat)/fd -l | grep socket
lrwx------ 1 hellwolf users 64 2008-08-15 12:06 10 -> socket:[14389]
lrwx------ 1 hellwolf users 64 2008-08-15 12:06 14 -> socket:[14396]
lrwx------ 1 hellwolf users 64 2008-08-15 12:06 18 -> socket:[14403]
lrwx------ 1 hellwolf users 64 2008-08-15 12:06 3 -> socket:[14322]
lr-x------ 1 hellwolf users 64 2008-08-15 12:06 6 -> socket:[14331]
l-wx------ 1 hellwolf users 64 2008-08-15 12:06 7 -> socket:[14386]

然后通过 /proc/net/tcp 文件,就可以查询到最后那个数字对应的连接了。
当然,这种方式非常低效,特别是进程比较多的情况下,每次都需要遍历。

2、使用 linux 内核提供的 socket monitoring interface 功能
该方法更为高效和直接,可编程性也更好,使用该接口的程序有 iproute 的 ss 程序, 大家不妨研究一下。


我的建议是楼主在继续做下去之前平行参考一下所有相关技术。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP