家里折腾网络配置(汉土IP盒子)

前言

最近买了个汉土IP盒子,说可以给我家里弄个固定IP,每个月只需要二三十块钱。这个很牛逼,很值得呀。但是吧,如果只能对外连一台电脑,这个事情就有些鸡肋了。不过呢,巧了,家里有个J1900的软路由,有四个网口。于是就开启了本次折腾的旅程。

目标

我手上呢,有两个家用无线路由器,一个J1900四网口软路由,刷的OpenWrt,以及一个树莓派4B4G版。所有的东西大概如下:


可用设备

我基本上的想法有这么几点:

  1. 由于我现在用的蒲公英路由器上的家里的局域网,所以暂时就还用它做主路由了,性能什么的,凑合就好。
  2. 如果我把IP盒子侧接入我的局域网,我总觉得会有安全问题,而且看评论侧接也出现了不少问题,所以我不打算用侧接。
  3. 由于IP盒子的官方配置里没有网关的功能配置,所以我打算让IP盒子直连的是我的软路由,以此充当网关和防火墙。
  4. 在软路由下,我可以开一个子网,以此我就可以弄一个自己的封闭的局域网。它们既可以通过我的局域网访问公网,也可以通过IP盒子从外网访问进来,是在是美的很。

搭建

基于以上几点,我搭建的结构如下图:

设备连接示意图

需要补充说明的是,我软路由中lan、wan、wan2是在一个firewall中的,所以可以很方便得通信,我对在软路由中透传192.168.2.10的22端口,是可以实现端口映射的。这个时候其实我是可以从192.168.2.1、192.168.31.2、192.168.148.100的22端口访问192.168.2.10的22端口的,但是由于网关192.168.31.1的路由能力,是找不到192.168.2.1和192.168.148.100的。但是,我通过固定IP访问却无法访问这个22端口。之前我测试过,软路由的时候是可以22访问软路由的。本来我想通过网络配置界面测试固定ip是否通了,但是80端口默认是封了的,没法用来做测试。所以,这趟测试也是测试IP盒子怎么用的过程。
下面我们详细说下图中需要的具体配置:

  • lan:ip是192.168.2.1,掩码:255.255.255.0,网关不填
  • wan:ip是192.168.31.2,掩码:255.255.255.0,网关192.168.31.1
  • wan3: ip是192.168.148.100,掩码:255.255.255.0,网关:192.168.148.1

这些是一些ip的基本配置。另外需要注意的是刚才j1900各个接口的名字其实就是随便取的,关键的是他们属于的防火墙策略。在openwrt中默认提供了两个防火墙(firewall)策略,分别是lan和wan,在设置interface的时候实际上是需要选择他们所属的防火墙策略的。在开始的时候,我为了可以让wan口可以访问近来,对防火墙策略进行了调整,然后我自己就改不回来了。后来我是在弄不通了,找汉土IP盒子的售后帮忙,人家从上午十点调到晚上十一点,可能也是受限于不知道怎么调防火墙策略吧,一直没通,不过还是非常感谢他。在他调试的过程中,我对wan域、防火墙配置,什么是lan口wan口等这些概念有了初步的认知和了解。今天我重新刷了openwrt,分分钟搞定。
lan口属于lan域,wan和wan2属于wan域。这个时候,WAN口是不可以从外侧访问的,所以,这个时候我就只能在lan口下访问网络配置界面。但是我的主路由的局域网是在192.168.31.0网段的,这就很尴尬了。于是我做了一个端口映射,将192.168.2.1的80端口映射到了wan域的8080端口上。于是,我就可以用192.168.31.2:8080来进行网络配置了。下面放一张配置的截图吧,要不应该还是会有拉掉一些细节(我重置后没有重命名interface,wan6就是图中的wan2):

端口映射界面

OpenVPN服务器搭建

既然这个局域网络是用来搭建家里的网络了,那么随时可以访问这个网络就非常重要了。公司的网络是使用的ipsec+SSL搭建的VPN,用的是路由器上自己支持的功能。我翻了下,openwrt默认的功能很少。而且,之前我折腾在linux服务器上搭建ipsec服务是很麻烦的,所以,这次我打算使用openvpn,搭建简单,使用简单。
在openwrt的官网是由相关内容的,以下是地址:
https://openwrt.org/docs/guide-user/services/vpn/openvpn/basic 但是说实话,还是感觉比较虚。网上我还找了篇帖子,是https://v2ex.com/t/624222
这里似乎对配置的内容说的比较详细,而且最后是有gui管理界面的。对照着来吧。

下面是我的搭建过程:

安装软件包:

opkg update
opkg install openvpn-easy-rsa openvpn-mbedtls luci-app-openvpn

配置防火墙开放相应端口

# Configure firewall
uci rename firewall.@zone[0]="lan"
uci rename firewall.@zone[1]="wan"
uci rename firewall.@forwarding[0]="lan_wan"
uci del_list firewall.lan.device="tun0"
uci add_list firewall.lan.device="tun0"
uci -q delete firewall.vpn
uci set firewall.ovpn="rule"
uci set firewall.ovpn.name="Allow-OpenVPN"
uci set firewall.ovpn.src="wan"
uci set firewall.ovpn.dest_port="1194"
uci set firewall.ovpn.proto="udp"
uci set firewall.ovpn.target="ACCEPT"
uci commit firewall
/etc/init.d/firewall restart

说实话,我不太看得懂上面是干什么的,比如为什么要rename那几个东西,为什么要删除或者添加这些东西。不过,结果和预期的一样,你可以在Network->firewall->Traffic Rules下看到这个内容了:

openvpn的防火墙策略

生成服务器和客户端证书

# Configuration parameters
export EASYRSA_PKI="/etc/easy-rsa/pki"
export EASYRSA_REQ_CN="ovpnca"
 
# Remove and re-initialize the PKI directory
easyrsa --batch init-pki
 
# Generate DH parameters
# 此步会较久
easyrsa --batch gen-dh
 
# Create a new CA
easyrsa --batch build-ca nopass
 
# Generate a keypair and sign locally for a server
easyrsa --batch build-server-full server nopass
 
# Generate a keypair and sign locally for a client
easyrsa --batch build-client-full client nopass

生成服务器配置文件

# Generate TLS PSK
OVPN_PKI="/etc/easy-rsa/pki"
openvpn --genkey --secret ${OVPN_PKI}/tc.pem
 
# Configuration parameters
OVPN_DIR="/etc/openvpn"
OVPN_PKI="/etc/easy-rsa/pki"
OVPN_DEV="$(uci get firewall.lan.device | sed -e "s/^.*\s//")"
OVPN_PORT="$(uci get firewall.ovpn.dest_port)"
OVPN_PROTO="$(uci get firewall.ovpn.proto)"
OVPN_POOL="192.168.8.0 255.255.255.0"
OVPN_DNS="${OVPN_POOL%.* *}.1"
OVPN_DOMAIN="$(uci get dhcp.@dnsmasq[0].domain)"
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 server
umask u=rw,g=,o=
grep -l -r -e "TLS Web Server Auth" "${OVPN_PKI}/issued" \
| sed -e "s/^.*\///;s/\.\w*$//" \
| while read -r OVPN_ID
do
OVPN_CERT="$(openssl x509 -in ${OVPN_PKI}/issued/${OVPN_ID}.crt)"
OVPN_KEY="$(cat ${OVPN_PKI}/private/${OVPN_ID}.key)"
cat << EOF > ${OVPN_DIR}/${OVPN_ID}.conf
verb 3
user nobody
group nogroup
dev ${OVPN_DEV}
port ${OVPN_PORT}
proto ${OVPN_PROTO}
server ${OVPN_POOL}
topology subnet
client-to-client
keepalive 10 120
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"
${NL}${OVPN_DH}${NL}
${NL}${OVPN_TC}${NL}
${NL}${OVPN_CA}${NL}
${NL}${OVPN_CERT}${NL}
${NL}${OVPN_KEY}${NL}
EOF
done
/etc/init.d/openvpn restart

OVPN_POOL="192.168.8.0 255.255.255.0" 定义的地址池不要和内网已有的地址冲突 push "redirect-gateway def1" 是将 OpenVPN 的网关作为默认网关,会创建默认路由指向 OpenVPN 的网关,如果只是需要访问家里的网络,可将这条按需要修改,如push "route 192.168.1.0 255.255.255.0 192.168.8.1"
生成客户端 ovpn 文件

# 先确定使用 DDNS 还是公网 IP 作为 OpenVPN 连接使用,并配置好 OVPN_SERV 参数,本次以 DDNS 地址为例子
OVPN_SERV="ddns.example.com"

# Configuration parameters
OVPN_DIR="/etc/openvpn"
OVPN_PKI="/etc/easy-rsa/pki"
OVPN_DEV="$(uci get firewall.lan.device | sed -e "s/^.*\s//")"
OVPN_PORT="$(uci get firewall.ovpn.dest_port)"
OVPN_PROTO="$(uci get firewall.ovpn.proto)"
OVPN_TC="$(sed -e "/^#/d;/^\w/N;s/\n//" ${OVPN_PKI}/tc.pem)"
OVPN_CA="$(openssl x509 -in ${OVPN_PKI}/ca.crt)"
NL=$'\n'
 
# Generate VPN client profiles
umask u=rw,g=,o=
grep -l -r -e "TLS Web Client Auth" "${OVPN_PKI}/issued" \
| sed -e "s/^.*\///;s/\.\w*$//" \
| while read -r OVPN_ID
do
OVPN_CERT="$(openssl x509 -in ${OVPN_PKI}/issued/${OVPN_ID}.crt)"
OVPN_KEY="$(cat ${OVPN_PKI}/private/${OVPN_ID}.key)"
cat << EOF > ${OVPN_DIR}/${OVPN_ID}.ovpn
verb 3
dev ${OVPN_DEV%%[0-9]*}
nobind
client
remote ${OVPN_SERV} ${OVPN_PORT} ${OVPN_PROTO}
auth-nocache
remote-cert-tls server
${NL}${OVPN_TC}${NL}
${NL}${OVPN_CA}${NL}
${NL}${OVPN_CERT}${NL}
${NL}${OVPN_KEY}${NL}
EOF
done
ls ${OVPN_DIR}/*.ovpn

将该 ovpn 导入到 OpenVPN 的客户端就可以链接上 OpenVPN 服务器。
不过,这次有了一个变化。我之前是把wan口的80透到了lan口的8080端口,但是通过openvpn连通后,似乎是通过wan口侧访问的,所以,wan口的ip:80端口就可以访问到页面。相应的,其它的端口映射端口也可以直接通过wan口侧的端口访问,而映射后的端口似乎不可用了,可能还能在lan口的ip上用吧,懒得改了。

补充

  • 不懂就千万不要动防火墙配置
  • 如果想要访问192.168.2.0网段的及其,在本机加一条路由就可以了,命令如下:
route add 192.168.2.0 mask 255.255.255.0 192.168.31.1 # 添加指令
route print # 查询指令
route delete 192.168.2.0 #删除路由

你可能感兴趣的:(家里折腾网络配置(汉土IP盒子))