外网连接内部局域网的方法

Posted by Hsz on November 11, 2020

外网连接内部局域网的方法

在实践中我们通常会在组织内构建一个局域网用于部署开发环境和一些日常工作所需的服务,比如nas,比如代码仓库.我们会希望内网足够安全的同时,外网也可以有一些途径可以访问到内网.归纳起来有如下几种方式:

  1. 静态外网ip端口映射

  2. 外网ip动态映射

静态外网ip端口映射

原理很简单,每个用户都会有一个外网ip,这个ip可以在baidu里输入ip直接查到.如果别人输入这个ip地址,它会连接到你的路由器的80端口(通常是路由器的设置页面).也就相当于家里的路由器充当了内网与外网的一个网关,静态外网端口映射可以理解为设置这个网关,让外网通过访问不同的端口来访问内网的服务.

幸运的是通常主流路由器都有一个功能叫做端口映射,刚好可以满足这个需求.

通常设置端口映射就是填一个包含规则名,端口,目标主机ip,目标端口的的表单,填好后激活就可以使用了.

规则名 端口 目标主机ip 目标端口
test 1001 192.168.1.100(本机ip) 5000

其中规则名是这条规则的唯一标识,端口就是路由器开放的端口,目标主机和目标端口则是要映射服务的主机和端口

要做端口映射还有一个条件就是目标主机必须是静态ip,如果是动态ip,那相当于一旦目标主机的ip变化了我们就不得不重新修正这个映射表.

设置静态ip的方法一般两种:

  1. 主机上配置.这种方式一般是linux环境下常用,也是比较推荐的方法,通常通过修改/etc/network/interfaces(以ubuntu为例)

     # 配置静态IP使用以下内容
     auto eth0                    # eth0为以太网卡名称,可以使用ifconfig查询
     iface eth0 inet static
         address 192.168.137.100    # IP地址
         netmask 255.255.255.0    # 子网掩码
         gateway 192.168.1.1
    
     # 配置动态IP使用以下内容
     auto eth0    
     iface eth0 inet dhcp 
    
  2. 路由器配置.这种方式是利用路由器分配ip的规则,为指定mac地址的机器分配固定ip,这种方式实测还是会出现ip对不上的情况,但胜在方便.

外网ip动态映射

上面的方式可以一直奏效的前提是我们的网络供应商为我们提供了固定外网ip.多数时候网络供应商不会提供,他们会一定时间间隔就为你换一次外网ip,而上面设置的映射自然也会因为外网ip的变动而不再有效.

解决这个问题我们的办法是动态ip映射(ddns).它的原理是使用外网的域名代替外网ip,然后通过一个内部脚本不断请求一个专门的网址以上报我们的外网ip,然后如果域名对应的外网ip有变化就用新外网ip替换旧ip重新刷新域名的ip映射

也就是说这个方案有如下依赖:

  1. 一个域名
  2. 一个外部的域名解析服务商,同时提供接口供内网访问上报当前外网ip

这里提供一个支持ddns的免费服务商dynv6,我们注册后就可以通过脚本调用它提供的接口来更新映射了.如果你用的是群晖,那么你连脚本都可以不用写了,安装套件DDNS IPDATER2,然后设置3分钟刷新一次就可以实现定时刷新外网ip的功能了.

外网连接条件下的安全问题

将自家的内网环境暴露到外网并不是一件安全的事情,我们不得不随时小心有黑客扫描你家端口.下面是避免安全问题的几个注意事项:

  1. 不要暴露任何内网机器的ssh端口.一般来说ssh端口是最大的隐患,因为一旦被攻破相当于内网环境完全暴露
  2. 尽量只暴露docker容器中的服务.容器相对来说是个隔离的环境,要被攻克也就是容器被攻克而已.可以降低整体被攻破的风险
  3. 尽量不要暴露vpn接口给外网,vpn虽然方便,但和ssh一样一旦被攻破整个内网就完全暴露了.
  4. 尽量不要将家里的网络存储设备(nas)端口开放出去.通常黑客最关心的就两点:
    1. 数据,通过获取用户隐私数据勒索用户,或者利用用户身份做非法勾当
    2. 算力,拿用户家里的机器挖矿 一般家里的机器保持7*24小时开机的就路由器光猫,最多加个nas,而nas一般是家里的数据中枢,不适合重装不适合重启,所以尽量不要将它暴露到外网