阿里云主机没有公网IP,如何上网,或者做apt-get update更新。

前提:

同区域下,必须有一个可以上网的有公网IP的服务器,一般这种情况都会有,否则这种内网配置只能是摆设了,想远程访问都不可能,所以至少有个跳板机。

A主机:

有公网IP,可以上网,内网IP => 10.144.66.8, 公网IP => x.x.x.x(用不到)。

B主机:

内网,无公网IP,IP => 10.144.35.17

方法:

一、开始尝试通过iptables转发所有请求包到代理

用redsoks,原文见:
https://dtbaker.net/blog/random-linux-posts/2010/07/redirect-all-traffic-through-transparent-socks5-proxy-in-linux/

经测试,这个方法在阿里云主机上无效,怀疑阿里云对iptables做过特殊处理,坑爹呀。但在我本地虚拟机里测试没问题。

所以,这个方法也简单记录下:

A. 启动redsocks

sudo apt-get install iptables git-core libevent-1.4-2 libevent-dev 
git clone http://github.com/darkk/redsocks.git
cd redsocks/
make 
echo 'base{log_debug = on; log_info = on; log = "file:/tmp/reddi.log"; 
       daemon = on; redirector = iptables;}
       redsocks { local_ip = 127.0.0.1; local_port = 31338; ip = 127.0.0.1; 
       port = 31337; type = socks5; }' > redsocks.conf
./redsocks -c redsocks.conf

B. 启动ssh socks转发

ssh -vN -D 31337 user@10.144.66.8   #换成你自己的账号和IP

C. 开iptables 转发

sudo iptables -t nat -N REDSOCKS
sudo iptables -t nat -A REDSOCKS -d 0.0.0.0/8 -j RETURN
sudo iptables -t nat -A REDSOCKS -d 10.0.0.0/8 -j RETURN
sudo iptables -t nat -A REDSOCKS -d 127.0.0.0/8 -j RETURN
sudo iptables -t nat -A REDSOCKS -d 169.254.0.0/16 -j RETURN
sudo iptables -t nat -A REDSOCKS -d 172.16.0.0/12 -j RETURN
sudo iptables -t nat -A REDSOCKS -d 192.168.0.0/16 -j RETURN
sudo iptables -t nat -A REDSOCKS -d 224.0.0.0/4 -j RETURN
sudo iptables -t nat -A REDSOCKS -d 240.0.0.0/4 -j RETURN
sudo iptables -t nat -A REDSOCKS -p tcp -o eth0 -j DNAT --to 127.0.0.1:31338
sudo iptables -t nat -A OUTPUT -p tcp -j REDSOCKS

这样,访问所有网站都会通过socks代理出去。

如果想让某个网站不走代理,如下:

ping tunnel4.wowtunnels.com #先ping出ip地址,如67.220.203.130
sudo iptables -t nat -I REDSOCKS -d 67.220.203.130 -j RETURN

二、配置http代理(保证好用)

A. 直接安装一个node的proxy,也另选自己最熟悉的。

privoxy适合http转socks 代理
privoxy用法,见我之前发过的文章 http://www.yinqisen.cn/blog-707.html

A主机上,安装 node-http-proxy

npm install -g node-http-proxy

启动代理,注意绑定的端口是所有的,注意安全,用完关闭:

nproxy start -p 8080

关闭代理

nproxy stop

这个步骤只是提示安装http代理

B. 配置apt-get,让B主机使用HTTP代理。

vi ~/.bashrc,添加如下代码:

function proxy_off(){
    unset http_proxy
    unset https_proxy
    unset ftp_proxy
    unset rsync_proxy
    echo -e "已关闭代理"
}

function proxy_on() {
    export no_proxy="localhost,127.0.0.1,localaddress,.localdomain.com"
    export http_proxy="http://127.0.0.1:8118"
    export https_proxy=$http_proxy
    export ftp_proxy=$http_proxy
    export rsync_proxy=$http_proxy
    echo -e "已开启代理"
}

使用的时候,需要开启http代理时,就在命令行输入:proxy_on

echo $http_proxy 检测必须有配置的值。

让apt使用http代理,原因是因为执行sudo apt-get update时,sudo的身份会清掉代理的环境变量,下面配置让sudo保持:

sudo visudo
Defaults        env_reset

# 添加下面这行:
Defaults        env_keep = "http_proxy https_proxy ftp_proxy"

这时候执行sudo apt-get update 就能正常更新了,上图:

Screen-Shot-2017-03-03-at-2.28.43-PM.png

转发请注明出处,否则禁止转载。

React Native 如何区分系统平台,动态加载组件

Android 平台下, React Native WebView 的官方组件,无法上传文件,<input type = "file"> 不能打开文件对话框,需要自己监听事件去扩展。 幸好这里有...

阅读全文

javascript的Array.map,如何使用async, await异步

Array.map 是高阶函数,函数参数是同步的,非异步,如果内部异步调用,可以这样处理: // 获取用户信息 data = data.map((item) => { // 异步的调用 通...

阅读全文

Laravel dingo,HTTP的请求头(accept)无法携带版本号的解决方法

使用 Laravel dingo 做api开发时,涉及 API 的多版本控制,dingo 允许在 HTTP请求的 header [Accept] 中,指定版本号。形式如 application/vnd.subtype.v2+js...

阅读全文

欢迎留言