家庭网关斐讯 k3 面向公网篇

本贴最后更新于 1458 天前,其中的信息可能已经时过境迁

导读

家庭路由器如果有幸能够拥有一个公网 IP 是非常省事的,会直接省去各种 p2p 打洞、远程端口转发工具,如 Zerotier、看雪的 KSA 、Frp、NPS 等,另外,还不需要额外购买具有公网 IP 的 VPS 。

家庭宽带申请公网 IP

申请公网 IP 并不是每个人申请了就一定会有的,得分地区,有些地区网络运营商压根就不给提供这项服务,也是不可强求的,毕竟 IPv4 地址本身就比较稀缺。家庭宽带用户如需获取公网 IP 尝试拨打人工服务,即可直接申请,能申请下来的,也是动态 IP ,固定 IP 则是需要额外付费的服务。开通公网后,强烈建议大家伙不要用来发布站点,因为该 IP 资产在境内,站点在境内的可能需要备案,不然是属于非法建站,易雾君的建议是仅在该公网 IP 处开启内网接入服务,各类站点应用程序只对内发布。

光猫改桥接模式

网络运营商提供的光猫能力有限,公网 IP 绑定在上面难于管理,每次对外映射端口还得做次映射规则,而且有些光猫默认将管理端口对 wan 口开放,且内置默认密码,安全性问题凸显,用户不认真审查的话,家庭的隐私面临最直接的威胁,最好还是将其仅用作桥接功能,核心网关由自购路由器承担,易雾君则是选择了斐讯 K3 ,这样就对核心路由有了更强的控制能力。

域名准备

作为个人,尤其是在现在信息化社会,拥有域名也是很常见的事情了,域名的作用简单来讲就是管理 IP 地址。易雾君今年原本是打算在 godaddy 购置域名 evling.org 的,鬼知道它突然一天后需要我提供个人证件材料激活,于是果断选择 namecheap 买了 evling.me ,易雾君是个既怕麻烦的人,又是一个不怕麻烦的人,显然在购买域名上是怕麻烦的。

域名解析接管

易雾君在购得了域名之后,将域名解析的权限交由 CloudflareCloudflare 是一个在国际上挺出名的 CDN 平台,重点是基础功能还能免费。关于这之类操作,网络教程比比皆是,易雾君也想偷点懒了。

DDNS
鉴于易雾君使用的网关路由固件是 OpenWRT 及域名解析由 Cloudflare 托管,固件安装请参考《家庭网关斐讯 K3 基础环境篇》 ,现就此给出动态解析域名的脚本,该脚本最大的特点是,不会总是向 Cloudflare 接口发起请求,而是诊断 IP 地址有变动时才发起请求,在 /etc/k3/ddns.sh 文件下填写如下内容:

#!/bin/sh
CF_API_KEY=替换为你的 API_KEY
CF_ZONE_ID=替换为你的 ZONE_ID
CF_DNS_ID=替换为你的 DNS_ID
EMAIL=替换为你的邮箱形式的帐号名
ROUTER_NETWORK_DEVICE=替换为你的 wan 口接口,易雾君的是pppoe-wan
TEMP_FILE_PATH=/tmp/cloudflare-ddns/
DNS_RECORD=替换为你的网关域名,易雾君的是 vnet.evling.me

if [ ! -d "$TEMP_FILE_PATH" ]; then
    mkdir -p ${TEMP_FILE_PATH}
fi

ifconfig $ROUTER_NETWORK_DEVICE | awk -F'[ ]+|:' '/inet /{print $4}'>${TEMP_FILE_PATH}/current_ip.txt

if [ -f ${TEMP_FILE_PATH}/current_ip.txt ] && [ -f ${TEMP_FILE_PATH}/current_resolving.txt ]; then
    if [ "$(cat ${TEMP_FILE_PATH}/current_ip.txt)" == "$(cat ${TEMP_FILE_PATH}/current_resolving.txt)" ]; then
        exit 1
    fi
fi

CURRENT_IP="$(cat ${TEMP_FILE_PATH}/current_ip.txt)"
curl -k -X PUT "https://api.cloudflare.com/client/v4/zones/${CF_ZONE_ID}/dns_records/${CF_DNS_ID}" \
-H "X-Auth-Email:${EMAIL}" \
-H "X-Auth-Key:${CF_API_KEY}" \
-H "Content-Type: application/json" \
--data '{"type":"A","name":"'$DNS_RECORD'","content":"'$CURRENT_IP'","ttl":1,"proxied":false}' && echo ${CURRENT_IP} > ${TEMP_FILE_PATH}/current_resolving.txt

随后添加个任务计划到 crontab

* * * * *       /etc/k3/ddns.sh

另外需要安装 curl ,OpenWRT 纯净版是不自带的,给予 /etc/k3/ddns.sh 可执行权限。

sed -i 's/downloads.lede-project.org/mirrors.ustc.edu.cn\/openwrt/g' /etc/opkg/distfeeds.conf
opkg update && opkg install curl
chmod +x /etc/k3/ddns.sh

家庭网关接入服务搭建

接入内网,易雾君选择 OpenVPN ,在境内该服务的协议是不被干扰的,如果你想从境外访问境内的 OpenVPN 就不能保证不被干扰了,易雾君尽最大能力将个别步骤能自动化的就自动化了,请各位把如下脚本直接 Copy 到 OpenWRT shell 下,见证奇迹吧,就是这么简单。得到配置文件后再改改参数也不迟。

# Base installkits
opkg update && opkg install openvpn-easy-rsa luci-app-openvpn openvpn-openssl

# Base vars
OVPN_DIR="/etc/openvpn"
OVPN_PKI="/etc/easy-rsa/pki"
OVPN_PORT="1194"
OVPN_PROTO="udp"
OVPN_POOL="192.168.8.0 255.255.255.0"
OVPN_DNS="${OVPN_POOL%.* *}.1"
OVPN_DOMAIN="$(uci get dhcp.@dnsmasq[0].domain)"
OVPN_SERV="vnet.evling.me" # Please change to yours


# Configuration parameters
export EASYRSA_KEY_SIZE="2048"
export EASYRSA_PKI="${OVPN_PKI}"
export EASYRSA_REQ_CN="ovpnca"
export EASYRSA_BATCH="1"

# Remove and re-initialize the PKI directory
echo yes | easyrsa init-pki

# Generate DH parameters
easyrsa gen-dh

# Create a new CA
echo -e "\n" | easyrsa build-ca nopass

# Generate a key pair and sign locally for a server
easyrsa build-server-full server nopass

# Generate a key pair and sign locally for a client
easyrsa build-client-full client nopass

# Generate TLS PSK
openvpn --genkey --secret /etc/easy-rsa/pki/tc.pem


# Configure firewall
uci rename firewall.@zone[0]="lan"
uci rename firewall.@zone[1]="wan"
uci del_list firewall.lan.device="tun+"
uci add_list firewall.lan.device="tun+"
uci -q delete firewall.ovpn
uci set firewall.ovpn="rule"
uci set firewall.ovpn.name="Allow-OpenVPN"
uci set firewall.ovpn.src="wan"
uci set firewall.ovpn.dest_port="${OVPN_PORT}"
uci set firewall.ovpn.proto="${OVPN_PROTO}"
uci set firewall.ovpn.target="ACCEPT"
uci commit firewall
/etc/init.d/firewall restart


# Configuration parameters
OVPN_DH="$(cat ${OVPN_PKI}/dh.pem)"
OVPN_TC="$(sed -e "/^#/d;/^\w/N;s/\n//" ${OVPN_PKI}/tc.pem)"
OVPN_CA="$(openssl x509 -in ${OVPN_PKI}/ca.crt)"
NL=$'\n'
 
# Configure VPN service and generate client profiles
umask go=
ls ${OVPN_PKI}/issued \
| sed -e "s/\.\w*$//" \
| while read -r OVPN_ID
do
OVPN_KEY="$(cat ${OVPN_PKI}/private/${OVPN_ID}.key)"
OVPN_CERT="$(openssl x509 -in ${OVPN_PKI}/issued/${OVPN_ID}.crt)"
OVPN_CERT_EXT="$(openssl x509 -in ${OVPN_PKI}/issued/${OVPN_ID}.crt -purpose)"
OVPN_CONF_SERVER="\
user nobody
group nogroup
dev tun
port ${OVPN_PORT}
proto ${OVPN_PROTO}
server ${OVPN_POOL}
topology subnet
client-to-client
keepalive 10 60
persist-tun
persist-key
push \"dhcp-option DNS ${OVPN_DNS}\"
push \"dhcp-option DOMAIN ${OVPN_DOMAIN}\"
push \"redirect-gateway def1\"
push \"persist-tun\"
push \"persist-key\"
<dh>${NL}${OVPN_DH}${NL}</dh>"
OVPN_CONF_CLIENT="\
dev tun
nobind
client
remote ${OVPN_SERV} ${OVPN_PORT} ${OVPN_PROTO}
auth-nocache
remote-cert-tls server"
OVPN_CONF_COMMON="\
<tls-crypt>${NL}${OVPN_TC}${NL}</tls-crypt>
<key>${NL}${OVPN_KEY}${NL}</key>
<cert>${NL}${OVPN_CERT}${NL}</cert>
<ca>${NL}${OVPN_CA}${NL}</ca>"
case ${OVPN_CERT_EXT} in
(*"SSL server : Yes"*) cat << EOF > ${OVPN_DIR}/${OVPN_ID}.conf ;;
${OVPN_CONF_SERVER}
${OVPN_CONF_COMMON}
EOF
(*"SSL client : Yes"*) cat << EOF > ${OVPN_DIR}/${OVPN_ID}.ovpn ;;
${OVPN_CONF_CLIENT}
${OVPN_CONF_COMMON}
EOF
esac
done
/etc/init.d/openvpn restart
/etc/init.d/openvpn enable
ls ${OVPN_DIR}/*.ovpn

恭喜你,到这里你已经部署好了家庭网关服务且产生了客户端配置文件,将 /etc/openvpn/client.ovpn 拿到其他机器上进行连接测试即可。

结语

本篇的面向公网篇,对家庭网关服务的基础配置就先到这里,更高级的定制,如:

  • 接入后可访问公网
  • 各个客户端指定固定 IP ,推送不同的路由
  • 服务端所在网络如何与客户端机器所在网络进行通信

敬请期待下篇《家庭网关斐讯 k3 组网拓展篇》。

对了对了,更多精彩不要错过,扫码关注我哟

qrcodeforghf959fbb94792258.jpg

参考

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • 强烈建议大家伙不要用来发布站点,因为该 IP 资产在境内,站点在境内的可能需要备案,不然是属于非法建站

    所以你的博客是 ?😳

    1 回复
  • evling
    作者

    如邮件回复,我的博客直接关联的 IP 资产是隶属于 Cloudflare,并跟境内 IP 资产绑定呢