Pages

Friday, 1 September 2017

NAT穿透和内网访问

利用minivtun实现点对点非公网NAT穿透,在学校轻松访问家里的路由器。需要一个中心化公网服务器(VPS)作为打洞实现内网访问。

一般这种情况用于
  • 家里路由器挂载离线下载
  • 家里的WEB网络摄像头监控
  • 远程修改某些路由设置
  • 远程控制路由器相关的“智能家居”
  • 远程访问家里的内网或一个网段
现在仅考虑以下拓朴图,本文的目的是想让路由C访问路由A,实现C远程控制A。其中A是非智能路由器,使用非Openwrt系统。A下面挂接一个Openwrt路由器B
前提是A和C能顺利访问该VPS,而且B工作正常。

minivtun互访

这个minivtun是我常用的tun点对点隧道软件,工作原理与shadowvpn类似,可以当梯子使用。现有我移植的的minivtun-openwrt,可以自行编译安装在路由上面。
按照文档编译安装,服务端运行监听555端口
/usr/sbin/minivtun -l 0.0.0.0:555 -a 172.16.0.1/24 -e password -n mv0 -d
路由器B和C,同样使用minivtun实现与VPS对接,这里指定网络设备为mv001
# Router B: ip 172.16.0.3
/usr/sbin/minivtun -r [YOUR_VPS]:555 -a 172.16.0.3/24 -e password -n mv001 -d

# Router C: ip 172.16.0.55
/usr/sbin/minivtun -r [YOUR_VPS]:555 -a 172.16.0.55/24 -e password -n mv001 -d
使用Ping等工具测试路由B能否顺利访问VPS
ping 172.16.0.1

Openwrt端口转发

以下三个步骤均在路由B操作

新建接口

在network->interface标签下添加一个interface: 命名随意,这里命名为minivtun_intf,协议为DHCP Client,手动输入mv001这个物理接口进行绑定(因上面minivtun启动参数设定了mv001网络设备)
检查这个接口minivtun_intf是否获得正确的172.16.0.3/24地址,并且从数字变化过程中看到能有Tx/Rx流量通过。

入站防火墙

切换到Network->Firewall->Gerneral,添加一个新的Zone,随意命名为minivtun,指定入站出站转发三个都accept,勾选masquerading和MSS clamping进行伪装路由器。Covered Network只需要勾选两个区域即可,其中必选的是minivtun_intf表示源,另一个是目的地根据需要,可以选WAN或者LAN,如果访问Openwrt局域网就指定LAN,如果要访问WAN(比如上一级路由)就指定WAN
因为我是利用B去访问上一级的A,因此我勾选了WAN

端口转发

切换到Network->Firewall->Port Forward,新建一个转发规则
外部端口随意,(比如外部端口是444,那么在路由C使用minivtun访问172.16.0.3:444就触发端口转发条件)
项目备注我的值
名字随意起名minivtun_port_fwd
外部区域入站防火墙名字minivtun
外部端口供外部访问端口800
内部区域目的端口区域LAN
内部IP目的地址192.168.200.1
内部端口目的端口800


测试方法

从路由器C浏览器地址栏输入http://172.16.0.3:800即可访问路由A的800端口

公网访问家里内网

考虑以下拓朴,按照上文已经实现B-C互访(即ping成功),现在我的需求是,在C节点上实现访问A路由上的192.168.200.0/24网段(做视频监控等应用)

实现原理是:将A节点的路由表在VPS上面宣告一下,参考minivtun项目的github issue服务端访问客户端内网进行配置。

添加节点A的路由表

服务端运行监听555端口,增加-v选项宣告路由表,192.168.200.0/24网段的默认网关是节点B,即172.16.0.3
/usr/sbin/minivtun -l 0.0.0.0:555 -a 172.16.0.1/24 -e password -n mv0 -d -v "192.168.200.0/24=172.16.0.3"
然后服务器端Linux系统的路由表增加默认路由,192.168.200.0/24走minivtun接口。
ip route add 192.168.200.0/24 dev mv0
服务器端测试一下能否ping到节点A,若成功就说明公网下使用minivtun可以实现访问192.168.200.0网段。
ping 192.168.200.1

配合shadowsocks进行访问内网

假设服务器上已经有ss-server在运行。在shadowsocks-android上新建一个服务器配置,路由设置为自定义规则,自定义规则可以根据实际修改,满足规则才走ss转发,这样可以实现手机访问节点A内网.
若电脑windows实现内网访问,个人猜测可使用ss的全局模式,或者配合SwitchyOmega等浏览器指定走socks5代理,我没有测试过.
related project: https://github.com/rssnsj/minivtun

No comments:

Post a Comment