导读:家庭路由器如果有幸能够拥有一个公网 IP 是非常省事的,会直接省去各种 p2p 打洞、远程端口转发工具,如Zerotier、看雪的 KSA 、Frp、NPS等,另外,还不需要额外购买具有公网 IP 的 VPS 。
来 源丨易雾山庄(ID:evling2020)
作 者丨易雾君
自 称丨低级网络玩家
家庭宽带申请公网 IP
光猫改桥接模式
域名准备
域名解析接管
易雾君在购得了域名之后,将域名解析的权限交由 Cloudflare ,Cloudflare 是一个在国际上挺出名的 CDN 平台,重点是基础功能还能免费。关于这之类操作,网络教程比比皆是,易雾君也想偷点懒了。
DDNS
鉴于易雾君使用的网关路由固件是 OpenWRT 及域名解析由 Cloudflare 托管,固件安装请参考《家庭网关斐讯 K3 基础环境篇》 ,现就此给出动态解析域名的脚本,该脚本最大的特点是,不会总是向 Cloudflare 接口发起请求,而是诊断 IP 地址有变动时才发起请求,在 /etc/k3/ddns.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 组网拓展篇》。
参考
OpenVPN server
易雾山庄记录了家庭网络基础建设的种种实践,可以帮助更多有需要的人减少折腾。希望通过这个平台构建一只家庭基建小社群,共同优化我们的生活体验,增强个人数据安全保护意识,同时我们还要考虑环保节能问题,实实在在帮大家伙组建属于自己的家庭网络。
支持原创,觉得有用,分享点赞在看加关注,任选其一,就是对我最大的鼓励。