需求
在实验室里和家里有多个服务器,提供版本控制,文件存储等多种服务。由于团队构成比较复杂,既有本校的学生,也有外校的学生和老师。所以,这些服务器都需要对内网和对外网同时提供服务。由于服务器物理上存在本地的子网内,对外提供服务采用的是内网穿透功能实现的,外网提供的带宽有限,另外有些服务数据量比较大(例如云存储等),因此希望内外网走不同的通道,主要是对于内网用户,直接访问服务器,而不需要通过穿透服务器实现访问,从而降低外网穿透服务器的带宽消耗。
为什么不通过修改客户端的配置来实现直接访问呢?这个受很多因素的制约。例如Seafile服务器就需要直接把下载网址写入到配置文件中,因此为了内外网都能用,只能配置成外网地址。另外,内网用户很多是移动办公设备,会经常的在内网外网切换,经常修改客户端配置也是一件比较麻烦的事。
解决思路
使用DNS服务来解决。在内网配置专用的内网DNS服务器来将域名映射到内网IP,在外网时则仍然访问穿透服务器,可以解决这个问题。但是仍然有困难,主要难点在于,内网访问和外网访问的URL不能复用。
内网穿透本质上是端口映射,对于穿透服务器,由于端口数量有限,因此映射的时候不能做到端口的一一对应,另外有些服务器的服务使用了Nginx反向代理功能,也会造成一定的麻烦。怎么办?
解决方法,在内网也搭建一台穿透服务器,将外网穿透服务器的域名解析到这台服务器上,从而实现内外网无缝衔接。另外一个方法就是在内网服务器上实现端口转发。这里用后者,这样可以少配一个fpr客户端。
具体实施
具体设计的修改后的网络结构如下图所示。
需要做以下几点改动:
- 搭建内网DNS服务器
- 搭建Frp服务器
- 修改Frp客户端,可以运行两个实例,同时连接内网FRP服务器和外网FRP服务器。
搭建内网DNS服务
硬件使用树莓派,软件使用DnsMasq。
sudo apt-get install dnsmasq
sudo cp /etc/dnsmasq.conf /etc/dnsmasq.conf.bak
sudo vi /etc/dnsmasq.conf
cat /etc/dnsmasq.conf
resolv-file=/etc/my_dns.conf
strict-order
cache-size=10000
listen-address=127.0.0.1,192.168.1.40
address=/pi.com/192.168.1.40
sudo nano /etc/my_dns.conf
cat /etc/my_dns.conf
nameserver 192.168.1.1
nameserver 119.29.29.29
nameserver 182.254.116.116
vi /etc/hosts
sudo systemctl restart dnsmasq.service
一顿操作之后DNS应该可以用了。将自己内网的电脑DNS地址改为192.168.1.40
,就可以使用新的域名了。
配置端口转发
编辑/etc/sysctl.conf文件,将net.ipv4.ip_forward=1前面的#注释去掉,保存文件,然后执行sudo sysctl -p
使其生效。然后添加规则:
sudo iptables -t nat -A PREROUTING -p tcp --dport 7280 -j REDIRECT --to-ports 8000
sudo iptables -t nat -A PREROUTING -p tcp --dport 7282 -j REDIRECT --to-ports 8082
sudo iptables-save > /etc/iptables.rules
然后,编辑/etc/rc.local文件,在其中添加命令:
iptables-restore < /etc/iptables.rules
这样,重启端口转发依然有效。
结论
这样操作后,就可以实现服务对内对外的同步服务功能了。当然,需要针对每一个服务单独进行处理,这里就不赘述了。
Q.E.D.
Comments | 1 条评论