软路由网关的实现
设备准备
一台路由器,网关电脑,和客户机电脑。
路由器:192.168.1.1
网关机: 有两个网卡,分别为ens33(192.168.1.101)
, ens34(192.168.1.102)
客户机,有一个网卡(192.168.1.201)
。
第一步,网关
效果:
客户机的流量→网关机→公网
实现方式:
- 开启转发
编译文件/etc/sysctl.conf
加入 net.ipv4.ip_forward=1
然后执行sudo sysctl -p
- 配置
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