软路由网关的实现

·

3 min read

设备准备

一台路由器,网关电脑,和客户机电脑。

路由器:192.168.1.1

网关机: 有两个网卡,分别为ens33(192.168.1.101), ens34(192.168.1.102)

客户机,有一个网卡(192.168.1.201)

第一步,网关

效果:

客户机的流量→网关机→公网

实现方式:

  1. 开启转发

编译文件/etc/sysctl.conf

加入 net.ipv4.ip_forward=1

然后执行sudo sysctl -p

  1. 配置iptables:
sudo iptables -t filter -F
sudo iptables -t nat -F
sudo iptables -t mangle -F
sudo iptables -t raw -F
sudo iptables -t filter -X
sudo iptables -t nat -X
sudo iptables -t mangle -X
sudo iptables -t raw -X
sudo iptables -t filter -P INPUT ACCEPT
sudo iptables -t filter -P FORWARD ACCEPT
sudo iptables -t filter -P OUTPUT ACCEPT
sudo iptables -t mangle -P PREROUTING ACCEPT
sudo iptables -t mangle -P INPUT ACCEPT
sudo iptables -t mangle -P FORWARD ACCEPT
sudo iptables -t mangle -P OUTPUT ACCEPT
sudo iptables -t mangle -P POSTROUTING ACCEPT

sudo iptables -t nat -A POSTROUTING -o ens33 -j MASQUERADE
sudo iptables -t nat -A POSTROUTING -o ens34 -j MASQUERADE

如果顺利的话,客户机把网络设置中的gateway设置为192.168.1.101,那么应该可以访问互联网。

不顺利的话,做以下检查:

  • 网关机自己能不能访问互联网。

  • tcpdump能不能看到报文。

  • 客户机能不能用ip地址访问互联网,若能,则需配dns。

  • 执行`sudo iptables-save`或`sudo iptables -t nat -L -n -v`看看iptables配置是否正确。

第二步、翻墙网关

客户机→网关机ens33→iptables→redsocks→socks→公网

socks代理

在网关机上搞一个socks代理,socks5://localhost:1080 , 具体方法不再讲解。

把tcp / udp 流量搞到socks代理上面去

iptable转发的是tcp/udp协议,不能直接转到socks协议上。因此需要一个中介做转换,这个中介具体是什么软件无所谓,只要它能把tcp/udp转换成socks就可以。此处我们用redsocks。

安装redscoks服务,让他监听12345端口, 然后发到1080端口上去。

sudo apt install redsocks

编辑 /etc/redsocks.conf

redsocks {
        local_ip = 0.0.0.0;
        local_port = 12345;
        ip = 127.0.0.1;
        port = 1080;
}

配置iptables, 把来自客户机的流量发到12345端口上去。

sudo iptables -t filter -F
sudo iptables -t nat -F
sudo iptables -t mangle -F
sudo iptables -t raw -F
sudo iptables -t filter -X
sudo iptables -t nat -X
sudo iptables -t mangle -X
sudo iptables -t raw -X
sudo iptables -t filter -P INPUT ACCEPT
sudo iptables -t filter -P FORWARD ACCEPT
sudo iptables -t filter -P OUTPUT ACCEPT
sudo iptables -t mangle -P PREROUTING ACCEPT
sudo iptables -t mangle -P INPUT ACCEPT
sudo iptables -t mangle -P FORWARD ACCEPT
sudo iptables -t mangle -P OUTPUT ACCEPT
sudo iptables -t mangle -P POSTROUTING ACCEPT

sudo iptables -t nat -N V2RAY
sudo iptables -t nat -A V2RAY -d 0.0.0.0/8 -j RETURN
sudo iptables -t nat -A V2RAY -d 10.0.0.0/8 -j RETURN
sudo iptables -t nat -A V2RAY -d 127.0.0.0/8 -j RETURN
sudo iptables -t nat -A V2RAY -d 169.254.0.0/16 -j RETURN
sudo iptables -t nat -A V2RAY -d 172.16.0.0/12 -j RETURN
sudo iptables -t nat -A V2RAY -d 192.168.0.0/16 -j RETURN
sudo iptables -t nat -A V2RAY -d 224.0.0.0/4 -j RETURN
sudo iptables -t nat -A V2RAY -d 240.0.0.0/4 -j RETURN

sudo iptables -t nat -A V2RAY -p tcp -j REDIRECT --to-port 12345
sudo iptables -t nat -A V2RAY -p udp -j REDIRECT --to-port 12345

sudo iptables -t nat -A PREROUTING -p tcp -j V2RAY
sudo iptables -t nat -A PREROUTING -p udp -j V2RAY

sudo iptables -t nat -A POSTROUTING -o ens33 -j MASQUERADE
sudo iptables -t nat -A POSTROUTING -o ens34 -j MASQUERADE

这样配好iptables后, 外部网卡的数据包在prerouting时被发到12345端口。 然后redsocks把流量发给1080端口的socks代理。 然后socks代理软件从本机发起数据包,经过网卡发给外部网络。从而实现透明的翻墙。

如果不能联网,做以下检查:

  • 检查iptables配置

  • nc -l 12345检查iptables能否转发报文到12345端口。

  • 查看redsocks日志/var/log/syslog