用gost透明代理让内网服务器访问互联网

昨天在水木看到个问题“没有网关的root权限,怎样让内网服务器联网?”

这自然不难,在大中华局域网环境的我们早就练就一身翻墙本领。

问题

http://www.newsmth.net/nForum/#!article/LinuxApp/941233

发信人: doggeddog (doggeddog), 信区: LinuxApp
标 题: 求教大神,没有网关的root权限,怎样让内网服务器联网?
发信站: 水木社区 (Sat Nov 3 16:46:47 2018), 站内

原来那些机器是可以上网的,后来被公司运维关了
现在的情况是,网关那台机器有多个网卡,可以联网。但我只有普通用户权限,因此不能修改iptables。

内网的那些机器,我有root权限

我试过的方案:
1、proxychains,在网关搭了个socks5代理,
可以成功,但不是所有应用都支持
2、redsocks,在内网机器搭第二层代理,连接网关的代理,然后修改本机iptables。没有成功,原因不明

求教各位大神,还有没有其他方案?

SSH隧道

我首先拿出当初让阿里云无流量服务器也能访问外网的 vpn-over-ssh 脚本,模拟出环境成功运行,另外用 OpenVPN 方案也不错,这 2 个方案效果都很好,ICMP 协议也能搞掂,但都使用到 iptables,如果没 root 则需用网关做端口转发到外网的服务器。

几年后再次使用 vpn-over-ssh 脚本,觉得太麻烦了,老技术不想拿出来炒冷饭,该方案仅供参观,就 show 一下最后能 ping 谷歌的结果。

客户端A无法上网,客户端B可以但无root,A和B联通,C在外网。系统均为 CentOS 6.9,A和C都安装tunctl。

1
2
3
[root@centos ~]# rpm -ivh tunctl-1.5-3.el6.x86_64.rpm
Preparing... ########################################### [100%]
1:tunctl ########################################### [100%]

A ssh登录B,B转发 TCP 22 到C,A和C建立隧道,各自用 iptables 处理转发。

1
2
3
4
5
6
7
[root@centos ~]# ifconfig tun2 | grep addr
inet addr:10.0.0.2 P-t-P:10.0.0.1 Mask:255.255.255.255
[root@centos ~]# ip route replace default via 10.0.0.1
[root@centos ~]# echo "nameserver 1.1.1.1" >/etc/resolv.conf
[root@centos ~]# ping www.google.com
PING www.google.com (172.217.27.100) 56(84) bytes of data.
64 bytes from sin11s04-in-f100.1e100.net (172.217.27.100): icmp_seq=1 ttl=53 time=463 ms

透明代理

趁着空闲学习一些新玩意,看了下 gost、redsocks、V2Ray 这类做透明代理,虽然只能处理 TCP/UDP,但也还不错了,只要解决 DNS 解析,能不能 ping 都无所谓。

最开始是折腾 gost + badvpn-tun2socks 组合,试验了 3 个方案,发现 gost + iptables 直接就可以搞掂,badvpn-tun2socksbadvpn-udpgw 都可以不用。

gost 做为标准 SOCKS5 代理可处理 UDP 数据,限制条件:

  1. 代理链中的 HTTP 代理节点必须支持 CONNECT 方法。
  2. 如果要转发 SOCKS5 的 BIND 和 UDP 请求,代理链的末端(最后一个-F参数)必须支持 gost SOCKS5 类型代理。

以下就只写出最简方案:

在能访问互联网的网关服务器 192.168.1.200gost 开个 socks5 代理:

1
gost -L=socks5://user:password@:1080

然后客户端服务器连接上面的代理服务器并设置为透明代理,我这里选用 1.1.1.1 作为 DNS 服务器:

1
2
3
echo "nameserver 127.0.0.1" > /etc/resolv.conf
iptables -t nat -A OUTPUT -p tcp --match multiport ! --dports 12345,1080 -j DNAT --to-destination 127.0.0.1:12345
gost -L=udp://:53/1.1.1.1:53?ttl=60 -L socks5://:1080?dns=1.1.1.1:53/tcp -L redirect://:12345 -F=socks5://user:password@192.168.1.200:1080

4 行命令,路由都不用处理,有没有觉得简单到要爆?试试 dig yum apt-get nslookup w3m wget curl 等命令都能正常使用,ping 域名虽然无结果,但还是能解析。