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代理,我没有测试过。

fromhttp://web.archive.org/web/20190811172300/https://lixingcong.github.io/2016/10/03/openwrt-port-forward/