透明代理的意思是:客户端根本不需要知道有代理服务器的存在,只需要配置好网络即可实现代理功能,其经常用于渗透测试中,作用除去本文提到的Tor隐藏IP之外,还可以用于内网渗透,使得主机如同真正处于内网之中一样,使我们的渗透更加方便顺利。

本文的目标场景:一台主机作为网关,在该主机上搭建Tor服务并做好流量转发,实现所有以该主机网关的机器均可以直接访问Tor(不需要任何代理设置)。

由于Tor本质上是个SOCKS代理,所以理论上本文的内容对于所有的SOCKS代理均适用。

Tor的安装&配置

安装Tor:

1
2
3
4
5
6
# CentOS
sudo yum install epel-release
sudo yum install tor

# Ubuntu, Kali
sudo apt install tor

修改Tor配置文件/etc/tor/torrc

1
2
3
4
5
6
# 定义Tor监听的SOCKS端口
SOCKSPort 9050

# 屏蔽五眼联盟国家节点
ExcludeNodes {fr}
ExcludeExitNodes {us},{au},{ca},{nz},{gb},{fr}

启动Tor服务并设置为开机启动:

1
2
sudo systemctl start tor
sudo systemctl enable tor

Redsocks的安装&配置

仓库:GitHub - darkk/redsocks: transparent TCP-to-proxy redirector

1
2
3
4
5
sudo yum install libevent-devel git gcc   # 安装依赖
git clone darkk/redsocks
cd redsocks
make    # 编译源代码
cp redsocks/redsocks /sbin   # 放置在任意包含在环境变量的路径中即可,便于后续输入命令

创建配置文件/etc/redsocks.conf,填入配置(默认配置文件位于redsocks/redsocks.conf.example):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
base {
      	log_debug = off;
        log_info = on;
        log = stderr;
        daemon = off;
        redirector = iptables;
}
redsocks {
	local_ip = 0.0.0.0;   // 使用0.0.0.0即可允许其他主机流量进入,使用127.0.0.1只能本机流量进入
	local_port = 50080;   // Redsocks监听端口
	
	ip = 127.0.0.1;
	port = 9050;    // 填写Tor监听端口
	
	type = socks5;
    // 可选 自定义登录用户名和密码
	// login = "username";
	// password = "password";
}

使用redsocks -c /etc/redsocks.conf启动程序,也可以为其创建一个Systemd服务来使其可以开机自启。

创建文件/usr/lib/systemd/system/redsocks.service,内容如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
[Unit]
Description=Redsocks Service

[Service]
Type=simple
ExecStart=/usr/sbin/redsocks -c /etc/redsocks.conf
Restart=on-failure
RestartSec=1

[Install]
WantedBy = multi-user.target

然后使用systemctl启动并设置开机自启:

1
2
sudo systemctl start redsocks
sudo systemctl enable redsocks

Iptables规则的设置

注:CentOS 8中使用firewall-cmd取代了iptables,使得两者会产生冲突,所以务必先将firewall-cmd对应的服务firewalld关闭再进行操作。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# 清空nat链以便后续操作
iptables -t nat -F

# 创建新链REDSOCKS
iptables -t nat -N REDSOCKS -m comment --comment "Add new chain for redsocks"

# 本地网络地址放行不进行转发
iptables -t nat -A REDSOCKS -d 0.0.0.0/8 -j RETURN -m comment --comment "Skip for Intranet"
iptables -t nat -A REDSOCKS -d 10.0.0.0/8 -j RETURN -m comment --comment "Skip for Intranet"
iptables -t nat -A REDSOCKS -d 127.0.0.0/8 -j RETURN -m comment --comment "Skip for Intranet"
iptables -t nat -A REDSOCKS -d 169.254.0.0/16 -j RETURN -m comment --comment "Skip for Intranet"
iptables -t nat -A REDSOCKS -d 172.16.0.0/12 -j RETURN -m comment --comment "Skip for Intranet"
iptables -t nat -A REDSOCKS -d 192.168.0.0/16 -j RETURN -m comment --comment "Skip for Intranet"
iptables -t nat -A REDSOCKS -d 224.0.0.0/4 -j RETURN -m comment --comment "Skip for Intranet"
iptables -t nat -A REDSOCKS -d 240.0.0.0/4 -j RETURN -m comment --comment "Skip for Intranet"

# 将REDSOCKS链上的流量全部转发至Redsocks监听的端口
iptables -t nat -A REDSOCKS -p tcp -j REDIRECT --to-ports 50080 -m comment --comment "Redirect traffic to tor"

# 将Tor流量不进行转发(若全部流量都进行转发则Tor将无法正常运行)
# 使用UID进行流量的过滤,查看Tor进程的启动用户: ps -ef | grep tor
iptables -t nat -A OUTPUT -p tcp -m owner \! --uid-owner $(id -u toranon) -j REDSOCKS
# iptables -t nat -A OUTPUT -p tcp -j REDSOCKS -m comment --comment "From OUTPUT jump to REDSOCKS"

# 路由前的数据包也全部跳转到REDSOCKS链
iptables -t nat -A PREROUTING -p tcp -j REDSOCKS -m comment --comment "From PREROUTING jump to REDSOCKS"

# 设置域名白名单
whitelist_domains=("baidu.com" "zhihu.com" "csdn.net" "cnblogs.com")
for e in ${whitelist_domains[@]}
do
    iptables -t nat -I REDSOCKS -j RETURN -d $e -m comment --comment 'Whitelist domain: '"$e"
done

将上述命令保存为脚本,以root运行即可。

临时关闭/开启命令:

1
2
3
4
5
6
7
8
# 临时关闭
iptables -t nat -j RETURN -I REDSOCKS

# 重新开启
iptables -t nat -j RETURN -D REDSOCKS

# 查看Iptables链状态
iptables -t nat -nvL --line-number

DNSCrypt搭建本地DNS服务器

参考教程DNSCrypt简明教程即可。(搭建完成后需要将网关机的系统DNS服务器修改为127.0.0.1)

测试是否成功

任意需要访问Tor服务的主机,将网关设置为该主机的IP地址即可,然后访问https://check.torproject.org,成功截图如下:

参考资料