* [Qemu-devel] Transforming stdin and stdout pair into a socket @ 2009-05-10 18:19 Ciprian Dorin, Craciun 2009-05-11 8:03 ` [Qemu-devel] Re: [Nbd] " Laurent Vivier 2009-05-11 12:02 ` [Qemu-devel] " Anthony Liguori 0 siblings, 2 replies; 8+ messages in thread From: Ciprian Dorin, Craciun @ 2009-05-10 18:19 UTC (permalink / raw) To: linux-newbie; +Cc: nbd-general, qemu-devel Hello all! Today I've played around with NBD (Network Block Disk), and qemu-nbd (a NBD client that exports QEMU disks as NBD's). My problem is the following: both NBD kernel module and qemu-nbd implementation expect to use a socket in order to communicate. This means that in order to securely tunnel the connection over SSH (OpenSSH), I need an intermediary process that creates a socket and forwards all input / output between this socket and stdin / stdout (which are in fact pipes received from OpenSSH). My question is: can I somehow make the pair of stdin / stdout seem as a socket to the Linux syscalls (read and write)? (I would have to make stdin / stdout pair look like a single file descriptor.) (This would eliminate the intermediate process that just pipes data, and thus reduce the overhead.) Just to be clear: I know how to trick an application to have it's stdin and stdout be an opened socket (by using dup syscall). But in this case I need to trick the Linux kernel into thinking that stdin / stdout pair is a socket (or a single file descriptor). Thank you, Ciprian Craciun. ^ permalink raw reply [flat|nested] 8+ messages in thread
* [Qemu-devel] Re: [Nbd] Transforming stdin and stdout pair into a socket 2009-05-10 18:19 [Qemu-devel] Transforming stdin and stdout pair into a socket Ciprian Dorin, Craciun @ 2009-05-11 8:03 ` Laurent Vivier 2009-05-11 13:28 ` Ciprian Dorin, Craciun 2009-05-11 12:02 ` [Qemu-devel] " Anthony Liguori 1 sibling, 1 reply; 8+ messages in thread From: Laurent Vivier @ 2009-05-11 8:03 UTC (permalink / raw) To: Ciprian Dorin, Craciun; +Cc: nbd-general, linux-newbie, qemu-devel [-- Attachment #1: Type: text/plain, Size: 2270 bytes --] Le dimanche 10 mai 2009 à 21:19 +0300, Ciprian Dorin, Craciun a écrit : > Hello all! Hi, perhaps the attached patch I wrote last year (november) is what you want... I didn't try to apply it to an up-to-date qemu-nbd. Regards, Laurent > Today I've played around with NBD (Network Block Disk), and > qemu-nbd (a NBD client that exports QEMU disks as NBD's). > > My problem is the following: both NBD kernel module and qemu-nbd > implementation expect to use a socket in order to communicate. > This means that in order to securely tunnel the connection over > SSH (OpenSSH), I need an intermediary process that creates a socket > and forwards all input / output between this socket and stdin / stdout > (which are in fact pipes received from OpenSSH). > > My question is: can I somehow make the pair of stdin / stdout seem > as a socket to the Linux syscalls (read and write)? (I would have to > make stdin / stdout pair look like a single file descriptor.) (This > would eliminate the intermediate process that just pipes data, and > thus reduce the overhead.) > > Just to be clear: I know how to trick an application to have it's > stdin and stdout be an opened socket (by using dup syscall). But in > this case I need to trick the Linux kernel into thinking that stdin / > stdout pair is a socket (or a single file descriptor). > > Thank you, > Ciprian Craciun. > > ------------------------------------------------------------------------------ > The NEW KODAK i700 Series Scanners deliver under ANY circumstances! Your > production scanning environment may not be a perfect world - but thanks to > Kodak, there's a perfect scanner to get the job done! With the NEW KODAK i700 > Series Scanner you'll get full speed at 300 dpi even with all image > processing features enabled. http://p.sf.net/sfu/kodak-com > _______________________________________________ > Nbd-general mailing list > Nbd-general@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/nbd-general > -- ------------------ Laurent.Vivier@bull.net ------------------ "Tout ce qui est impossible reste à accomplir" Jules Verne "Things are only impossible until they're not" Jean-Luc Picard [-- Attachment #2: qemu-nbd-inetd.patch --] [-- Type: text/x-vhdl, Size: 3645 bytes --] --- qemu-nbd.c | 41 +++++++++++++++++++++++++++++++++++------ 1 file changed, 35 insertions(+), 6 deletions(-) Index: qemu/qemu-nbd.c =================================================================== --- qemu.orig/qemu-nbd.c 2008-09-11 17:06:05.000000000 +0200 +++ qemu/qemu-nbd.c 2008-09-15 16:10:37.000000000 +0200 @@ -57,6 +57,7 @@ static void usage(const char *name) " -d, --disconnect disconnect the specified device\n" " -e, --shared=NUM device can be shared by NUM clients (default '1')\n" " -t, --persistent don't exit on the last connection\n" +" -i, --inetd inetd interface: use stdin/stdout instead of a socke\n" " -v, --verbose display extra debugging information\n" " -h, --help display this help and exit\n" " -V, --version output version information and exit\n" @@ -183,14 +184,14 @@ int main(int argc, char **argv) bool readonly = false; bool disconnect = false; const char *bindto = "0.0.0.0"; - int port = 1024; + int port = 0; struct sockaddr_in addr; socklen_t addr_len = sizeof(addr); off_t fd_size; char *device = NULL; char *socket = NULL; char sockpath[128]; - const char *sopt = "hVbo:p:rsnP:c:dvk:e:t"; + const char *sopt = "hVbo:p:rsnP:c:dvk:e:ti"; struct option lopt[] = { { "help", 0, 0, 'h' }, { "version", 0, 0, 'V' }, @@ -207,6 +208,7 @@ int main(int argc, char **argv) { "shared", 1, 0, 'e' }, { "persistent", 0, 0, 't' }, { "verbose", 0, 0, 'v' }, + { "inetd", 0, 0, 'i' }, { NULL, 0, 0, 0 } }; int ch; @@ -225,6 +227,7 @@ int main(int argc, char **argv) int nb_fds = 0; int max_fd; int persistent = 0; + int inetd = 0; while ((ch = getopt_long(argc, argv, sopt, lopt, &opt_ind)) != -1) { switch (ch) { @@ -289,6 +292,9 @@ int main(int argc, char **argv) case 't': persistent = 1; break; + case 'i': + inetd = 1; + break; case 'v': verbose = 1; break; @@ -326,6 +332,18 @@ int main(int argc, char **argv) return 0; } + if (inetd) { + if (shared != 1) + errx(EINVAL, "You cannot use inetd and shared"); + if (socket) + errx(EINVAL, "You cannot use inetd and socket"); + if (port) + errx(EINVAL, "You cannot use inetd and port"); + } else { + if (!socket) + port = 1024; + } + bdrv_init(); bs = bdrv_new("hda"); @@ -412,9 +430,24 @@ int main(int argc, char **argv) if (sharing_fds == NULL) errx(ENOMEM, "Cannot allocate sharing fds"); + data = qemu_memalign(512, NBD_BUFFER_SIZE); + if (data == NULL) + errx(ENOMEM, "Cannot allocate data buffer"); + if (socket) { sharing_fds[0] = unix_socket_incoming(socket); } else { + if (inetd) { + /* read and write on stdin/stdout */ + ret = nbd_negotiate(STDIN_FILENO, fd_size); + while (ret != -1) { + ret = nbd_trip(bs, STDIN_FILENO, fd_size, dev_offset, + &offset, readonly, data, NBD_BUFFER_SIZE); + } + qemu_free(data); + bdrv_close(bs); + return 0; + } sharing_fds[0] = tcp_socket_incoming(bindto, port); } @@ -423,10 +456,6 @@ int main(int argc, char **argv) max_fd = sharing_fds[0]; nb_fds++; - data = qemu_memalign(512, NBD_BUFFER_SIZE); - if (data == NULL) - errx(ENOMEM, "Cannot allocate data buffer"); - do { FD_ZERO(&fds); ^ permalink raw reply [flat|nested] 8+ messages in thread
* [Qemu-devel] Re: [Nbd] Transforming stdin and stdout pair into a socket 2009-05-11 8:03 ` [Qemu-devel] Re: [Nbd] " Laurent Vivier @ 2009-05-11 13:28 ` Ciprian Dorin, Craciun 0 siblings, 0 replies; 8+ messages in thread From: Ciprian Dorin, Craciun @ 2009-05-11 13:28 UTC (permalink / raw) To: Laurent Vivier; +Cc: nbd-general, linux-newbie, qemu-devel On Mon, May 11, 2009 at 11:03 AM, Laurent Vivier <Laurent.Vivier@bull.net> wrote: > Le dimanche 10 mai 2009 à 21:19 +0300, Ciprian Dorin, Craciun a écrit : >> Hello all! > > Hi, > > perhaps the attached patch I wrote last year (november) is what you > want... > > I didn't try to apply it to an up-to-date qemu-nbd. > > Regards, > Laurent > >> Today I've played around with NBD (Network Block Disk), and >> qemu-nbd (a NBD client that exports QEMU disks as NBD's). >> >> My problem is the following: both NBD kernel module and qemu-nbd >> implementation expect to use a socket in order to communicate. >> This means that in order to securely tunnel the connection over >> SSH (OpenSSH), I need an intermediary process that creates a socket >> and forwards all input / output between this socket and stdin / stdout >> (which are in fact pipes received from OpenSSH). >> >> My question is: can I somehow make the pair of stdin / stdout seem >> as a socket to the Linux syscalls (read and write)? (I would have to >> make stdin / stdout pair look like a single file descriptor.) (This >> would eliminate the intermediate process that just pipes data, and >> thus reduce the overhead.) >> >> Just to be clear: I know how to trick an application to have it's >> stdin and stdout be an opened socket (by using dup syscall). But in >> this case I need to trick the Linux kernel into thinking that stdin / >> stdout pair is a socket (or a single file descriptor). >> >> Thank you, >> Ciprian Craciun. >> >> ------------------------------------------------------------------------------ >> The NEW KODAK i700 Series Scanners deliver under ANY circumstances! Your >> production scanning environment may not be a perfect world - but thanks to >> Kodak, there's a perfect scanner to get the job done! With the NEW KODAK i700 >> Series Scanner you'll get full speed at 300 dpi even with all image >> processing features enabled. http://p.sf.net/sfu/kodak-com >> _______________________________________________ >> Nbd-general mailing list >> Nbd-general@lists.sourceforge.net >> https://lists.sourceforge.net/lists/listinfo/nbd-general >> > -- > ------------------ Laurent.Vivier@bull.net ------------------ > "Tout ce qui est impossible reste à accomplir" Jules Verne > "Things are only impossible until they're not" Jean-Luc Picard Well, very clever! :) From what I've seen you are actually using the stdin as the socket descriptor, knowing that if qemu-nbd was started with the -i flag it means that inetd has already set both stdin and stdout to a real socket, and thus everything works Ok. Unfortunately this works only with inetd (or compatible system) without any SSL/TLS wrapping. My problem is that if the stdin and stdout are instead pipes (as it would happen in case of sshd?, or socat with SSL connector?) this would not work... Thank you for the idea. I could use if I don't find another solution. Ciprian. ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [Qemu-devel] Transforming stdin and stdout pair into a socket 2009-05-10 18:19 [Qemu-devel] Transforming stdin and stdout pair into a socket Ciprian Dorin, Craciun 2009-05-11 8:03 ` [Qemu-devel] Re: [Nbd] " Laurent Vivier @ 2009-05-11 12:02 ` Anthony Liguori 2009-05-11 13:32 ` Ciprian Dorin, Craciun 1 sibling, 1 reply; 8+ messages in thread From: Anthony Liguori @ 2009-05-11 12:02 UTC (permalink / raw) To: Ciprian Dorin, Craciun; +Cc: nbd-general, linux-newbie, qemu-devel Ciprian Dorin, Craciun wrote: > Hello all! > > Today I've played around with NBD (Network Block Disk), and > qemu-nbd (a NBD client that exports QEMU disks as NBD's). > > My problem is the following: both NBD kernel module and qemu-nbd > implementation expect to use a socket in order to communicate. > This means that in order to securely tunnel the connection over > SSH (OpenSSH), I need an intermediary process that creates a socket > and forwards all input / output between this socket and stdin / stdout > (which are in fact pipes received from OpenSSH). > > My question is: can I somehow make the pair of stdin / stdout seem > as a socket to the Linux syscalls (read and write)? (I would have to > make stdin / stdout pair look like a single file descriptor.) (This > would eliminate the intermediate process that just pipes data, and > thus reduce the overhead.) > Something like socat should to do the trick. For instance, if you have qemu-nbd on localhost:1025: ssh -l user hostname.com socat stdio tcp:localhost:1025 Alternative, you could just do ssh based port forwarding. For instance: ssh -l user -L 1025:localhost:1025 hostname.com And then connect locally with nbd-client Regards, Anthony Liguori ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [Qemu-devel] Transforming stdin and stdout pair into a socket 2009-05-11 12:02 ` [Qemu-devel] " Anthony Liguori @ 2009-05-11 13:32 ` Ciprian Dorin, Craciun 2009-05-11 19:31 ` [Nbd] " Wouter Verhelst 2009-05-11 23:07 ` Paul Brook 0 siblings, 2 replies; 8+ messages in thread From: Ciprian Dorin, Craciun @ 2009-05-11 13:32 UTC (permalink / raw) To: Anthony Liguori; +Cc: nbd-general, linux-newbie, qemu-devel On Mon, May 11, 2009 at 3:02 PM, Anthony Liguori <anthony@codemonkey.ws> wrote: > Ciprian Dorin, Craciun wrote: >> >> Hello all! >> >> Today I've played around with NBD (Network Block Disk), and >> qemu-nbd (a NBD client that exports QEMU disks as NBD's). >> >> My problem is the following: both NBD kernel module and qemu-nbd >> implementation expect to use a socket in order to communicate. >> This means that in order to securely tunnel the connection over >> SSH (OpenSSH), I need an intermediary process that creates a socket >> and forwards all input / output between this socket and stdin / stdout >> (which are in fact pipes received from OpenSSH). >> >> My question is: can I somehow make the pair of stdin / stdout seem >> as a socket to the Linux syscalls (read and write)? (I would have to >> make stdin / stdout pair look like a single file descriptor.) (This >> would eliminate the intermediate process that just pipes data, and >> thus reduce the overhead.) >> > > Something like socat should to do the trick. > > For instance, if you have qemu-nbd on localhost:1025: > > ssh -l user hostname.com socat stdio tcp:localhost:1025 > > Alternative, you could just do ssh based port forwarding. For instance: > > ssh -l user -L 1025:localhost:1025 hostname.com > > And then connect locally with nbd-client > > Regards, > > Anthony Liguori I've seen socat, and I could use it as you described. My only objection to this solution is that there is an unneeded process in the middle that just pipes data around... (Instead of socat, I think it would be more efficient to just write a simple application that uses the "new" Linux syscall "splice" that I've just found by mistake yesterday...) About the other solution with SSH port forwarding, I don't really like it, because it has some security implications: any process on the local machine can access the block device... (I know I can use iptables to actually restrict the process.) Still on the same topic I would have liked something like UNIX domain socket forwarding for SSH. (Which is available as a patch but on top of an older version...) Ciprian. ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [Nbd] [Qemu-devel] Transforming stdin and stdout pair into a socket 2009-05-11 13:32 ` Ciprian Dorin, Craciun @ 2009-05-11 19:31 ` Wouter Verhelst 2009-05-11 23:07 ` Paul Brook 1 sibling, 0 replies; 8+ messages in thread From: Wouter Verhelst @ 2009-05-11 19:31 UTC (permalink / raw) To: Ciprian Dorin, Craciun; +Cc: nbd-general, linux-newbie, qemu-devel On Mon, May 11, 2009 at 04:32:26PM +0300, Ciprian Dorin, Craciun wrote: > About the other solution with SSH port forwarding, I don't really > like it, because it has some security implications: any process on the > local machine can access the block device... That's still the case even if you do not use SSH port forwarding; NBD does not actually implement anything remotely resembling security at this point. I've had plans to implement username/password authentication in nbd-server and nbd-client, and there's even an implementation floating around somewhere (written by someone else), but it still needs some work and isn't finished. Additionally, I'd have to be able to get a patch into qemu-nbd.c so that it'd support that kind of authentication, too. -- <Lo-lan-do> Home is where you have to wash the dishes. -- #debian-devel, Freenode, 2004-09-22 ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [Qemu-devel] Transforming stdin and stdout pair into a socket 2009-05-11 13:32 ` Ciprian Dorin, Craciun 2009-05-11 19:31 ` [Nbd] " Wouter Verhelst @ 2009-05-11 23:07 ` Paul Brook 2009-05-12 2:24 ` Anthony Liguori 1 sibling, 1 reply; 8+ messages in thread From: Paul Brook @ 2009-05-11 23:07 UTC (permalink / raw) To: qemu-devel; +Cc: nbd-general, Ciprian Dorin, Craciun, linux-newbie > I've seen socat, and I could use it as you described. My only > objection to this solution is that there is an unneeded process in the > middle that just pipes data around... > > (Instead of socat, I think it would be more efficient to just write > a simple application that uses the "new" Linux syscall "splice" that > I've just found by mistake yesterday...) In that case you need to fix socat to use splice() when available. I have a hard time believing socat adds measurable overhead, especially if you're already tunnelling over ssh. Paul ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [Qemu-devel] Transforming stdin and stdout pair into a socket 2009-05-11 23:07 ` Paul Brook @ 2009-05-12 2:24 ` Anthony Liguori 0 siblings, 0 replies; 8+ messages in thread From: Anthony Liguori @ 2009-05-12 2:24 UTC (permalink / raw) To: Paul Brook; +Cc: nbd-general, Ciprian Dorin, Craciun, linux-newbie, qemu-devel Paul Brook wrote: >> I've seen socat, and I could use it as you described. My only >> objection to this solution is that there is an unneeded process in the >> middle that just pipes data around... >> >> (Instead of socat, I think it would be more efficient to just write >> a simple application that uses the "new" Linux syscall "splice" that >> I've just found by mistake yesterday...) >> > > In that case you need to fix socat to use splice() when available. I have a > hard time believing socat adds measurable overhead, especially if you're > already tunnelling over ssh. > splice() doesn't really buy you anything when copying from a socket to another socket. The data is going to get copied just like it would if you dropped to userspace. It's useful if you introduce pipe-to-pipe copies because they'll be eliminated but if you're going from socket -> pipe -> socket it'll be the same as using socat. Regards, Anthony Liguori > Paul > ^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2009-05-12 2:24 UTC | newest] Thread overview: 8+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2009-05-10 18:19 [Qemu-devel] Transforming stdin and stdout pair into a socket Ciprian Dorin, Craciun 2009-05-11 8:03 ` [Qemu-devel] Re: [Nbd] " Laurent Vivier 2009-05-11 13:28 ` Ciprian Dorin, Craciun 2009-05-11 12:02 ` [Qemu-devel] " Anthony Liguori 2009-05-11 13:32 ` Ciprian Dorin, Craciun 2009-05-11 19:31 ` [Nbd] " Wouter Verhelst 2009-05-11 23:07 ` Paul Brook 2009-05-12 2:24 ` Anthony Liguori
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).