返回
Debian网络配置的一些问题
服务器网络无线网络静态ip

前言

在家搞了一台服务器(其实就是旧台式机),系统选择Debian。主要之前VPS使用过几次(Amazon和Google),都是选Debian系统,感觉不错。最重要比较熟悉了,不想换别的重新适应。

问题

装系统我是先找个显示器接,使用U盘装,装时不选桌面,但选了SSH server。网络使用网线接的以太网。装完后记得开启OpenSSH,防火墙放开22端口,我使用ufw来管理防火墙问题。由于我这台服务器要放到另一间房间,路由器太远,不适合继续使用网线,所以选择使用无线网卡。由于我的网卡驱动已自行处理完没问题,接下来就是处理开机自动连接网络,静态ip的问题。

工具

记得先安装一些工具sudo apt install wpa_supplicant net-tools net-stat

无线网络配置

  • 将要连接的无线网络名称和密码示例是
    名称: Home_Wifi
    密码: homepassword2021
    
  • 执行以下命令,将无线网络配置信息存到一个文件上,目录可以自行选择。这里选择存在/etc/wpa_supplicant/wpa_supplicant.conf文件。
    sudo wpa_passphrase Home_Wifi homepassword2021 > /etc/wpa_supplicant/wpa_supplicant.conf
    
    命令执行成功,cat /etc/wpa_supplicant/wpa_supplicant.conf查看大概如下
    network={
        ssid="Home_Wifi"
        #psk="homepassword2021"
        psk=ccb290fd4fe6b22935cbae31449e050edd02ad44627b16ce0151668f5f53c01b //这里我随便找的示例,反正大概就是一串字符。
    }
    
  • 编辑/etc/network/interfaces文件
    sudo vim /etc/network/interfaces
    
    在最后添加以下信息
    # my wifi device
    auto wlan0
    allow-hotplug wlan0
    iface wlan0 inet static
     address 192.168.1.166
     netmask 255.255.255.0
     gateway 192.168.1.1
    pre-up wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf
    post-down killall -q wpa_supplicant
    
    其中wlan0是你的无线网卡名称,自行ip a来查看叫什么。这里这段看也看得懂,主要设置静态ip,我设置192.168.1.166
    iface wlan0 inet static
     address 192.168.1.166
     netmask 255.255.255.0
     gateway 192.168.1.1
    
  • 上面弄完了就好了,现在执行
    sudo ifup wlan0
    
    记得wlan0是无线网卡名称,请先找到自己的无线网卡名称。
  • 没问题的话网络就已连接。ifup命令其实是使用/etc/network/interfaces配置文件来设置网络的ifconfig也能设置。要想关闭请使用ifdown wlan0

USB网络共享配置

有时想要使用手机Usb网络共享网络怎么办,方法大致相同,好像也是能用/etc/network/interfaces配置文件,但我选择使用ifconfig命令。

  • 执行ip a查看你的usb连接名称,通常是usb0
  • 执行sudo ifconfig usb0 up来启用目标设备,sudo ifconfig usb0 down是关闭目标设备。
  • 执行sudo dhclient usb0来自动分配ip地址。
  • 如果要静态ip,则是执行sudo ifconfig usb0 192.168.1.167 netmask 255.255.255.0,其中192.168.1.167是你要设置的静态ip。

断网重连和Usb网络设置

网络断了不会自动重连,所以我自己写了一个Python脚本来重连,另外自动设置上面的Usb网络共享。原理是隔一段时间ping看看能不能通,不能通可用认为断网了,就执行shell命令重连sudo systemctl restart networking

#!/usr/bin/python3
# ./AutoReconnectNetwork/main.py

import sys, subprocess, time, functools

targethost = "8.8.8.8" #ping domain
waitToCheck = 60 * 5 #interval of check(seconds)
startAfter = 60 #start script after time(seconds)

print = functools.partial(print,flush=True)

def checkNetworkPass():
    result = subprocess.run(f"ping -c 2 {targethost}", shell=True, capture_output=True)
    return result.stdout and result.stdout.decode("utf-8").find("2 received") != -1

def restartNetworking():
    subprocess.run("systemctl restart networking", shell=True, capture_output=True)

def existDevice(deviceName):
    result = subprocess.run(f"ip link show {deviceName}", shell=True, capture_output=True)
    return result.stdout and result.stdout.decode("utf-8").find("does not exist") == -1

def restartUsb():
    tarusb = "usb0"
    if existDevice(tarusb):
        print(f"Exists {tarusb}, restarting it..")
        subprocess.run(f"ifconfig {tarusb} up", shell=True, capture_output=True)
        subprocess.run(f"ifconfig {tarusb} 192.168.1.167 netmask 255.255.255.0", shell=True, capture_output=True)
    else:
        print(f"No exists {tarusb}.")

def checkArgv():
    for a in sys.argv:
        if a == "-t":
            global startAfter
            startAfter = 0

if __name__ == "__main__":
    checkArgv()
    print(f"Starting script after {startAfter} seconds:")
    time.sleep(startAfter)
    print("====================")
    print("[Config]")
    print(f"Target host:  {targethost}")
    print(f"Wait to check:  {waitToCheck}")
    print("====================")
    print("Now runing script...")
    while True:
        print("Check networking...")
        if checkNetworkPass():
            print("Networking normal..")
        else:
            print("Networking not access, trying restart networking..")
            restartNetworking()
            print("Networking restart done...")
        restartUsb()
        print(f"Wait {waitToCheck} seconds to check again...")
        time.sleep(waitToCheck)

保存在一个目录下即可,新建文件夹AutoReconnectNetwork,保存在里面为main.py。执行sudo python3 ./AutoReconnectNetwork/main.py -t来测试看看。关于Usb网络共享,请自行修改变量:

def restartUsb():
    tarusb = "你的usb设备名称"
    ...
    ...

脚本开头的一些变量写了注释,应该看得懂吧。由于我有无线网卡能用,不用usb共享网络,所以只有我已插上了usb线连接手机共享网络,脚本检测到了才帮我设置usb网络共享。检测时间和检测网络是否可用一致。

脚本肯定要开机自启动,然后后台运行的,我使用systemd管理。先写个简单的service配置:

[Unit]
Description=Auto reconnect wifi when no access networking.
ConditionPathExists=/home/jinker/src/AutoReconnectNetwork/main.py
After=network.target

[Service]
Type=simple
ExecStart=/usr/bin/python3 /home/jinker/src/AutoReconnectNetwork/main.py

[Install]
WantedBy=multi-user.target

其中ConditionPathExistsExecStart是你的脚本路径。ExecStart那边确保python3路径存在。将这个service配置保存为AutoReconnectNetwork.service放到/usr/lib/systemd/system/下。

执行sudo systemctl enable AutoReconnectNetwork.service来开机自启。

执行sudo systemctl start AutoReconnectNetwork.service来启动服务。

执行sudo systemctl status AutoReconnectNetwork.service来看服务状态。

脚本默认启动后60秒才检测,然后每5分钟再检测。你可以自行修改。

结论

主要记录下,方便以后我折腾。