安装Python
CentOS 7/8默认安装Python 2/3,可通过以下命令确认或升级:
python3 --version # 检查版本
sudo yum install python3 # 安装/升级Python 3
安装网络库
socket无需额外安装,可直接使用。requests、asyncio)通过pip安装:sudo pip3 install 库名 # 例如:sudo pip3 install requests
编写Socket服务端
import socket
# 创建TCP socket
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定IP和端口(0.0.0.0表示监听所有网卡)
server.bind(('0.0.0.0', 8080))
server.listen(5) # 最大连接数
print("Server listening on 0.0.0.0:8080")
while True:
client, addr = server.accept()
data = client.recv(1024).decode()
print(f"Received from {addr}: {data}")
client.send("Hello from server!".encode())
client.close()
编写Socket客户端
import socket
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('服务器IP', 8080)) # 替换为实际IP
client.send("Hello server!".encode())
response = client.recv(1024).decode()
print(f"Server response: {response}")
client.close()
绑定特定网卡
将bind()中的IP地址替换为目标网卡的IP(如192.168.1.100),需确保网卡已释放该端口:
server.bind(('192.168.1.100', 8080))
防火墙设置
sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent
sudo firewall-cmd --reload
firewall库):import firewall
firewall.add_rule('allow', '8080')
firewall.apply()
多线程/异步处理
import threading
def handle_client(client_socket):
data = client_socket.recv(1024)
client_socket.send(data.upper())
client_socket.close()
server.listen(5)
while True:
client, addr = server.accept()
threading.Thread(target=handle_client, args=(client,)).start()
import asyncio
async def handle_client(reader, writer):
data = await reader.read(1024)
writer.write(data.upper())
await writer.drain()
writer.close()
async def main():
server = await asyncio.start_server(handle_client, '0.0.0.0', 8080)
async with server:
await server.serve_forever()
asyncio.run(main())
输入验证
对客户端数据进行类型、长度校验,避免注入攻击:
if not data.isalnum(): # 示例:仅允许字母数字
client.send("Invalid input!".encode())
return
if len(data) > 100: # 限制长度
client.send("Data too long!".encode())
return
使用SSL/TLS加密
通过ssl模块包装socket,需提前准备证书:
import ssl
context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
context.load_cert_chain(certfile='server.crt', keyfile='server.key')
secure_server = context.wrap_socket(server, server_side=True)
secure_server.bind(('0.0.0.0', 8443))
secure_server.listen(5)
权限控制
避免以root运行服务,创建专用用户并设置文件权限:
sudo useradd -r pythonapp
sudo chown -R pythonapp:pythonapp /path/to/your/script
sudo -u pythonapp python3 server.py
telnet或nc命令验证服务:telnet 服务器IP 8080 # 或 nc 服务器IP 8080
systemd),并设置日志记录:sudo vi /etc/systemd/system/pythonapp.service
# 内容示例:
[Unit]
Description=Python Network App
After=network.target
[Service]
User=pythonapp
ExecStart=/usr/bin/python3 /path/to/server.py
Restart=always
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl start pythonapp
sudo systemctl enable pythonapp