Index: /trunk/src/VBox/NetworkServices/NAT/VBoxNetLwipNAT.cpp
===================================================================
--- /trunk/src/VBox/NetworkServices/NAT/VBoxNetLwipNAT.cpp	(revision 48240)
+++ /trunk/src/VBox/NetworkServices/NAT/VBoxNetLwipNAT.cpp	(revision 48241)
@@ -137,4 +137,7 @@
    private:
     struct proxy_options m_ProxyOptions;
+    struct sockaddr_in m_src4;
+    struct sockaddr_in6 m_src6;
+
     uint16_t m_u16Mtu;
     netif m_LwipNetIf;
@@ -699,4 +702,14 @@
 
     m_ProxyOptions.tftp_root = NULL;
+    m_ProxyOptions.src4 = NULL;
+    m_ProxyOptions.src6 = NULL;
+    memset(&m_src4, 0, sizeof(m_src4));
+    memset(&m_src6, 0, sizeof(m_src6));
+    m_src4.sin_family = AF_INET;
+    m_src6.sin6_family = AF_INET6;
+#if HAVE_SA_LEN
+    m_src4.sa_len = sizeof(m_src4);
+    m_src6.sa_len = sizeof(m_src6);
+#endif
 
     m_LwipNetIf.name[0] = 'N';
Index: /trunk/src/VBox/NetworkServices/NAT/proxytest.c
===================================================================
--- /trunk/src/VBox/NetworkServices/NAT/proxytest.c	(revision 48240)
+++ /trunk/src/VBox/NetworkServices/NAT/proxytest.c	(revision 48241)
@@ -35,4 +35,5 @@
 static SOCKET proxy_create_socket(int, int);
 
+volatile const struct proxy_options *g_proxy_options;
 static sys_thread_t pollmgr_tid;
 
@@ -48,5 +49,8 @@
     int status;
 
+    LWIP_ASSERT1(opts != NULL);
     LWIP_UNUSED_ARG(proxy_netif);
+
+    g_proxy_options = opts;
 
 #if 1
@@ -58,5 +62,5 @@
 #endif
 
-    if (opts != NULL && opts->tftp_root != NULL) {
+    if (opts->tftp_root != NULL) {
         tftpd_init(proxy_netif, opts->tftp_root);
     }
@@ -225,4 +229,6 @@
     socklen_t dst_sa_len;
     void *pdst_addr;
+    const struct sockaddr *psrc_sa;
+    socklen_t src_sa_len;
     int status;
     SOCKET s;
@@ -278,4 +284,22 @@
     }
     DPRINTF(("socket %d\n", s));
+
+    /* TODO: needs locking if dynamic modifyvm is allowed */
+    if (sdom == PF_INET6) {
+        psrc_sa = (const struct sockaddr *)g_proxy_options->src6;
+        src_sa_len = sizeof(struct sockaddr_in6);
+    }
+    else {
+        psrc_sa = (const struct sockaddr *)g_proxy_options->src4;
+        src_sa_len = sizeof(struct sockaddr_in);
+    }
+    if (psrc_sa != NULL) {
+        status = bind(s, psrc_sa, src_sa_len);
+        if (status == SOCKET_ERROR) {
+            DPRINTF(("socket %d: bind: %s\n", s, strerror(errno)));
+            closesocket(s);
+            return INVALID_SOCKET;
+        }
+    }
 
     status = connect(s, pdst_sa, dst_sa_len);
Index: /trunk/src/VBox/NetworkServices/NAT/proxytest.h
===================================================================
--- /trunk/src/VBox/NetworkServices/NAT/proxytest.h	(revision 48240)
+++ /trunk/src/VBox/NetworkServices/NAT/proxytest.h	(revision 48241)
@@ -15,7 +15,11 @@
 struct pbuf;
 struct sockaddr;
+struct sockaddr_in;
+struct sockaddr_in6;
 
 struct proxy_options {
     const char *tftp_root;
+    const struct sockaddr_in *src4;
+    const struct sockaddr_in6 *src6;
 };
 
