小型网络科学上网方案之ipv6篇

简述

这是适合小型网络(公司办公室或家庭)的”科学上网”方案之一的ipv6方案,此方案是我极同事搞的,我这里主要是学习,然后做过在路由器上封来自于公网ipv6网往小型网络内部的机器(都有正式ipv6地址)的访问。

点评下:
思路灰常灵活,非常适用于办公网、家庭网的“科学上网”方案

所用资源

  1. 路由器
    • 极一(跑openwrt)
    • ip地址(私网):10.0.0.5
    • ip地址(公网):3.3.3.3
  2. 虚机
    • IPV6
    • 2.2.2.2
    • dnscrypt-wrapper(optional)
      • 用来配合 dnscrypt-proxy 直连,破除 dns 污染
  3. DNSCrypt-proxy(optional)
    • 解决某些域名被 dns 污染的问题。
  4. HE的账号
地址https://www.tunnelbroker.net/
账号xxxxxx
email[email protected]
prefix2001:xxx:xxxx::/48
server’s ipv4 address1.1.1.1
server’s ipv6 address2001:xxx:xx:xxx::1/64
client’s ipv4 address2.2.2.2
client’s ipv6 address2001:xxx:xx:xxx::2/64

原理

  • 通过虚机(我司在oneasiahost买的,ip:2.2.2.2)从HE(HURRICANE ELECTRIC INTERNET SERVICES)的IPv6 Tunnel Broker上申请一段免费的ipv6地址(/48的)
  • 然后通过小型网络内的路由器(ip是3.3.3.3)分配给局域网的客户端
  • 路由器通过sit tunnel打到虚机2.2.2.2上
  • 虚机2.2.2.2上起iptables,将sit过来的包(来自3.3.3.3)都转给HE(ip这里是:1.1.1.1)

详细配置

客户端

简单说,客户端只要接入此小型网络,并在本地启用了ipv6协议即可。

路由器

  • sit tunnel(文件/etc/config/network里)

    1
    2
    3
    4
    5
    6
    config interface 'sit1'
    option proto '6in4'
    option peeraddr '2.2.2.2'
    option ip6addr '2001:xxx:xx:xxx::2/64'
    option ip6prefix '2001:xxx:xxxx::/48'
    # option defaultroute '1'
  • iptables

    1
    2
    3
    # 允许sit1对端的机器的包出入路由器
    iptables -A INPUT -s 2.2.2.2/32 -i 6in4-sit1 -p ipv6 -j ACCEPT
    iptables -A OUTPUT -d 2.2.2.2/32 -o 6in4-sit1 -p ipv6 -j ACCEPT
  • ip6tables

    1
    2
    3
    4
    5
    6
    ip6tables -A INPUT -i 6in4-sit1 -m state --state RELATED,ESTABLISHED -j ACCEPT
    ip6tables -A INPUT -i 6in4-sit1 -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -j DROP
    ip6tables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
    ip6tables -A INPUT -p ipv6-icmp -m icmp6 --icmpv6-type 128 -m limit --limit 30/min -j ACCEPT
    ip6tables -A FORWARD -i 6in4-sit1 -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -j DROP
    ip6tables -A OUTPUT -o 6in4-sit1 -p ipv6-icmp -j ACCEPT

虚机

iptables中的NAT表中

1
iptables -A PREROUTING -s 3.3.3.3/29 -p ipv6 -j DNAT --to-destination 1.1.1.1

起 dnscrypt-wrapper:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
yum -y install libsodium libevent;
# 准备软件环境
cd /root;
git clone --recursive git://github.com/cofyc/dnscrypt-wrapper.git;
cd dnscrypt-wrapper;
make configure;
./configure;
make install;
# 安装 dnscrypt-wrapper
dnscrypt-wrapper --gen-provider-keypair;
dnscrypt-wrapper --gen-crypt-keypair --crypt-secretkey-file=1.key;
dnscrypt-wrapper --gen-cert-file \
--crypt-secretkey-file=1.key \
--provider-cert-file=1.cert \
--provider-publickey-file=public.key \
--provider-secretkey-file=secret.key \
--cert-file-expire-days=3650;
dnscrypt-wrapper --resolver-address=8.8.8.8:53 \
--listen-address=0.0.0.0:443 \
--provider-name=2.dnscrypt-cert.xxxxxxxx.com \
--crypt-secretkey-file=1.key \
--provider-cert-file=1.cert \
-d;
# "xxxxxxxx.com" 是随意写的,只要整个名字跟别的不重即可
dnscrypt-wrapper --show-provider-publickey-fingerprint \
--provider-publickey-file public.key;
# 返回的 Provider public key fingerprint 记下来,跑 dnscrypt-proxy 时要用

DNSCrypt-proxy

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
wget --no-check-certificate https://download.dnscrypt.org/dnscrypt-proxy/old/dnscrypt-proxy-1.4.0.tar.bz2;
tar xjvf dnscrypt-proxy-1.4.0.tar.bz2;
cd dnscrypt-proxy-1.4.0;
./configure --prefix=/opt/dnscrypt;
make;
make install;
cd /opt/dnscrypt/sbin;
./dnscrypt-proxy --local-address=10.0.0.7:53 \
--resolver-address=2.2.2.2:443 \
--provider-name=2.dnscrypt-cert.xxxxxxxx.com \
--provider-key= \
B735:1140:206F:225D:3E2B:D822:D7FD:691E:A1C3:3CC8:D666:8D0C:BE04:BFAB:CA43:FB79 \
-d;

# "xxxxxxxx.com" 要跟前面的对应
# “B735:1140:206F:225D:3E2B:D822:D7FD:691E:A1C3:3CC8:D666:8D0C:BE04:BFAB:CA43:FB79”
# 是前面取的的 Provider public key fingerprint

这里的10.0.0.7是私网的一台机器,在私网的dns服务器上可以把被污染了的域名的dns解析请求forward到10.0.0.7的53端口上来即可解决dns污染问题。

HE

HE无需专门配置。

参考资料