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.example
为 redsocks.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