node.js错误:getaddrinfo ENOTFOUND在chroot jail中发出http请求

我试图在chroot jail中执行一个node.jssubprocess来阻止它访问目录之外的文件系统。

但是,当我这样做时,应用程序不能再通过“请求”模块发出http请求。 我所做的任何请求都以'错误:getaddrinfo ENOTFOUND'结束。

有一个在node.js项目中被closures的问题似乎暗示你需要replacedns.lookup的实现或者将/etc/resolv.conf复制到jail中(两者都不适用于我): https:// github .COM / Joyent公司/节点/问题/ 3399

还有一个Google小组讨论: https : //groups.google.com/forum/#!topic/ nodejs/ Qb_LMLulZS4

这似乎build议你应该“把绑定库和所有的依赖关系也放入监狱”。 我不明白这个说法。

任何人得到这个正确的工作,可以分享他们做了什么?

也许这不是回答你的问题,但我想提供我的研究成果。

var ls = require('child_process').spawn('chroot', ['/mnt/chroot/wheezy-chroot', 'node', '/root/simple-server.js']); ls.stdout.on('data', function (data) { console.log('stdout: ' + data); }); ls.stderr.on('data', function (data) { console.log('stderr: ' + data); }); ls.on('close', function (code) { console.log('child process exited with code ' + code); }); 

这个脚本可以正常工作 – simple-server.js监听和回答邮件查询,所以我想问一下:你如何创build你的chroot环境? 我使用Debian的debootstrap工具创build了我的:

 cd /mnt/chroot/ debootstrap wheezy ./wheezy-chroot http://ftp.us.debian.org/debian cd wheezy-chroot 

然后像往常一样mount proc,sys和dev:

 mount -t proc none proc mount --rbind /dev dev mount --rbind /sys sys 

还挂载了/usr/local/以获得对node访问权限。 我build议“将绑定库及其所有依赖关系也放入监狱”。 声明意味着挂载所有你需要的东西,例如mount -o bind /usr/local /mnt/chroot/wheezy-chroot/usr/local在我的情况下。

万一我完全错过了我的答案,我会离开这个链接: https : //github.com/magne4000/node-jail – 可能你觉得这个包有用。

而最后一件事:据我所知,在某些情况下, chroot并不是安全的解决scheme( http://en.wikipedia.org/wiki/Chroot#Limitations )。 可能你应该看看像FreeBSD Jail甚至LXC这样的机制。

我不知道孩子过程中的chroot。

但是对于使用chroot npm包,我发现如果我在chroot之前做了一个dns.lookup() ,那么即使在chroot之后,dns查找也能正常工作。

在chroot之前, dns.lookup()会将getaddrinfo()所需的库加载到内存中。

Interesting Posts