内容简介:IPv6 是个好东西,希望人人都有一个。新一代的 IP 协议,解决了 IPv4 地址枯竭的问题。具体可以见IPv6 的 IP 长度为 128 位,总量非常非常多,不用担心用不完,所以接入 IPv6 的客户端都会分到一
IPv6 是个好东西,希望人人都有一个。
IPV6
IPv6 是啥?
新一代的 IP 协议,解决了 IPv4 地址枯竭的问题。具体可以见 Wikipedia .
IPv6 的 IP 长度为 128 位,总量非常非常多,不用担心用不完,所以接入 IPv6 的客户端都会分到一 段 IP,比如 240e:1c:ce8:fd00::/64
,然后客户端又可以把这段 IP 继续分段,下发到下面的所有子网中。
不过需要注意的是,虽然客户端会分到一段 IP 的所有权,不过客户端本身还是会有至少一个确定的 IP,以确定自己的位置。
其实发现 ISP 分给自己 2^64 个 IP 地址的时候还是感觉很奢侈… :joy:
IPv6 跟我有什么关系?
感谢去年工信部发布了 《工业和信息化部关于贯彻落实〈推进互联网协议第六版(IPv6)规模部署行动计划〉的通知》 ,IPv6 现在也飞入寻常百姓家了~
ISP 下发的 IP,都是公网 IP ,我们再也不用躲在层层 NAT 后面,想要一个公网 IP 都要去打电话跟运营商扯皮了。
年前意外看到自己的路由器界面上有了公网的 IPv6 IP,电信 4G 网络也支持 IPv6 了,于是打算折腾一下,把这个公网 IP 利用起来,比如给家里的 NAS 搭个公网可以访问的云盘什么的:flushed:
配置
DHCP
如果要用公网 IP,首先你要有一个公网 IP. 如果 ifconfig
看到的 IP 只有 fe80
开头的地址,那是用于链路本地通信的保留地址,是不能在公网使用的。
打开路由器的后台,看一下 WAN6 的接口,如果能看到公网 IP,那就可以配置 dhcp
下发了。
编辑 /etc/config/dhcp
打开 DHCPv6 的中继模式:
config dhcp 'lan' option interface 'lan' option start '100' option limit '150' option leasetime '12h' option ndp 'relay' option dhcpv6 'relay' option ra 'relay' config dhcp 'wan' option interface 'wan' option start '100' option limit '150' option ignore '1' option leasetime '12h' option ra 'relay' option dhcpv6 'relay' option ndp 'relay' config dhcp 'wan6' option interface 'wan' option ra 'relay' option dhcpv6 'relay' option ndp 'relay' option master '1'
配置好后,用 /etc/init.d/odhcpd restart
重启 DHCP 服务器;等待一会,应该就可以在客户端网口上看到一个公网的 ipv6 地址了。
$ ifconfig enp1s0 enp1s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.10.209 netmask 255.255.255.0 broadcast 192.168.10.255 inet6 240e:17:ce8:fd00:7285:c2ff:fe38:2a56 prefixlen 64 scopeid 0x0<global> inet6 fe80::7285:c2ff:fe38:2a56 prefixlen 64 scopeid 0x20<link>
参考资料: OpenWRT IPv6 三种配置方式
防火墙
打开以后,可以随便找一个外网的机器来 ping 一下自己的机器地址,如果顺利的话,应该可以 ping 通了,但是 SSH/HTTP 访问应该还是不可以的,因为路由器的防火墙拒绝了来自外网的 TCP 请求。
在路由器的防火墙界面配置流量规则,允许目标地址为服务器的 IP 地址,端口为 22/80/443 端口的请求:
或者直接使用 ip6tables
命令配置路由器的 iptables:
ip6tables -A zone_wan_forward -d 240e:17:ce8:fd00:7285:c2ff:fe38:2a56/128 -p tcp -m tcp --dport 22 -m comment --comment "!fw3: Allow-v6-forward" -j zone_lan_dest_ACCEPT ip6tables -A zone_wan_forward -d 240e:17:ce8:fd00:7285:c2ff:fe38:2a56/128 -p tcp -m tcp --dport 80 -m comment --comment "!fw3: Allow-v6-forward" -j zone_lan_dest_ACCEPT ip6tables -A zone_wan_forward -d 240e:17:ce8:fd00:7285:c2ff:fe38:2a56/128 -p tcp -m tcp --dport 443 -m comment --comment "!fw3: Allow-v6-forward" -j zone_lan_dest_ACCEPT
然后本地开个 HTTP 服务器,再尝试访问一下 http://[240e:17:ce8:fd00:7285:c2ff:fe38:2a56]/
,如果顺利的话,就可以自己做网站了~
测试的时候遇到了一个小插曲:我在 NAS 的 6000 端口上随手部署了一个 HTTP 服务器,但用手机的 Chrome 访问的时候报出了 ERR_UNSAFE_PORT
的错误,才发现 Chrome 还有这种奇怪的端口访问限制…具体可见 这篇文章 。
文件服务器
文件服务器的选型,我使用了 Nginx + FileRun,用 Docker 进行托管。
Nginx 是之前在内网搭服务的时候就搭好的, FileRun 是一款长得和 Google Drive 有点像~~(哪里像了)~~的文件服务器,支持文件分享、图片/视频在线预览,还可以使用 Office Web/Google Docs 在线编辑文件。
它是收费软件,不过免费功能也够用。功能强大,长得又很漂亮,就用它了~
FileRun 支持使用 Docker 部署,方法可见 官方文档 。
其中,容器中的 /var/www/html
目录会存放 FileRun 首次启动时生成的 PHP 文件,而 /user-files
目录是 FileRun 程序进行文件操作的根目录。
在部署时,我的 NAS 上已经有一个 MySQL 服务了,不想再另起一个,所以通过 external_link
设置让 FileRun 容器直接访问现有的 MySQL 容器:
version: '2' services: web: image: afian/filerun environment: FR_DB_HOST: mysql FR_DB_PORT: 3306 FR_DB_NAME: filerun FR_DB_USER: filerun FR_DB_PASS: password APACHE_RUN_USER: www-data APACHE_RUN_USER_ID: 33 APACHE_RUN_GROUP: www-data APACHE_RUN_GROUP_ID: 33 network_mode: bridge external_links: - mysql ports: - "8030:80" volumes: - /data/filerun/html:/var/www/html - /mnt:/user-files restart: always
Nginx 配个反代,DNS 配一条 AAAA 记录, acme.sh 签个 HTTPS 证书,这些都不细讲了。
登录时,发现 JS 里有个奇怪的 base_url
指向了 localhost:8030
,导致页面脚本不能正常工作。
查到 这个帖子 ,新建文件 /user-files/customizables/config.php
,写入如下内容:
<?php $config['url']['root'] = 'https://filerun.somedomain.com'; $_SERVER['HTTPS'] = 'on';?>
重启之后就可以正常使用了。
来张图感受一下:smile:
还剩下一个小问题:DDNS
路由器重启或重新拨号后,NAS 会拿到新的 IP,网站就无法正常访问了。
于是写了个脚本用 CloudFlare API 更改 DNS 记录,可以定时运行脚本,来更新 IP 地址。
#!/usr/bin/env python3 import socket import requests KEY = "<Cloudflare API Key>" EMAIL = "<Cloudflare Email>" ZONE_ID = "<Zone ID>" records = [["<DNS Record ID>", "<Domain>"]] def get_ip_6(host, port=0): sock = socket.socket(socket.AF_INET6, socket.SOCK_DGRAM) sock.connect((host, port)) return sock.getsockname()[0] def main(): ip = get_ip_6('ipv6.google.com') api_url = "https://api.cloudflare.com/client/v4/zones/{}/dns_records/{}" headers = { "X-Auth-Email": EMAIL, "X-Auth-Key": KEY } for record_id, domain in records: url = api_url.format(ZONE_ID, record_id) res = requests.put(url, json={ "type": "AAAA", "name": domain, "content": ip, "ttl": 120, "proxied": False }, headers=headers) print(res.status_code, res.json()) if __name__ == '__main__': main()
Ref: Finding local IP addresses using Python’s stdlib
差不多就写这些了。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- nfs 文件共享搭建
- NFS网络文件存储系统搭建配置详解
- Nginx + Lua搭建文件上传下载服务
- Nginx + Lua搭建文件上传下载服务
- Nginx学习之如何搭建文件防盗链服务
- CentOS7搭建NFS文件共享存储服务
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
数据分析技术白皮书
伍海凤、刘鹏、杨佳静、马师慧Sara、李博、Shirley Song、Zinc、李晓艳 / 2016-8-11 / 0
关于数据分析技术白皮书(Analytics Book 中文版),主要内容围绕: 1. 分析(Analytics):网站分析 & APP分析 2. 谷歌分析工具的原理、部署与使用 3. 开源网站分析工具的原理、部署与使用 4. Log日志分析原理 5. 网站分析的维度与指标定义 6. 如何炼成为一个互联网数据分析师 请访问书的数据分析技术白皮书官网“免费”阅......一起来看看 《数据分析技术白皮书》 这本书的介绍吧!