LOADING

Follow me

【转载】AWS中国区私有子网+NAT模式优化国际线路
三月 19, 2017|DockerPaaS

【转载】AWS中国区私有子网+NAT模式优化国际线路

【转载】AWS中国区私有子网+NAT模式优化国际线路

本文不涉及任何请求非法站点的方法,仅仅是为了优化访问docker hub或者s3的速度。帮助广大国内企业提高效率。

由于众所周知的原因,在国内访问很多境外的互联网服务非常的不顺畅。我们一直在大规模使用Docker,每次docker pull的时候的速度与成功率都像噩梦一样。尤其是最近正在从早期的Swarm集群转变为Kubernetes,部署的时候简直……。天朝科技人都不易。因此,也就有了这篇文章。
我的思路是:AWS私有子网+公有子网的VPC,私有子网中的EC2是通过公有子网中的NAT主机(也是一台EC2)作为出口请求公网资源的。那么,在这台NAT机器上动手脚应该可以解决问题。

基本要求:
至少有一个SS服务器(高技术的都会有吧……)
在AWS中国区直接用VPC创建向导创建一个包含私有+公有子网的VPC,并且在公有子网中有作为NAT的EC2,且私有子网中的EC2可以通过NAT请求公网。

直接上步骤,配以简单说明。以下内容都在NAT主机上操作:

yum upgrade -y  cat >>/etc/security/limits.conf<<eof * soft nproc 65535 * hard nproc 65535 * soft nofile 65535 * hard nofile 65535 eof  echo "fs.file-max=65535" >> /etc/sysctl.conf  #编译安装shadowsocksr-libev  yum install -y epel-release  yum install -y git vim screen gettext gcc autoconf libtool automake make asciidoc xmlto udns-devel libev-devel zlib-devel openssl-devel unzip libevent pcre pcre-devel perl perl-devel cpio expat-devel gettext-devel htop  cd /tmp  wget https://tls.mbed.org/download/mbedtls-2.4.2-apache.tgz tar zxf mbedtls-2.4.2-apache.tgz rm -rf mbedtls-2.4.2-apache.tgz cd mbedtls-2.4.2 make && make install cd .. rm -rf mbedtls-2.4.2  git clone https://github.com/jedisct1/libsodium.git cd libsodium ./autogen.sh ./configure --prefix=/usr/ make && make install ldconfig cd .. rm -rf libsodium  git clone https://github.com/shadowsocksr/shadowsocksr-libev.git cd shadowsocksr-libev git submodule update --init --recursive git checkout 2.4.1 ./autogen.sh ./configure make && make install cd ..  git clone https://github.com/shadowsocks/libudns.git cd libudns/ ./autogen.sh ./configure make && make install cd .. ldconfig  wget https://fossies.org/linux/misc/libev-4.24.tar.gz tar xfzv libev-4.24.tar.gz cd libev-4.24 ./configure make && make install cd .. ldconfig  git clone https://github.com/shadowsocks/simple-obfs.git cd simple-obfs git submodule update --init --recursive ./autogen.sh ./configure make && make install cd ..  #安装NODEJS  curl -sL https://rpm.nodesource.com/setup_6.x | bash - yum install -y gcc-c++ make yum install -y nodejs  #安装Redis  wget http://download.redis.io/releases/redis-3.2.8.tar.gz tar xfzv redis-3.2.8.tar.gz cd redis-3.2.8 make && make install cd ..  touch /etc/redis.conf cat >> /etc/redis.conf<<eof daemonize yes eof  #安装dnskeeper(一个DNS服务器,可以分别解析境内外域名)  wget https://github.com/billtt/dnskeeper/archive/master.zip unzip master.zip mv dnskeeper-master /usr/local/dnskeeper cd /usr/local/dnskeeper/ alias cnpm="npm --registry=https://registry.npm.taobao.org --cache=$HOME/.npm/.cache/cnpm --disturl=https://npm.taobao.org/dist --userconfig=$HOME/.cnpmrc" cnpm install touch ./config/production.json cat >>./config/production.json<<eof {   "debug": true,   "host": "$NAT主机的内网IP$",   "port": 53,   "fastResponse": true,   "foreignServer": {     "address": "127.0.0.1",     "port": 15353,     "type": "udp",     "memo": "Local"   },   "domesticServer": {     "address": "$AWS内网的DNS$",     "port": 53,     "type": "udp",     "memo": "AWS"   },   "static": {     "ttl": 120,     "table": {       "t.e.s.t": "1.2.3.4"     }   },   "cache": {     "host": "localhost",     "port": 6379,     "options": {}   },   "extraGFWRules": "/etc/gfwrules.list" } eof  curl https://raw.githubusercontent.com/gfwlist/gfwlist/master/gfwlist.txt > GFWBasicRules.list  cd /tmp  cnpm install forever -g  #安装IPSET 用来保存国内IP段  yum install ipset  wget https://raw.githubusercontent.com/shadowsocks/ChinaDNS/master/chnroute.txt  ipset create chnroute hash:net cat chnroute.txt | xargs -I ip ipset add chnroute ip ipset save chnroute > /etc/chnroute.ipset

目前环境就配置完毕了。创建一个脚本 vi /usr/local/sbin/nat.sh 内容如下:

#!/bin/bash  nohup /usr/local/bin/ss-redir -s $SS_SERVER -p $SS_PORT -l 12345 -k $SS_PASSWD -m $SS_METHOD -t 30 -b 0.0.0.0 &>> /var/log/ss-redir.log & nohup /usr/local/bin/ss-tunnel -s $SS_SERVER -p $SS_PORT -l 15353 -k $SS_PASSWD -m $SS_METHOD -t 30 -b 0.0.0.0 -u -L 8.8.8.8:53 &>> /var/log/ss-tunnel.log &  /usr/local/bin/redis-server /etc/redis.conf /usr/local/dnskeeper/service-dns-server.sh start  cat >/etc/resolv.conf<<eof search cn-north-1.compute.internal options timeout:2 attempts:5 nameserver $NAT主机内网IP eof  ipset restore < /etc/chnroute.ipset  iptables -t nat -N SHADOWSOCKS  iptables -t nat -A SHADOWSOCKS -p tcp --dport $SS_PORT -j RETURN iptables -t nat -A SHADOWSOCKS -d 0.0.0.0/8 -j RETURN iptables -t nat -A SHADOWSOCKS -d 10.0.0.0/8 -j RETURN iptables -t nat -A SHADOWSOCKS -d 127.0.0.0/8 -j RETURN iptables -t nat -A SHADOWSOCKS -d 169.254.0.0/16 -j RETURN iptables -t nat -A SHADOWSOCKS -d 172.16.0.0/12 -j RETURN iptables -t nat -A SHADOWSOCKS -d 172.31.0.0/16 -j RETURN iptables -t nat -A SHADOWSOCKS -d 172.32.0.0/16 -j RETURN iptables -t nat -A SHADOWSOCKS -d 172.1.0.0/16 -j RETURN iptables -t nat -A SHADOWSOCKS -d 192.168.0.0/16 -j RETURN iptables -t nat -A SHADOWSOCKS -d 224.0.0.0/4 -j RETURN iptables -t nat -A SHADOWSOCKS -d 240.0.0.0/4 -j RETURN iptables -t nat -A SHADOWSOCKS -m set --match-set chnroute dst -j RETURN iptables -t nat -A SHADOWSOCKS -p tcp -j REDIRECT --to-ports 12345  iptables -t nat -I PREROUTING -p tcp -j SHADOWSOCKS

之后赋予这个脚本可执行权限,加入到/etc/rc.local去,重启NAT主机。
重启完毕之后看看各个服务是不是正常运行,如果没有问题,就去试试看吧。用私有子网中的一个EC2,将它的DNS SERVER的IP设置为NAT主机的内网IP,之后访问公网。
可以curl myip.ipip.net,你会看到它识别的仍然是你的NAT主机的公网IP,因为这个服务是境内的,自动没有走SS。
再找一个境外的命令行查看IP的业务,你会发现你的IP变成了SS_SERVER的IP了。
docker pull一下官方HUB的镜像吧,丝般顺滑!

no comments
Share

发表评论