This repository has been archived on 2023-11-13. You can view files and clone it, but cannot push or open issues or pull requests.
blog/_posts/2023-08-27-openwrt_oracle.md

227 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
layout : post
title : "Oracle & ImmortalWrt"
subtitle : "感觉日子越过越快了"
date : 2023-08-27 17:41:39
author : "Manford Fan"
catalog : false
header-img : "img/post-bg-universe.jpg"
tags :
- Docker
- OpenWRT
- Oracle
- VPS
---
好久没有记录新的内容了,最近几个月,是这几年过得最快乐的时光,虽然有身体上的劳累,有心灵上的疲惫,但是和家人在一起,总是让我非常的安心和快乐。厦门之旅算是已经完满结束了,工作还没有着落,大概还要继续在家躺上一段时间,就当给自己放个长假了。从回来一直在忙房子的事情,这几天总算告一段落,有了空闲的时间,继续探索,继续快乐。
打开小白,发现网站无法访问了,尝试登录超爱云,发现他的网站也无法访问了!!!一种不祥的预感涌上心头,不会是,跑路了吧🥲🥲🥲...... 随后联系官方的负责人其实是一个QQ号在线却无响应持续几天过后才接受了现实。然后在一个月黑风高的夜晚我走进了海鲜市场准备碰碰运气看能否找到个甲骨文的机器还不错真被我找到了。于是又斥巨资但是比超爱云便宜🥹哭死买了一个法兰克福的账号一个1C1G500M的ADM和两个2C12G2G的ARM其实还可以再开一个AMD的暂时没有操作。另外就是在从厦门回来之前搭建的OpenWRT做了旁路由实现家中其他设备的科学上网期间也遇到了一些问题在此一并记录一下。
## 一、甲骨文云
甲骨文是一家做数据库的巨头公司。后来亚马逊、微软谷歌等美国巨头公司推出了自己的云计算服务甲骨文也做了云计算服务。其它巨头推出免费试用一年甲骨文2019年9月推出永久免费服务。不管他家的服务如何总之**永久免费**的噱头一经打出立即引来了不少流量。但是这种永久免费的服务也引来了很多诟病因为Oracle会时不时的封禁免费账号原因不明堪称玄学典范。因此除了自己注册账号用来体验买号基本上就是愿赌服输了能用多久全看运气。
![oracle_free](/img/posts/oracle_free.png 'oracle_free')
### 1. 如何申请
申请Oracle Cloud甲骨文云要提前准备条件如下
- 一个邮箱最好是Gmail或hotmail之类的国外常用邮箱
- 一张卡面有Master、VISA或AMEX之一标志的外币信用卡(单标外币信用卡通过率高一些)
- 一个手机号,中国的就行
- 魔法上网环境
最后一个可能是非必要的,网络上有人说一定不要用虚假的信息,总之,注册成功与否和是否被封号,都是**玄学**。
### 2. 开启实例
进入[https://cloud.oracle.com/compute/instances?region=eu-frankfurt-1]()***eu-frankfurt-1***修改成自己的区域开始创建实例可以选择IPv6实例可以是两个1C1G的AMD也可以是两个2C12G的ARM或者一个4C24G的ARM所有机器存储总大小限额200GAMD的带宽是500MbpsARM的带宽是2Gbps。
![oracle_vps](/img/posts/oracle_vps.png 'oracle_vps')
### 3. 安全组&防火墙
安全组可以按需配置或者简单粗暴的配置成允许所有访问。一开始配置完安全组之后并配置好了FRP透传服务发现还是无法正常访问网站应用后来GOOGLE了下需要在系统下对防火墙进行配置
```bash
#开放所有端口
sudo iptables -P INPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -P OUTPUT ACCEPT
sudo iptables -F
#Oracle自带的Ubuntu镜像默认设置了Iptable规则关闭它
apt-get purge netfilter-persistent
#强制删除
rm -rf /etc/iptables && reboot
```
## 二、OpenWRT配置
很早之前就听说过路由器刷机OpenWRT实现自由上网总觉得很莫名其妙刷个系统就能绕过GFW了吗这怎么可能呢直到今年5月份的时候拿到小白之后资源配置也充足了也有时间折腾详细的看了下相关内容大概也了解了一些原理于是自己用Docker搭建了一个OpenWRT用作[旁路网关](https://mlapp.cn/376.html),给其他相关设备提供必要服务。
### 1. 选择镜像
这类镜像非常多,这里选择的是[sulinggg/openwrt](https://hub.docker.com/r/sulinggg/openwrt)支持的平台比较全面功能也够用网络上资料也偏多一些出现问题比较容易找到同志解决。昨天去Github上看[sulinggg](https://github.com/SuLingGG)的主页发现所有Repo都已经归档了🤕🤕🤕又去Dockerhub上看了下还健在只能说切用且珍惜吧。
![openwrt_sulinggg](/img/posts/openwrt_sulinggg.png 'openwrt_sulinggg')
### 2. x86_64版本安装
> **1. 拉取镜像:**
`docker pull sulinggg/openwrt:x86_64`
> **2. macvlan配置**
`docker network create -d macvlan --subnet=192.168.10.0/24 --gateway=192.168.10.1 -o parent=enp1s0 net_openwrt`
命令中的子网掩码192.168.10.0/24、网关192.168.10.1、网卡名称 enp1s0要根据`ifconfig`de 实际输出更改其中gateway的值是路由器的IP一般情况下为主机所在网段的第一个也就是192.168.XXX.1。
> **3. 打开网卡混杂模式**
`ip link set enp1s0 promisc on`
> **4. 创建并启动容器**
同样有两种方式启动,网络上资料给出的大多都是命令行直接启动,也可以使用`docker-compose`来启动管理。
- 命令行启动
`docker run -d --restart always --name openwrt --network macnet --privileged sulinggg/openwrt:x86_64 /sbin/init`
- docker-compose方式
```
version: "3"
networks:
net_macvlan:
driver: macvlan
name: net_openwrt
driver_opts:
parent: enp1s0
ipam:
config:
- subnet: 192.168.10.0/24
gateway: 192.168.10.1
services:
openwrt:
image: sulinggg/openwrt:x86_64
container_name: openwrt
restart: always
networks:
net_macvlan:
ipv4_address: 192.168.10.123
volumes:
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
- ./local/network:/etc/config/network:ro
- ./local/inittab:/etc/inittab:ro
environment:
- TZ=Asia/Shanghai
privileged: true
command: /sbin/init
```
### 3. 修改Docker实例配置
Docker镜像启动之后需要进入其中修改网络等配置还需要禁止启动登录如果不禁止主机一段时间之后就无法登录必须强制重启这是非常不方便的。
```bash
# 1. 进入openwrt
docker exec -it openwrt bash
# 2.1 编辑网络
vim /etc/config/network
# 2.2 替换lan配置为如下
# config interface 'lan'
# option type 'bridge'
# option ifname 'eth0'
# option proto 'static'
# option netmask '255.255.255.0'
# option ip6assign '60'
# option ipaddr '192.168.10.123'
# option gateway '192.168.10.1'
# option dns '8.8.8.8'
# 3. 重启网络
/etc/init.d/network restart
# 4.1 修改启动项
vim /etc/inittab
# 4.2 注释如下行
::sysinit:/etc/init.d/rcS S boot
::shutdown:/etc/init.d/rcS K shutdown
#ttyS0::askfirst:/usr/libexec/login.sh
#hvc0::askfirst:/usr/libexec/login.sh
#tty1::askfirst:/usr/libexec/login.sh
# 5. 退出容器,重启容器
```
### 4. Openwrt和宿主机互通问题外部域名访问
之所以遇到这个问题是因为想要外部域名访问Openwrt服务Nginx和Frp都配置好了内网直接访问没有问题使用域名访问发现502了查看Frp服务无异常Nginx返回的502说明宿主机和Docker之间没有连通性于是使用`ping`命令在宿主机上测试Docker果然无法`ping`通。
一般在macvlan模式下同网段的其他机器可以和容器互通但宿主不能和容器互通这是在macvlan模式设计的时候为了安全而禁止了宿主机和容器直接通信。如果想要实现互通有个曲线救国的方法就是macvlan与macvlan之间可以互通只需要在宿主机再创建一个macvlan网络然后修改路由让数据经过这个macvlan达到互通的目的。
以当前实例为例Docker的IP是***192.168.10.123***宿主机的IP是***192.168.10.11***,建立一个名为**main2wrt**的macvlan接口并分配一个当前局域网下未使用的IP--***192.168.10.222***,然后修改路由,让宿主机(192.168.10.11)到容器(192.168.10.123)的数据经过**main2wrt**即可实现双向连通。
```bash
ip link add main2wrt link enp1s0 type macvlan mode bridge
ip addr add 192.168.10.222 dev main2wrt
ip link set main2wrt up
ip route add 192.168.10.123 dev main2wrt
```
这里会出现一个问题临时手动增加这个一个网络接口是没有问题的但是重启之后会失效所以要做一个开机启动脚本来实现并且需要自动判断局域网内未使用的IP有哪些。
```bash
#!/bin/bash
gateway=`ip route | head -n 1 | grep -Eow '([0-9]{1,3}.){3}[0-9]{1,3}'`
[[ $gateway == '' ]] && exit 9
num1=`echo $gateway | awk -F '.' '{print $1}'`
num2=`echo $gateway | awk -F '.' '{print $2}'`
num3=`echo $gateway | awk -F '.' '{print $3}'`
for num4 in `seq 200 254`; do
IP=$num1'.'$num2'.'$num3'.'$num4
ping -c 2 $IP
[[ $? -ne 0 ]] && break
done
ip link add main2wrt link enp1s0 type macvlan mode bridge
ip addr add $IP dev main2wrt
ip link set main2wrt up
ip route add $IP dev main2wrt
ip link set main2wrt promisc on
```
> 如果需要外网域名访问,还需要在**系统→web管理**中取消只允许内容访问
### 5. 使用方法
具体的配置就不过多记录了,用时下流行的字母缩写来说就是**DDDD**。配置好了之后,有两种模式,一种是主路由模式,还有一种是旁路由模式。主路由顾名思义就是家庭网络全部由该路由提供服务,网络上大家戏称***All IN BOOM***旁路由意思是用作主路由的一个分支为家庭中需要自由上网的设备提供服务。个人理解也有两种模式一种是手动设定网络配置比如将设备的网关以及DNS设置为OpenWRT的IP其他设置默认即可这种方式验证过没有问题另一种是将多余的NIC口接入网线另一端连接路由器此时通过该路由器上网的设备自动获得科学权限**此方案未验证过**应该还需要在Server端配置一下网络。
### 6. 其他一些小问题
在使用的过程中还遇到一起其他问题,一并记录一下:
- 节点导入无法批量
- 使用`compose`命令停止容器,再启动配置全部丢失
- 使用bing壁纸作为封面无法登录只能`conpose`强制重启容器,`restart`只能瞬时有效
- 使用域名访问的时候,**系统→实时监控/TTYD终端**无法访问原因是访问的url是***domain:port***的形式https://openwrt.ephemeral.eu.org:19999/需要nginx配置端口跟随也涉及到FRP的相关透传暂时不准备修正
最后附图一张,打完收工~
![openwrt_immortal](/img/posts/openwrt_immortal.png 'openwrt_immortal')
## 三、参考文档
- [Oracle云免费套餐](https://www.oracle.com/cn/cloud/free/)
- [关于甲骨文Oracle Cloud新封号方案永久免费二道号贩的影响](https://91ai.net/thread-1011559-1-1.html)
- [Oracle Cloud甲骨文免费VPS防火墙设置](https://g-suite.cc/772.html)
- [macvlan网络模式下容器与宿主机互通](https://rehtt.com/index.php/archives/236/)
- [Docker中OpenWrt旁路由安装教程](http://blog.gavinzh.com/2022/03/28/Docker-OpenWrt-Side-Route-Installation-Tutorial/)
- [在Docker中运行OpenWrt旁路网关](https://mlapp.cn/376.html)