通過(guò)LXD/LXC命令批量或單獨(dú)開(kāi)設(shè)NAT服務(wù)器以及維護(hù)(簡(jiǎn)稱母雞開(kāi)小雞)
# lxc
https://github.com/spiritLHLS/lxc
一鍵母雞開(kāi)小雞
更新時(shí)間:2023.04.05
## 配置要求
系統(tǒng):Debian 8+, Ubuntu 18+(推薦)
硬件配置要求:內(nèi)存至少512MB,硬盤至少5G
網(wǎng)絡(luò)要求:獨(dú)立的IPV4地址,IPV6可有可無(wú),帶寬能下載腳本就行,網(wǎng)絡(luò)能連接Github就行
## 待解決的問(wèn)題
使得母雞支持更多的系統(tǒng)版本
## 前言
- 本套腳本開(kāi)發(fā)使用的Ubuntu20,Ubuntu別的長(zhǎng)期維護(hù)版本應(yīng)該也沒(méi)問(wèn)題,但debian系列多半有```zfs```的問(wèn)題,自行解決
- 已設(shè)置同時(shí)進(jìn)行TCP和UDP轉(zhuǎn)發(fā),除了SSH端口其他的映射內(nèi)網(wǎng)外網(wǎng)端口一致
- 已設(shè)置支持開(kāi)出的LXC容器進(jìn)行docker嵌套虛擬
- 已屏蔽容器內(nèi)可能用于濫用的工具包和IPV4網(wǎng)絡(luò)的TCP/UDP協(xié)議的端口( 3389 8888 54321 65432 ),以防止容器被用于掃描和爆破,且可外置進(jìn)程檢查有問(wèn)題自動(dòng)停機(jī)
- 已支持一鍵為L(zhǎng)XC容器配置IPV6地址(前提是母雞有IPV6子網(wǎng),無(wú)IPV6地址則不配置)
- 一定要在 ```/root``` 的路徑下運(yùn)行本倉(cāng)庫(kù)腳本,且使用```實(shí)驗(yàn)性一鍵腳本```的**不要?jiǎng)h除**路徑下的```ssh.sh```和```config.sh```文件
- 保證你要開(kāi)的盤為默認(rèn)的系統(tǒng)盤(sda或者sda1)而不是掛載的盤(sdb之類的),不確定的使用```fdisk -l```和```df```查看
- 掛載其他盤的詳看 [其他說(shuō)明](https://github.com/spiritLHLS/lxc/blob/main/README_other.md)
- 一鍵腳本支持自定義限制所有內(nèi)容,普通版本支持多次運(yùn)行批量生成不覆蓋先前生成的配置
## 手動(dòng)安裝(新手推薦,避免有bug不知道怎么修)
- 批量生成NAT服務(wù)器
### 普通版本(帶1個(gè)SSH端口,25個(gè)外網(wǎng)端口)
<details>
開(kāi)出的小雞配置:1核256MB內(nèi)存1GB硬盤限速250Mbps帶寬
自動(dòng)關(guān)閉防火墻
```bash
apt update
apt install curl wget sudo dos2unix ufw -y
ufw disable
```
內(nèi)存看你開(kāi)多少小雞,這里如果要開(kāi)8個(gè),換算需要2G內(nèi)存,實(shí)際內(nèi)存如果是512MB內(nèi)存,還需要開(kāi)1.5G,保守點(diǎn)開(kāi)2G虛擬內(nèi)存即可
執(zhí)行下面命令,輸入1,再輸入2048,代表開(kāi)2G虛擬內(nèi)存
```
curl -L https://raw.githubusercontent.com/spiritLHLS/lxc/main/swap.sh -o swap.sh && chmod +x swap.sh && bash swap.sh
```
實(shí)際swap開(kāi)的虛擬內(nèi)存應(yīng)該是實(shí)際內(nèi)存的2倍,也就是開(kāi)1G是合理的,上面我描述的情況屬于超開(kāi)了
```
apt install snapd -y
snap install lxd
/snap/bin/lxd init
```
如果上面的命令中出現(xiàn)下面的錯(cuò)誤
(snap "lxd" assumes unsupported features: snapd2.39 (try to update snapd and refresh the core snap))
使用命令修補(bǔ)后再進(jìn)行l(wèi)xd的安裝
```
snap install core
```
如果無(wú)異常,上面三行命令執(zhí)行結(jié)果如下

一般的選項(xiàng)回車默認(rèn)即可
選擇配置物理盤大小(提示默認(rèn)最小1GB那個(gè)選項(xiàng)),一般我填空閑磁盤大小減去內(nèi)存大小后乘以0.95并向下取整
提示帶auto的更新image的選項(xiàng)記得選no,避免更新占用
軟連接lxc命令
```bash
! lxc -h >/dev/null 2>&1 && echo 'alias lxc="/snap/bin/lxc"' >> /root/.bashrc && source /root/.bashrc
export PATH=$PATH:/snap/bin
```
測(cè)試lxc有沒(méi)有軟連接上
```
lxc -h
```
lxc命令無(wú)問(wèn)題,執(zhí)行初始化開(kāi)小雞,這一步最好放screen中后臺(tái)掛起執(zhí)行,開(kāi)小雞時(shí)長(zhǎng)與你開(kāi)幾個(gè)和母雞配置相關(guān)
執(zhí)行下面命令加載開(kāi)機(jī)腳本
```
rm -rf init.sh
wget https://github.com/spiritLHLS/lxc/raw/main/init.sh
chmod 777 init.sh
apt install dos2unix -y
dos2unix init.sh
```
下面命令為開(kāi)小雞名字前綴為**tj**的**10**個(gè)小雞
```
./init.sh tj 10
```
有時(shí)候init.sh的運(yùn)行路徑有問(wèn)題,此時(shí)建議前面加上sudo強(qiáng)制根目錄執(zhí)行
如果已通過(guò)以上方法生成過(guò)小雞,還需要批量生成新的小雞,可使用
```
curl -L https://github.com/spiritLHLS/lxc/raw/main/add_more.sh -o add_more.sh && chmod +x add_more.sh && bash add_more.sh
```
可再次批量生成小雞,且繼承前面已生成的部分在后面添加
</details>
### 純探針版本(只有一個(gè)SSH端口)
<details>
開(kāi)出的小雞配置:1核128MB內(nèi)存300MB硬盤限速200Mbps帶寬
自動(dòng)關(guān)閉防火墻
```bash
apt update
apt install curl wget sudo dos2unix ufw -y
ufw disable
```
內(nèi)存看你開(kāi)多少小雞,這里如果要開(kāi)10個(gè),換算需要1G內(nèi)存,實(shí)際內(nèi)存如果是512MB內(nèi)存,還需要開(kāi)0.5G,保守點(diǎn)開(kāi)1G虛擬內(nèi)存即可
執(zhí)行下面命令,輸入1,再輸入1024,代表開(kāi)1G虛擬內(nèi)存
```bash
curl -L https://raw.githubusercontent.com/spiritLHLS/lxc/main/swap.sh -o swap.sh && chmod +x swap.sh && bash swap.sh
```
實(shí)際swap開(kāi)的虛擬內(nèi)存應(yīng)該是實(shí)際內(nèi)存的2倍,也就是開(kāi)1G是合理的,再多就超開(kāi)了
```
apt install snapd -y
snap install lxd
/snap/bin/lxd init
```
如果上面的命令中出現(xiàn)下面的錯(cuò)誤
(snap "lxd" assumes unsupported features: snapd2.39 (try to update snapd and refresh the core snap))
使用命令修補(bǔ)后再進(jìn)行l(wèi)xd的安裝
```
snap install core
```
如果無(wú)異常,上面三行命令執(zhí)行結(jié)果如下

一般的選項(xiàng)回車默認(rèn)即可
選擇配置物理盤大小(提示默認(rèn)最小1GB那行),一般我填空閑磁盤大小減去內(nèi)存大小后乘以0.95并向下取整
提示帶auto的更新image的選項(xiàng)記得選no,避免更新占用
軟連接lxc命令
```bash
! lxc -h >/dev/null 2>&1 && echo 'alias lxc="/snap/bin/lxc"' >> /root/.bashrc && source /root/.bashrc
export PATH=$PATH:/snap/bin
```
測(cè)試lxc有沒(méi)有軟連接上
```
lxc -h
```
lxc命令無(wú)問(wèn)題,執(zhí)行初始化開(kāi)小雞,這一步最好放screen中后臺(tái)掛起執(zhí)行,開(kāi)小雞時(shí)長(zhǎng)與你開(kāi)幾個(gè)和母雞配置相關(guān)
加載開(kāi)機(jī)腳本
```
rm -rf least.sh
wget https://github.com/spiritLHLS/lxc/raw/main/least.sh
chmod 777 least.sh
apt install dos2unix -y
dos2unix least.sh
```
下列命令最后一行為開(kāi)小雞名字前綴為**tj**的**10**個(gè)小雞
```
./least.sh tj 10
```
有時(shí)候least.sh的運(yùn)行路徑有問(wèn)題,此時(shí)建議前面加上sudo強(qiáng)制根目錄執(zhí)行
</details>
### 開(kāi)完小雞后,具體信息會(huì)生成在當(dāng)前目錄下的log文件中,格式如下
<details>
```
1號(hào)服務(wù)器名稱 密碼 ssh端口 外網(wǎng)端口起始 外網(wǎng)端口終止
2號(hào)服務(wù)器名稱 密碼 ssh端口 外網(wǎng)端口起始 外網(wǎng)端口終止
```
如果想要查看,只需在當(dāng)前目錄執(zhí)行以下命令打印log文件即可
```bash
cat log
```
?
</details>
### 不要拿該腳本開(kāi)出的小雞當(dāng)生產(chǎn)環(huán)境,lxc虛擬化不支持換內(nèi)核,dd,開(kāi)啟bbr,**純探針版本**(普通版本無(wú)問(wèn)題)掛載warp等操作
<details>
本倉(cāng)庫(kù)不提供lxc虛擬化使用的其他問(wèn)題的解答,非腳本相關(guān)問(wèn)題請(qǐng)自行解決
虛擬小雞想要查看是否在線
查看所有
```bash
lxc list
```
查看個(gè)例
```bash
lxc info 服務(wù)器名字
```
啟動(dòng)個(gè)例
```bash
lxc start 服務(wù)器名字
```
停止個(gè)例
```bash
lxc stop 服務(wù)器名字
```
刪除個(gè)例
```bash
lxc delete -f 服務(wù)器名字
```
進(jìn)入內(nèi)部
```bash
lxc exec 服務(wù)器名字 /bin/bash
```
退出則輸入```exit```回車即可
?
</details>
## 實(shí)驗(yàn)性一鍵腳本(不保證無(wú)bug)
- 環(huán)境要求:推薦為Ubuntu系統(tǒng),Debian系統(tǒng)會(huì)出現(xiàn)zfs問(wèn)題,只能使用手動(dòng)事先安裝zfs解決
- 只生成一個(gè)NAT服務(wù)器
#### 一鍵安裝lxd環(huán)境
##### 下載文件
```bash
curl -L https://raw.githubusercontent.com/spiritLHLS/lxc/main/lxdinstall.sh -o lxdinstall.sh && chmod +x lxdinstall.sh
```
##### 設(shè)置母雞內(nèi)存虛擬化大小以及資源池硬盤大小
```bash
./lxdinstall.sh 內(nèi)存大小以MB計(jì)算 硬盤大小以GB計(jì)算
```
#### 只開(kāi)一個(gè)NAT服務(wù)器
##### 下載開(kāi)機(jī)腳本
```
rm -rf buildone.sh
wget https://github.com/spiritLHLS/lxc/raw/main/buildone.sh
chmod 777 buildone.sh
apt install dos2unix -y
dos2unix buildone.sh
```
##### 開(kāi)NAT服務(wù)器
內(nèi)存大小以MB計(jì)算,硬盤大小以GB計(jì)算,下載速度上傳速度以Mbit計(jì)算,是否啟用IPV6不一定要填Y或者N,沒(méi)有這個(gè)參數(shù)也行
如果```外網(wǎng)起端口```和```外網(wǎng)止端口```都設(shè)置為0則不做區(qū)間外網(wǎng)端口映射了,只映射基礎(chǔ)的SSH端口,注意```不能為空```,不進(jìn)行映射需要設(shè)置為0
```
./buildone.sh 小雞名稱 內(nèi)存大小 硬盤大小 SSH端口 外網(wǎng)起端口 外網(wǎng)止端口 下載速度 上傳速度 是否啟用IPV6(Y or N)
```
示例
```
./buildone.sh test 256 2 20001 20002 20025 300 300 N
```
這樣就是創(chuàng)建一個(gè)名為test的小雞,內(nèi)存256MB,硬盤2G,SSH端口20001,內(nèi)外網(wǎng)起止端口20002~20025,下載和上傳速度都設(shè)置為300Mbit,且不自動(dòng)設(shè)置外網(wǎng)IPV6地址
### 其他配置
##### 自動(dòng)配置IPV6地址
- (***非必須***,該腳本僅適用于母雞有給IPV6子網(wǎng)且母雞綁定了子網(wǎng)的第一個(gè)IPV6,不使用的也沒(méi)問(wèn)題)
- 自動(dòng)為L(zhǎng)XD創(chuàng)建的LXC容器配置IPV6地址
- 已集成到```buildone.sh```中可使用變量控制且無(wú)需事先下載,該腳本可不手動(dòng)使用,在使用```buildone.sh```時(shí)配置Y開(kāi)啟即可
下載腳本
```bash
curl -L https://raw.githubusercontent.com/spiritLHLS/lxc/main/build_ipv6_network.sh -o build_ipv6_network.sh && chmod +x build_ipv6_network.sh
```
自動(dòng)為容器配置IPV6映射地址
```bash
bash build_ipv6_network.sh 容器名稱
```
映射完畢會(huì)打印信息
示例(給test容器自動(dòng)配置IPV6地址,配置完成會(huì)寫入一個(gè)test_v6的文件信息)
```bash
bash build_ipv6_network.sh test
```
##### 屏蔽容易被濫用的端口的出入流量以屏蔽端口和屏蔽濫用工具包
- (***非必須***,該腳本僅僅是為了防止容器濫用方便,不裝的也沒(méi)問(wèn)題)
- 事前預(yù)防
```
curl -L https://github.com/spiritLHLS/lxc/raw/main/rules.sh -o rules.sh && chmod +x rules.sh && bash rules.sh
```
##### 使用screen配置監(jiān)控屏蔽某些進(jìn)程的執(zhí)行,遇到某些進(jìn)程的出現(xiàn)直接關(guān)閉容器
- 如需停止監(jiān)控可使用```screen```命令停止```lxc_moniter```這個(gè)名字的窗口并刪除
- (***非必須***,該腳本僅僅是為了防止容器濫用方便,不裝的也沒(méi)問(wèn)題)
- 事后停機(jī)
```
curl -L https://github.com/spiritLHLS/lxc/raw/main/build_monitor.sh -o build_monitor.sh && chmod +x build_monitor.sh && bash build_monitor.sh
```
##### 一鍵安裝開(kāi)lxd母雞所需要的帶vnstat環(huán)境的常用預(yù)配置環(huán)境
- (***非必須***,該腳本僅僅是為了站點(diǎn)對(duì)接監(jiān)控方便,不裝的也沒(méi)問(wèn)題)
```
curl -L https://raw.githubusercontent.com/spiritLHLS/lxc/main/backend.sh -o backend.sh && chmod +x backend.sh && bash backend.sh
```
### 致謝
https://github.com/lxc/lxd
https://lxdware.com/
https://discuss.linuxcontainers.org/
https://discuss.linuxcontainers.org/t/how-to-run-docker-inside-lxc-container/13017/4
https://discuss.linuxcontainers.org/t/error-seccomp-notify-not-supported-on-container-start/15038/3
https://discuss.linuxcontainers.org/t/how-do-i-assign-a-public-ipv6-address-to-a-lxc-container/6028
感謝 [@Ella-Alinda](https://github.com/Ella-Alinda) [@fscarmen](https://github.com/fscarmen) 提供的指導(dǎo)
### 友鏈
VPS融合怪測(cè)評(píng)腳本
https://github.com/spiritLHLS/ecs
朋友寫的針對(duì)合租服務(wù)器使用的(需要有一定的LXD或LXC基礎(chǔ),否則你看不懂部分設(shè)置)(更新可能有點(diǎn)緩慢)
https://github.com/MXCCO/lxdpro
## Stargazers over time
[](https://starchart.cc/spiritLHLS/lxc)