Участник с: 18 декабря 2017
|
Устанавливал Arch вручную с такими пакетами
pacman -S --needed sddm sddm-kcm bash-completion openssh xdg-user-dirs networkmanager pacman-contrib man-db ntfs-3g grub-btrfs
yay -Syyu nvidia-dkms nvidia-utils lib32-nvidia-utils nvidia-settings
yay -S kwalletmanager krusader ksshaskpass kmail kdiff3 krename kget ktimer keditbookmarks ktorrent krunner kcron kdenetwork-filesharing locatec dragon dolphin kdeconnect konsole krita kate kwrite plasma powerdevil gwenview spectacle keepassxc microsoft-edge-stable ark p7zip onlyoffice-bin git wget curl grub-customizer partitionmanager kio-extras kio-admin unrar qBittorent gparted neofetch kdiskmark ffmpegthumbs telegram-desktop dosfstools nekoray sing-geoip-common sing-geoip-db-git sing-geoip-rule-set sing-geosite-common sing-geosite-db-git sing-geosite-rule-set-git ttf-ms-fonts ttf-hack-nerd stacer-bin viber zsh zsh-theme-powerlevel10k-git zsh-completions zsh-autosuggestions zsh-syntax-highlighting bat
Есть код на питоне, который слушает порт в ожидании wol пакета
import socket
import os
import logging
import psutil
WOL_PORT = 9999
INTERFACE_NAME = 'My Lan'
INTERFACE_NAME_ARCH = 'enp37s0'
logging.basicConfig(format='%(levelname)s: %(asctime)s %(message)s', level=logging.INFO)
logger = logging.getLogger(__name__)
def get_ip_mac_address(interface_name: str) -> tuple:
ip_addr = mac_addr = None
for item in psutil.net_if_addrs()[interface_name]:
addr = item.address
if '.' in addr:
ip_addr = addr
elif ('-' in addr or ':' in addr) and '::' not in addr:
mac_addr = addr.replace(':', '-').upper()
if not ip_addr or not mac_addr or ip_addr == '127.0.0.1':
raise 'Не удалось получить IP или MAC-адрес сетевого интерфейса'
return ip_addr, mac_addr
def assemble_wol_packet(mac_address: str) -> str:
return f'{"FF-" * 6}{(mac_address + "-") * 16}'
def check_is_wol_packet(raw_bytes: bytes, assembled_wol_packet: str) -> int:
decoded_packet_data = '-'.join(f'{byte:02x}' for byte in raw_bytes).upper() + '-'
logger.info(decoded_packet_data)
if decoded_packet_data == assembled_wol_packet:
return 1
return 0
def run_udp_port_listener(port: int, interface_name: str):
ip_addr, mac_addr = get_ip_mac_address(interface_name)
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server_socket.bind((ip_addr, port))
logger.info(f'Listening on {ip_addr}:{port}')
assembled_wol_packet = assemble_wol_packet(mac_addr)
while True:
data, _ = server_socket.recvfrom(1024)
logger.info(f"Data from socket: {data}")
is_wol_packet = check_is_wol_packet(data, assembled_wol_packet)
logger.info(f"is_wol_packet: {is_wol_packet}")
if is_wol_packet == 1:
if os.name == 'posix':
os.system('reboot')
elif os.name == 'nt':
os.system('notepad')
if os.name == 'posix':
run_udp_port_listener(WOL_PORT, INTERFACE_NAME_ARCH)
elif os.name == 'nt':
run_udp_port_listener(WOL_PORT, INTERFACE_NAME)
Проверил, на Windows всё работает, видно, что пакет принимается, а в Arch слушает, но на посылку пакета он никак не реагирует. Обращался в IT-шный форум, там долго дебажили, человек проверил на OpenSuse, у него работает. То бишь со скриптом всё нормально.
iptabels ставил позже, там по iptables -L всё стоит на ACCEPT. Как выяснить, что блокирует?
UPD - вроде нашёл, я так понял, что это simple_firewall, у него есть такие правила
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -p icmp -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -j REJECT --reject-with tcp-reset
-A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable
-A INPUT -j REJECT --reject-with icmp-proto-unreachable
COMMIT Только чёт читал, читал статью, но не понял, как это работает. То есть iptabes всё ACCEPT, а всё равно не пускает. Как им управлять?
|