有squid使用通过隧道连接的IPv6 / 48块

我有一个运行Squid的Ubuntu 14.05服务器。 它通过Hurricane Electric的服务提供IPv6连接。 我试图让他们提供的/ 48服务器的每个IP。

我search了显着,并没有find一个工作的解决scheme。 如果我在/ etc / network / interfaces中单独设置了IP地址,我可以使用/ 48中的任何地址,尽pipe试图在/ blank下添加/ 48仍然没有工作。 inheritance人我的工作conf。

auto he-ipv6 iface he-ipv6 inet6 v4tunnel address 2xxx:xxx:xxx:0:0:0:0:1 netmask 64 endpoint xx.xx.xx.xx local xx.xx.xx.xx ttl 255 gateway 2xxx:xxx:xxxx:xxxx::1 

在试图分配/ 48我已经尝试将其添加到接口

  post-up ip -6 addr add 2001:xx:xx::/48 

这个问题build议使用ipv6非本地绑定选项,或绑定本地接口,我试过这个例子,虽然我不确定使用net.ipv6.ip_nonlocal_bind选项。

 /sbin/ip -6 addr add 2001:db8::ffff:1/64 dev lo 

使用wget –bind-addresstesting[范围内的连衣裙] google.com我得到以下

 --2017-02-04 15:07:26-- (try: 3) http://ipv6.google.com/ Connecting to ipv6.google.com (ipv6.google.com)|2a00:1450:4001:814::200e|:80... failed: Cannot assign requested address. Retrying. 

没有骰子。 我看错了吗? 有没有人有build议?

首先你需要明白从HE收到的三个前缀并不完全一样。

您已分配一个/64连接前缀。 这是您在隧道接口上应该使用的唯一前缀。

您还被分配了两个路由前缀一个/64和一个/48 。 你可以在这个问题上阅读更多关于链路前缀和路由前缀之间的区别: IPv6:“路由前缀”和“链路前缀”之间的区别?

路由/64可以直接用作另一个连接的networking接口上的链路前缀。 /48可根据需要细分为其他路由和链路前缀。

如果您需要一个主机上的大量地址,您应该从路由前缀之一中分配一个本地前缀。 我强烈build议不要使用短于/64的前缀。 本地前缀可以比/64更长。

添加本地路由的命令可能如下所示:

 ip -6 route add to local 2001:db8:f918:b1e2:086a:cee6::/96 dev lo 

你可以阅读更多有关在这个问题中使用本地路由: 添加一个完整的IPv6 / 64块到debian上的networking接口

监听::应用程序将接收本地路由前缀中的任何IP的stream量。 如果您需要显式绑定到本地路由覆盖的单个IP地址,则应用程序必须设置套接字选项。

我想做同样的事情,并成功修改了Squid来实现这一点。 我使用了Squid 3的Debian软件包的源代码(版本3.4.8-6 + deb8u4)。 只要您使用与wget相同的networkingconfiguration,就可以工作。 你不需要分配你想要使用的每个IP到你的networking接口。 对不起,没有提供适当的补丁,但这是我做的。

src/FwdState.cc ,在getOutgoingAddress()函数的开始处,我添加了这个:

 String ipv6; ipv6 = request->header.getByName("IPV6-Bind"); if (ipv6 != "") { AclAddress l; struct sockaddr_in6 sa6; inet_pton(AF_INET6, ipv6.rawBuf(), &(sa6.sin6_addr)); /* don't do conn->local = sa6 because of operator overloading */ l.addr = sa6; conn->local = l.addr; ipv6.clean(); conn->flags |= COMM_FREEBIND; return; } ipv6.clean(); 

我还在src/FwdState.cc的顶部添加了头文件#include <arpa/inet.h>

然后,在src/comm.cc ,我在comm_openex()中添加了这个代码块,在创buildsocket之后(即在new_socket = socket(AI->ai_family, AI->ai_socktype, AI->ai_protocol); ):

 if ((flags & COMM_FREEBIND)) { int v = 1; if (setsockopt(new_socket, SOL_IP, IP_FREEBIND, (char *) &v, sizeof(v)) < 0) { debugs(50, DBG_IMPORTANT, "comm_openex: setsockopt() on FD " << new_socket << ": " << xstrerror()); } } 

最后,在src/comm/Connection.h ,我添加了这个:

 #define COMM_FREEBIND 0x40 

通过这些修改,您可以通过向请求添加名为IPV6-Bind的HTTP标头来selectIPv6源地址。 例如: IPV6-Bind: 2001:db8:f918:b1e2:086a:cee6::1

你可以用wget来testing:

 http_proxy='http://localhost:3128' wget -4 --header="IPV6-Bind: 2001:db8:f918:b1e2:086a:cee6::1" http://whatismyip.org/ 

注意:你应该能够通过在你的squid.conf中使用request_header_access指令来阻止IPV6-Bind头部被发送到网站。