Redsocks配合iptables实现网络代理

Redsocks配合iptables实现网络代理

前置原因

在局域网环境,使用虚拟机安装了一台centos系统的主机B,由于网络环境因素,主机B无法访问外网,但是可以访问局域网环境。局域网中存在一台主机A,操作系统为windows 10,该主机可以正常访问外网。

开发中,主机B由于无法访问外网,存在诸多不便。因此,尝试在主机A上开启网络代理,主机B通过连接主机A的代理服务访问外网。

执行方案

主机A开启socks代理

这里由于主机A已经安装了 v2rayN ,因此默认开启了socks代理端口。对于其他情况,可自行查询windows开启socks方法。

主机A中,在v2rayN中依次点击 设置 - 基础设置 ,打开 允许来自局域网的链接为局域网开启新的端口,根据实际情况决定是否使用用户密码认证。

主机B连接SOCKS

安装redsocks

  • 已存在gcc环境

点击 下载地址 下载 redsocks 源码,解压后进入源码目录,执行 make 。执行后,在源码目录会生成一个名为 redsocks 的可执行文件。可以将这个文件复制到单独的目录执行。

  • 不存在gcc环境

由于主机B在安装后缺少gcc编译环境,因此在主机B中无法编译源文件。这里可以考虑手工安装配置gcc编译环境或使用另外一台可以访问外网的linux服务器,编译后将生成的可执行文件上传到主机B。

这里我们采用后者,开通云服务器并执行以上编译步骤生成文件上传到主机B。

在完成以上步骤后,登录主机B,在 /opt 下创建 redsocks 目录,将源码目录中的 redsocks.conf.example 和编译后生成的可执行文件上传到该目录中。复制 redsocks.conf.exampleredsocks.conf 。此时,目录中文件如下:

[root@localhost redsocks]# ls -l
总用量 488
-rwxr-xr-x. 1 root root 483112 11月  5 21:22 redsocks
-rw-r--r--. 1 root root    403 11月  8 01:56 redsocks.conf
-rw-r--r--. 1 root root   5079 11月  5 23:13 redsocks.conf.example

配置redsocks

假设主机A地址为 192.168.1.5 ,sock5端口为 10810 。编辑 redsocks.conf ,内容如下:

base {
        log_debug = off;
        log_info = on;
        log = stderr;
        daemon = off;
        redirector = iptables;
}

redsocks {

        local_ip = 127.0.0.1;
        local_port = 12345;

        splice = true;

        ip = 192.168.1.5;
        port = 10810;

        type = socks5;
}

redudp {

        local_ip = 127.0.0.1;
        local_port = 10053;

        ip = 192.168.1.5;
        port = 10810;

        dest_ip = 8.8.8.8;
        dest_port = 53;

        udp_timeout = 30;
        udp_timeout_stream = 180;
}

这里配置 daemon = off; 关闭后台启动用于测试,测试完成后可设置为 ON

配置完成后,执行 ./redsocks -c ./redsocks.conf 启动代理。

配置iptables

在目录下创建 iptables.sh,内容如下:

#!/bin/bash

# iptables -t nat -F REDSOCKS
# Create new chain
iptables -t nat -N REDSOCKS

iptables -t nat -A REDSOCKS -d 192.168.1.5 -j RETURN
iptables -t nat -A REDSOCKS -d 127.0.0.1 -j RETURN
iptables -t nat -A REDSOCKS -d 0.0.0.0/8 -j RETURN
iptables -t nat -A REDSOCKS -d 10.0.0.0/8 -j RETURN
iptables -t nat -A REDSOCKS -d 100.64.0.0/10 -j RETURN
iptables -t nat -A REDSOCKS -d 127.0.0.0/8 -j RETURN
iptables -t nat -A REDSOCKS -d 169.254.0.0/16 -j RETURN
iptables -t nat -A REDSOCKS -d 172.16.0.0/12 -j RETURN
iptables -t nat -A REDSOCKS -d 192.168.0.0/16 -j RETURN
iptables -t nat -A REDSOCKS -d 198.18.0.0/15 -j RETURN
iptables -t nat -A REDSOCKS -d 224.0.0.0/4 -j RETURN
iptables -t nat -A REDSOCKS -d 240.0.0.0/4 -j RETURN

iptables -t nat -A REDSOCKS -p tcp -j REDIRECT --to-ports 12345
iptables -t nat -A REDSOCKS -p udp -j REDIRECT --to-ports 10053

iptables -t nat -A OUTPUT -p tcp -j REDSOCKS
iptables -t nat -A PREROUTING --in-interface ens192 -p tcp -j REDSOCKS

替换最后一行 ens192 为实际使用的网卡。执行ifconfig 查看主机IP显示在哪个网卡下就改成什么。

执行脚本。

问题分析

  • 执行后依然无法访问代理节点 =>关闭SELinux

类似文章