免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
1 [报告]
发表于 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