ipv6時(shí)代
公網(wǎng)IP不再是稀缺資源厢漩,IPV6和IPV4最本質(zhì)上的區(qū)別膜眠。大量可用的IP地址,拋棄了NAT那一套溜嗜,全程走通告宵膨,不再需要DHCP。(PS:特殊場景仍然有DHCP6用途)
擁抱IPV6
以AC68U機(jī)器為例(梅林固件炸宵、其它魔改梅林固件同理)辟躏,其它ASUS系列機(jī)器同理。
一土全、開啟路由器V6支持
進(jìn)入192.168.0.1(你路由器地址)捎琐,
高級設(shè)置欄目/IPV6
然后開啟IPV6支持
二、測試IPV6是否工作正常
打開測試IPV6
如圖裹匙,這樣就算成功了
有了IPV6可以做什么瑞凑?
1.內(nèi)網(wǎng)存儲(私有網(wǎng)盤)
通過使用Cloudnext 等一系列開源私有網(wǎng)盤工具,我們可以搭建自己的內(nèi)網(wǎng)存儲
遠(yuǎn)程ssh
其它WEB服務(wù)(注:80概页、443端口是需要備案才能使用的籽御,最好不要開放這兩個(gè)端口出去;大部分時(shí)候開放了也不能使用)
其它需要使用公網(wǎng)IP的場景
IPV6與安全
開啟了IPV6 給予了我們方便,同時(shí)也帶來了一些安全隱患技掏。我們需要使用ASUS固件上的防火墻來增加安全防護(hù)铃将。
1.開啟IPV6防火墻
未正確配置會導(dǎo)致服務(wù)不能使用
如圖,我們把IPV6防火墻啟用
2.防火墻配置
點(diǎn)擊左側(cè)高級設(shè)置-IPv6 找到 “內(nèi)部網(wǎng)絡(luò) IPv6 地址” 選項(xiàng)哑梳,復(fù)制右邊的制
得到如:
2401:8262:f80:5555::1
我們在這串地址后面加上/64
變成了 2401:8262:f80:5555::1/64
3.開放端口(得到了內(nèi)網(wǎng)網(wǎng)段地址劲阎,我們就可以去開放端口了)
回到高級設(shè)置-防火墻,拉到最下面
做完之后鸠真,我們點(diǎn)擊 “應(yīng)用本頁面設(shè)置”悯仙,就可以在防火墻開啟的情況下,正常訪問我們允許的端口號了弧哎。
進(jìn)階DDNS
ps:雖然我們有了公網(wǎng)IP雁比,但家庭寬帶仍然不是固定的。所以我們需要使用DDNS撤嫩,來綁定我們的域名。
推薦使用cloudflare
我們通過每5min跑一個(gè)腳本蠢终,通過cloudflare的 api 去上報(bào)我們最新IPV6地址序攘,達(dá)到我們始終能通過域名正確解析的目的。
以下是腳本
安裝 cloudflare sdk
sudo pip install cloudflare
# coding: utf-8
# by longbob
import json
import os
import CloudFlare
CACHE_PATH = os.path.dirname(os.path.abspath(__file__)) + '/cloudfile'
ZONE_NAME = '你的域名 如 baidu.com'
UPDATE_ZONE_NAME = '主機(jī)名+域名 如 www.baidu.com'
TOKEN = '你的CloudFlare TOKEN'
EMAIL = '你的CloudFlare 郵箱'
dataFile = CACHE_PATH + '/data'
cf = CloudFlare.CloudFlare(token=TOKEN, email=EMAIL, debug=True)
def set_cloud_file_d_dns(ipv6, dns_record_id, zone_id):
dns_records = [
{'name': UPDATE_ZONE_NAME, 'type': 'AAAA', 'content': ipv6, 'proxied': False, 'ttl': 120},
]
for dns_record in dns_records:
r = cf.zones.dns_records.put(zone_id, dns_record_id, data=dns_record)
print('更新完成')
def get_cloud_file_info(ipv6):
if os.path.exists(CACHE_PATH):
if os.path.isfile(dataFile):
# 存在緩存數(shù)據(jù) 直接使用
fptr = open(dataFile, 'r')
body = json.loads(fptr.read())
fptr.close()
return body
else:
# create cache
os.mkdir(CACHE_PATH, 755)
# update
zone_info = cf.zones.get(params={'name': ZONE_NAME})
zone_id = zone_info[0]['id']
dns_records = cf.zones.dns_records.get(zone_id, params={'name': UPDATE_ZONE_NAME})
dns_record_id = dns_records[0]['id']
res = {'zone_id': zone_id, 'dns_record_id': dns_record_id, 'ipv6': dns_records[0]['content']}
with open(dataFile, 'w+') as p:
p.write(json.dumps(res))
return res
def get_Local_ipv6_address():
res = os.popen('curl -6 ip.sb')
return res.read().strip("\n")
if __name__ == '__main__':
ip = get_Local_ipv6_address()
info = get_cloud_file_info(ip)
if ip == info['ipv6']:
print('nothing to do')
exit()
set_cloud_file_d_dns(ip, info['dns_record_id'], info['zone_id'])
添加腳本到定時(shí)任務(wù)(5分鐘執(zhí)行一次)
cru a up_ipv6_ddns "5/* * * * * python {你的腳本路徑}"
#如需要加入開機(jī)啟動創(chuàng)建crontab
echo "cru a up_ipv6_ddns \"5/* * * * * python {你的腳本路徑}\" " > /jffs/scripts/services-start
這樣寻拂,你就可以在有IPV6的情況下程奠,始終通過域名訪問到你的路由器了。
測試域名是否正常解析
ping6 xxx.xxx.com
自動更新防火墻規(guī)則
由于上面所述的原因祭钉,我們并沒有IPV6固定IP瞄沙,所以我們的 IPV6內(nèi)網(wǎng)地址會發(fā)生變化(前4位);導(dǎo)致我們在開啟了防火墻的情況慌核,不能正常的訪問距境。
需要安裝bash
#安裝bash
opkg update && opkg install bash
把下面的規(guī)則模板內(nèi)容存為一個(gè)文件,如 ip6tables.tmpl
ip6tables 規(guī)則模板內(nèi)容
Generated by ip6tables-save v1.4.15 on Wed Feb 3 21:03:42 2021
*mangle
:PREROUTING ACCEPT [45593:41792202]
:INPUT ACCEPT [5649:685720]
:FORWARD ACCEPT [39727:41006577]
:OUTPUT ACCEPT [5721:778530]
:POSTROUTING ACCEPT [45463:41808923]
-A FORWARD -o ppp0 -m hl --hl-gt 30 -m hl --hl-lt 254 -j HL --hl-set 64
-A FORWARD -o ppp0 -m hl --hl-eq 254 -j HL --hl-set 255
COMMIT
# Completed on Wed Feb 3 21:03:42 2021
# Generated by ip6tables-save v1.4.15 on Wed Feb 3 21:03:42 2021
*filter
:INPUT ACCEPT [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [5721:778530]
:NSFW - [0:0]
:PControls - [0:0]
:UPNP - [0:0]
:logaccept - [0:0]
:logdrop - [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i br0 -m state --state NEW -j ACCEPT
-A INPUT -i lo -m state --state NEW -j ACCEPT
-A INPUT -m state --state INVALID -j DROP
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p ipv6-nonxt -m length --length 40 -j ACCEPT
-A INPUT -i br0 -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p udp -m udp --sport 547 --dport 546 -j ACCEPT
-A INPUT -p ipv6-icmp -m icmp6 --icmpv6-type 1 -j ACCEPT
-A INPUT -p ipv6-icmp -m icmp6 --icmpv6-type 2 -j ACCEPT
-A INPUT -p ipv6-icmp -m icmp6 --icmpv6-type 3 -j ACCEPT
-A INPUT -p ipv6-icmp -m icmp6 --icmpv6-type 4 -j ACCEPT
-A INPUT -p ipv6-icmp -m icmp6 --icmpv6-type 128 -j ACCEPT
-A INPUT -p ipv6-icmp -m icmp6 --icmpv6-type 129 -j ACCEPT
-A INPUT -p ipv6-icmp -m icmp6 --icmpv6-type 130 -j ACCEPT
-A INPUT -p ipv6-icmp -m icmp6 --icmpv6-type 131 -j ACCEPT
-A INPUT -p ipv6-icmp -m icmp6 --icmpv6-type 132 -j ACCEPT
-A INPUT -p ipv6-icmp -m icmp6 --icmpv6-type 133 -j ACCEPT
-A INPUT -p ipv6-icmp -m icmp6 --icmpv6-type 134 -j ACCEPT
-A INPUT -p ipv6-icmp -m icmp6 --icmpv6-type 135 -j ACCEPT
-A INPUT -p ipv6-icmp -m icmp6 --icmpv6-type 136 -j ACCEPT
-A INPUT -p ipv6-icmp -m icmp6 --icmpv6-type 141 -j ACCEPT
-A INPUT -p ipv6-icmp -m icmp6 --icmpv6-type 142 -j ACCEPT
-A INPUT -p ipv6-icmp -m icmp6 --icmpv6-type 143 -j ACCEPT
-A INPUT -p ipv6-icmp -m icmp6 --icmpv6-type 148 -j ACCEPT
-A INPUT -p ipv6-icmp -m icmp6 --icmpv6-type 149 -j ACCEPT
-A INPUT -p ipv6-icmp -m icmp6 --icmpv6-type 151 -j ACCEPT
-A INPUT -p ipv6-icmp -m icmp6 --icmpv6-type 152 -j ACCEPT
-A INPUT -p ipv6-icmp -m icmp6 --icmpv6-type 153 -j ACCEPT
-A INPUT -j DROP
-A FORWARD -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i br0 -o ppp0 -j ACCEPT
-A FORWARD -i br0 -o br0 -j ACCEPT
-A FORWARD -m state --state INVALID -j DROP
-A FORWARD -p ipv6-nonxt -m length --length 40 -j ACCEPT
-A FORWARD -p ipv6-icmp -m icmp6 --icmpv6-type 1 -j ACCEPT
-A FORWARD -p ipv6-icmp -m icmp6 --icmpv6-type 2 -j ACCEPT
-A FORWARD -p ipv6-icmp -m icmp6 --icmpv6-type 3 -j ACCEPT
-A FORWARD -p ipv6-icmp -m icmp6 --icmpv6-type 4 -j ACCEPT
-A FORWARD -p ipv6-icmp -m icmp6 --icmpv6-type 128 -j ACCEPT
-A FORWARD -p ipv6-icmp -m icmp6 --icmpv6-type 129 -j ACCEPT
-A FORWARD -d {IPV6SUF}::/64 -p tcp -m state --state NEW -m tcp --dport {你需要開放的端口1} -j ACCEPT
-A FORWARD -d {IPV6SUF}::/64 -p tcp -m state --state NEW -m tcp --dport {你需要開放的端口2} -j ACCEPT
-A FORWARD -d {IPV6SUF}::/64 -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A FORWARD -d {IPV6SUF}::/64 -p tcp -m state --state NEW -m tcp --dport {你需要開放的端口3} -j ACCEPT
-A FORWARD -j DROP
-A PControls -j ACCEPT
-A logaccept -m state --state NEW -j LOG --log-prefix "ACCEPT " --log-tcp-sequence --log-tcp-options --log-ip-options
-A logaccept -j ACCEPT
-A logdrop -m state --state NEW -j LOG --log-prefix "DROP " --log-tcp-sequence --log-tcp-options --log-ip-options
-A logdrop -j DROP
COMMIT
# Completed on Wed Feb 3 21:03:42 2021" > /j
自動更新防火墻規(guī)則腳本
#!/bin/bash
# 更新ip6tables 局域網(wǎng)網(wǎng)段防火墻規(guī)則
# 防止因局域網(wǎng)內(nèi)網(wǎng)IP ISP運(yùn)營商給變化后 不能訪問
# create date 2020/02/03
ip6tablesDumpFile="./ip6tables.dump"
ip6addr=$(ifconfig | grep -E -o "\w{1,4}:\w{1,4}:\w{1,4}:\w{1,4}::1/64")
while IFS=':' read -ra ADDR; do
#取前4位
ip6suf="${ADDR[0]}:${ADDR[1]}:${ADDR[2]}:${ADDR[3]}"
done <<<"$ip6addr"
file="./ip6Suf.ip"
if [ -f $file ]; then
cacheIpSuf=$(cat $file)
else
cacheIpSuf=""
fi
#寫緩存ip
if [ -z $cacheIpSuf ]; then
echo "$ip6suf" > $file
fi
if [ "$ip6addr" != "$cacheIpSuf::1/64" ]; then
# 更新
#替換ip6tables中的局域網(wǎng)段
ip6tablesRule=$(sed "s/{IPV6SUF}/$ip6suf/g" ./ip6tables.tmpl)
echo "$ip6tablesRule" >$ip6tablesDumpFile
#刷新ip6tables
ip6tables-restore <$ip6tablesDumpFile
echo "$ip6suf" > $file
echo "ip6tables rule update succeed"
else
echo "no thing update"
fi
把腳本存為 up_ip6tables.sh 在命令行輸入以下命令
# 加入開機(jī)創(chuàng)建crontab
echo "cru a up_ip6tables_rule \"*/5 * * * * bash {你的腳本路徑}\"" > /jffs/scripts/services-start
晚安垮卓!第一次發(fā)這么長的技術(shù)文垫桂。有不懂的的地方,歡迎留言粟按。
歡迎關(guān)注我的個(gè)人博客