由于服务器上的各类操作(编译、打包、装包等等)往往相对底层、不像浏览器直接chrome安装插件就可以完美使用代理, 所以在服务器上使用代理往往显得有点艰难。
常见的linux环境使用代理的方法大概有:
前面三类方法大体上可以满足常用的需求,但是经常存在着问题:就像使用proxychains-ng 和tsocks来代理apt始终是不行的, 最后还是得更改apt的配置文件;再比如使用tsocks来代理git 也有不能使用socks5协议的问题。最后发现服务器上一堆配置,有时候代理更换一下都不知道改哪里!
问题: 这些软件的代理都不够底层
措施: 通过路由器这一层直接将所有流量代理,而不是使用系统软件实现
交代了半天废话,终于来到正题了。
ubuntu18.04, 单网卡(有线), 已安装docker
按照我之前的理解, 单网卡应该是不能自己代理自己的,因为就一个ip地址。但是网卡有混杂模式
(Promiscuous Mode)是指一台机器能够接收所有经过它的数据流,而不论其目的地址是否是他。
而linux下docker 包含一个网络模式macvlan。
它允许在同一个物理网卡上配置多个 MAC 地址,即多个 interface,每个 interface 可以配置自己的 IP。
所以虚拟机软件能够通过桥接实现虚拟机内部获得一个和宿主机同一网段的ip, 也就是说对路由器来说, 网络上存在两个真实物理设备。
使用docker来虚拟一个软路由容器, 然后将服务器(宿主机)的网关指向软路由容器, 就能实现类似路由器透明代理的效果, 这样就可以实现服务器完全代理了。
加载 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
导入镜像
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到镜像。
通过浏览器进入openwrt系统
http://192.168.0.254 #容器IP
安装相应代理插件 ss
更改服务器(宿主机)网关为容器ip,DNS为容器ip。
现在服务器所有网络流量都走docker容器中的软路由openwrt系统了,如果你已经配置好合适的插件, 那么现在就你的服务器已经完全代理了。
1.请保证你docker 容器开启启动, 否则网关指向该容器会导致服务器上不去网络
2.在安装插件的时候网络满,那么你最好先配置一下容器openwrt的opkg包管理工具代理:
option http_proxy http://代理服务器ip:端口/
当然 安装好后就可以取消了
本文参考github简略