由于服务器上的各类操作(编译、打包、装包等等)往往相对底层、不像浏览器直接chrome安装插件就可以完美使用代理, 所以在服务器上使用代理往往显得有点艰难。
常见的linux环境使用代理的方法大概有:

  1. EXPORT export http_proxy=http://proxyAddress:port
  2. 添加相应命令app的个性化配置 比如添加pip.conf, apt.conf, 或者 git config等等
  3. 安装通用代理软件 之前使用过proxychains-ng, tsocks 等等

前面三类方法大体上可以满足常用的需求,但是经常存在着问题:就像使用proxychains-ng 和tsocks来代理apt始终是不行的, 最后还是得更改apt的配置文件;再比如使用tsocks来代理git 也有不能使用socks5协议的问题。最后发现服务器上一堆配置,有时候代理更换一下都不知道改哪里!

问题: 这些软件的代理都不够底层
措施: 通过路由器这一层直接将所有流量代理,而不是使用系统软件实现

  1. 最好的办法就是在路由上安装代理工具,但是不现实,路由器也不是我能管理的…
  2. 本机单网卡docker下LEDE旁路由

交代了半天废话,终于来到正题了。

环境说明

ubuntu18.04, 单网卡(有线), 已安装docker
按照我之前的理解, 单网卡应该是不能自己代理自己的,因为就一个ip地址。但是网卡有混杂模式

(Promiscuous Mode)是指一台机器能够接收所有经过它的数据流,而不论其目的地址是否是他。

而linux下docker 包含一个网络模式macvlan。

它允许在同一个物理网卡上配置多个 MAC 地址,即多个 interface,每个 interface 可以配置自己的 IP。

所以虚拟机软件能够通过桥接实现虚拟机内部获得一个和宿主机同一网段的ip, 也就是说对路由器来说, 网络上存在两个真实物理设备。

构想

使用docker来虚拟一个软路由容器, 然后将服务器(宿主机)的网关指向软路由容器, 就能实现类似路由器透明代理的效果, 这样就可以实现服务器完全代理了。

实施

1.准备工作

加载 TPROXY 内核模块为支持 UDP 透明代理

sudo modprobe -v xt_TPROXY

docker 新建一个macvlan网络

sudo docker network create \
    -d macvlan \
    --subnet=192.168.0.0/24 \ #实际网段
    --gateway=192.168.0.1 \ #实际路由器网关
    -o parent=ens34 \  #网卡名
    macvlan0

可以通过命令查看验证该新建的docker网络

sudo docker network ls
sudo docker network inspect macvlan0

2.安装镜像并更改容器内配置

导入镜像

sudo docker import \
    https://downloads.openwrt.org/releases/18.06.2/targets/x86/64/openwrt-18.06.2-x86-64-generic-rootfs.tar.gz \
    openwrt:18.06.2

可以通过命令查看验证导入的镜像

sudo docker iamge ls

启动容器

sudo docker run -d \
    --restart unless-stopped \
    --network macvlan0 \
    --ip=192.168.0.254 \  #设置容器的ip(之后宿主机网关指向这里,也相当于虚拟的软路由容器; 注意不能和真实路由中已经使用的ip冲突) 
    --privileged \
    --name openwrt \
    openwrt:18.06.2 \
    /sbin/init

配置 openwrt

#进入容器
sudo docker exec -it openwrt /bin/sh
#编辑 /etc/config/network
config interface 'lan'
    option type 'bridge'
    option ifname 'eth0'
    option proto 'static'
    option ipaddr '192.168.30.254' #容器的ip
    option netmask '255.255.255.0'
    option ip6assign '60'
    option gateway '192.168.0.1' #实际路由器网关
    option dns '127.0.0.1'
#重启网络生效
/etc/init.d/network restart

由于容器每次使用镜像重启都会丢失未保存的设置,最好在设置好之后将当前运行容器commit到镜像。

3.安装相应插件并更改服务器(宿主机)网关、DNS

通过浏览器进入openwrt系统
http://192.168.0.254 #容器IP
安装相应代理插件 ss

更改服务器(宿主机)网关为容器ip,DNS为容器ip。

大功告成

现在服务器所有网络流量都走docker容器中的软路由openwrt系统了,如果你已经配置好合适的插件, 那么现在就你的服务器已经完全代理了。

注意

1.请保证你docker 容器开启启动, 否则网关指向该容器会导致服务器上不去网络
2.在安装插件的时候网络满,那么你最好先配置一下容器openwrt的opkg包管理工具代理:
option http_proxy http://代理服务器ip:端口/
当然 安装好后就可以取消了

本文参考github简略

Logo

更多推荐