前言
最近買了個漢土IP盒子,說可以給我家里弄個固定IP硝烂,每個月只需要二三十塊錢箕别。這個很牛逼,很值得呀滞谢。但是吧串稀,如果只能對外連一臺電腦,這個事情就有些雞肋了爹凹。不過呢厨诸,巧了,家里有個J1900的軟路由禾酱,有四個網(wǎng)口微酬。于是就開啟了本次折騰的旅程。
目標(biāo)
我手上呢颤陶,有兩個家用無線路由器颗管,一個J1900四網(wǎng)口軟路由,刷的OpenWrt滓走,以及一個樹莓派4B4G版垦江。所有的東西大概如下:
我基本上的想法有這么幾點:
- 由于我現(xiàn)在用的蒲公英路由器上的家里的局域網(wǎng),所以暫時就還用它做主路由了搅方,性能什么的比吭,湊合就好。
- 如果我把IP盒子側(cè)接入我的局域網(wǎng)姨涡,我總覺得會有安全問題衩藤,而且看評論側(cè)接也出現(xiàn)了不少問題,所以我不打算用側(cè)接涛漂。
- 由于IP盒子的官方配置里沒有網(wǎng)關(guān)的功能配置赏表,所以我打算讓IP盒子直連的是我的軟路由,以此充當(dāng)網(wǎng)關(guān)和防火墻匈仗。
- 在軟路由下瓢剿,我可以開一個子網(wǎng),以此我就可以弄一個自己的封閉的局域網(wǎng)悠轩。它們既可以通過我的局域網(wǎng)訪問公網(wǎng)间狂,也可以通過IP盒子從外網(wǎng)訪問進來,是在是美的很哗蜈。
搭建
基于以上幾點前标,我搭建的結(jié)構(gòu)如下圖:
需要補充說明的是坠韩,我軟路由中l(wèi)an、wan炼列、wan2是在一個firewall中的只搁,所以可以很方便得通信,我對在軟路由中透傳192.168.2.10的22端口俭尖,是可以實現(xiàn)端口映射的氢惋。這個時候其實我是可以從192.168.2.1、192.168.31.2稽犁、192.168.148.100的22端口訪問192.168.2.10的22端口的焰望,但是由于網(wǎng)關(guān)192.168.31.1的路由能力,是找不到192.168.2.1和192.168.148.100的已亥。但是熊赖,我通過固定IP訪問卻無法訪問這個22端口。之前我測試過虑椎,軟路由的時候是可以22訪問軟路由的震鹉。本來我想通過網(wǎng)絡(luò)配置界面測試固定ip是否通了,但是80端口默認(rèn)是封了的捆姜,沒法用來做測試传趾。所以,這趟測試也是測試IP盒子怎么用的過程泥技。
下面我們詳細說下圖中需要的具體配置:
- lan:ip是192.168.2.1浆兰,掩碼:255.255.255.0,網(wǎng)關(guān)不填
- wan:ip是192.168.31.2珊豹,掩碼:255.255.255.0簸呈,網(wǎng)關(guān)192.168.31.1
- wan3: ip是192.168.148.100,掩碼:255.255.255.0店茶,網(wǎng)關(guān):192.168.148.1
這些是一些ip的基本配置蝶棋。另外需要注意的是剛才j1900各個接口的名字其實就是隨便取的,關(guān)鍵的是他們屬于的防火墻策略忽妒。在openwrt中默認(rèn)提供了兩個防火墻(firewall)策略,分別是lan和wan兼贸,在設(shè)置interface的時候?qū)嶋H上是需要選擇他們所屬的防火墻策略的段直。在開始的時候,我為了可以讓wan口可以訪問近來溶诞,對防火墻策略進行了調(diào)整鸯檬,然后我自己就改不回來了。后來我是在弄不通了螺垢,找漢土IP盒子的售后幫忙喧务,人家從上午十點調(diào)到晚上十一點赖歌,可能也是受限于不知道怎么調(diào)防火墻策略吧,一直沒通功茴,不過還是非常感謝他庐冯。在他調(diào)試的過程中,我對wan域坎穿、防火墻配置展父,什么是lan口wan口等這些概念有了初步的認(rèn)知和了解。今天我重新刷了openwrt玲昧,分分鐘搞定栖茉。
lan口屬于lan域,wan和wan2屬于wan域孵延。這個時候吕漂,WAN口是不可以從外側(cè)訪問的,所以尘应,這個時候我就只能在lan口下訪問網(wǎng)絡(luò)配置界面惶凝。但是我的主路由的局域網(wǎng)是在192.168.31.0網(wǎng)段的,這就很尷尬了菩收。于是我做了一個端口映射梨睁,將192.168.2.1的80端口映射到了wan域的8080端口上。于是娜饵,我就可以用192.168.31.2:8080來進行網(wǎng)絡(luò)配置了坡贺。下面放一張配置的截圖吧,要不應(yīng)該還是會有拉掉一些細節(jié)(我重置后沒有重命名interface箱舞,wan6就是圖中的wan2):
OpenVPN服務(wù)器搭建
既然這個局域網(wǎng)絡(luò)是用來搭建家里的網(wǎng)絡(luò)了遍坟,那么隨時可以訪問這個網(wǎng)絡(luò)就非常重要了。公司的網(wǎng)絡(luò)是使用的ipsec+SSL搭建的VPN晴股,用的是路由器上自己支持的功能愿伴。我翻了下,openwrt默認(rèn)的功能很少电湘。而且隔节,之前我折騰在linux服務(wù)器上搭建ipsec服務(wù)是很麻煩的,所以寂呛,這次我打算使用openvpn怎诫,搭建簡單,使用簡單贷痪。
在openwrt的官網(wǎng)是由相關(guān)內(nèi)容的幻妓,以下是地址:
https://openwrt.org/docs/guide-user/services/vpn/openvpn/basic 但是說實話,還是感覺比較虛劫拢。網(wǎng)上我還找了篇帖子肉津,是https://v2ex.com/t/624222
這里似乎對配置的內(nèi)容說的比較詳細强胰,而且最后是有g(shù)ui管理界面的。對照著來吧妹沙。
下面是我的搭建過程:
安裝軟件包:
opkg update
opkg install openvpn-easy-rsa openvpn-mbedtls luci-app-openvpn
配置防火墻開放相應(yīng)端口
# 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那幾個東西初烘,為什么要刪除或者添加這些東西涡真。不過,結(jié)果和預(yù)期的一樣肾筐,你可以在Network->firewall->Traffic Rules下看到這個內(nèi)容了:
生成服務(wù)器和客戶端證書
# 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
生成服務(wù)器配置文件
# 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"
<dh>${NL}${OVPN_DH}${NL}</dh>
<tls-crypt>${NL}${OVPN_TC}${NL}</tls-crypt>
<ca>${NL}${OVPN_CA}${NL}</ca>
<cert>${NL}${OVPN_CERT}${NL}</cert>
<key>${NL}${OVPN_KEY}${NL}</key>
EOF
done
/etc/init.d/openvpn restart
OVPN_POOL="192.168.8.0 255.255.255.0" 定義的地址池不要和內(nèi)網(wǎng)已有的地址沖突 push "redirect-gateway def1" 是將 OpenVPN 的網(wǎng)關(guān)作為默認(rèn)網(wǎng)關(guān)哆料,會創(chuàng)建默認(rèn)路由指向 OpenVPN 的網(wǎng)關(guān),如果只是需要訪問家里的網(wǎng)絡(luò)吗铐,可將這條按需要修改东亦,如push "route 192.168.1.0 255.255.255.0 192.168.8.1"
生成客戶端 ovpn 文件
# 先確定使用 DDNS 還是公網(wǎng) IP 作為 OpenVPN 連接使用,并配置好 OVPN_SERV 參數(shù)唬渗,本次以 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
<tls-crypt>${NL}${OVPN_TC}${NL}</tls-crypt>
<ca>${NL}${OVPN_CA}${NL}</ca>
<cert>${NL}${OVPN_CERT}${NL}</cert>
<key>${NL}${OVPN_KEY}${NL}</key>
EOF
done
ls ${OVPN_DIR}/*.ovpn
將該 ovpn 導(dǎo)入到 OpenVPN 的客戶端就可以鏈接上 OpenVPN 服務(wù)器典阵。
不過,這次有了一個變化镊逝。我之前是把wan口的80透到了lan口的8080端口壮啊,但是通過openvpn連通后,似乎是通過wan口側(cè)訪問的撑蒜,所以歹啼,wan口的ip:80端口就可以訪問到頁面。相應(yīng)的座菠,其它的端口映射端口也可以直接通過wan口側(cè)的端口訪問狸眼,而映射后的端口似乎不可用了,可能還能在lan口的ip上用吧浴滴,懶得改了拓萌。
補充
- 不懂就千萬不要動防火墻配置
- 如果想要訪問192.168.2.0網(wǎng)段的及其,在本機加一條路由就可以了升略,命令如下:
route add 192.168.2.0 mask 255.255.255.0 192.168.31.1 # 添加指令
route print # 查詢指令
route delete 192.168.2.0 #刪除路由