sys和cc攻击防范分享

本文介绍如何通过调整系统参数来有效防御SYN洪水攻击,包括将tcp_synack_retries设置为0以加速回收半连接,并增大tcp_max_syn_backlog以容纳更多的连接请求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

调整系统参数挡攻击

第一个参数tcp_synack_retries = 0是关键,表示回应第二个握手包(SYN+ACK包)给客户端IP后,如果收不到第三次握手包(ACK包)后,不进行重试,加快回收“半连接”,不要耗光资源。

不修改这个参数,模拟攻击,10秒后被攻击的80端口即无法服务,机器难以ssh登录; 用命令netstat -na |grep SYN_RECV检测“半连接”hold住180秒;

修改这个参数为0,再模拟攻击,持续10分钟后被攻击的80端口都可以服务,响应稍慢些而已,只是ssh有时也登录不上;检测“半连接”只hold住3秒即释放掉。

修改这个参数为0的副作用:网络状况很差时,如果对方没收到第二个握手包,可能连接服务器失败,但对于一般网站,用户刷新一次页面即可。这些可以在高峰期或网络状况不好时tcpdump抓包验证下。

根据以前的抓包经验,这种情况很少,但为了保险起见,可以只在被tcp洪水攻击时临时启用这个参数。

tcp_synack_retries默认为5,表示重发5次,每次等待30~40秒,即“半连接”默认hold住大约180秒。详细解释:

The tcp_synack_retries setting tells the kernel how many times to retransmit the SYN,ACK reply to
an SYN request. In other words, this tells the system how many times to try to establish a passive
TCP connection that was started by another host.
This variable takes an integer value, but should under no circumstances be larger than 255 for the
same reasons as for the tcp_syn_retries variable. Each retransmission will take aproximately 30-40
seconds. The default value of the tcp_synack_retries variable is 5, and hence the default timeout
of passive TCP connections is aproximately 180 seconds.

之所以可以把tcp_synack_retries改为0,因为客户端还有tcp_syn_retries参数,默认是5,即使服务器端没有重发SYN+ACK包,客户端也会重发SYN握手包。详细解释:

The tcp_syn_retries variable tells the kernel how many times to try to retransmit the initial SYN
packet for an active TCP connection attempt.
This variable takes an integer value, but should not be set higher than 255 since each
retransmission will consume huge amounts of time as well as some amounts of bandwidth. Each
connection retransmission takes aproximately 30-40 seconds. The default setting is 5, which
would lead to an aproximate of 180 seconds delay before the connection times out.

第二个参数net.ipv4.tcp_max_syn_backlog = 200000也重要,具体多少数值受限于内存。

以下配置,第一段参数是最重要的,第二段参数是辅助的,其余参数是其他作用的:
# vi /etc/sysctl.conf

使配置生效:
# sysctl -p

注意,以下参数面对外网时,不要打开。因为副作用很明显,具体原因请google,如果已打开请显式改为0,然后执行sysctl -p关闭。因为经过试验,大量TIME_WAIT状态的连接对系统没太大影响:

为了处理大量连接,还需改大另一个参数:
# vi /etc/security/limits.conf 

在底下添加一行表示允许每个用户都最大可打开409600个文件句柄(包括连接):
*                –       nofile          409600

<think>好的,用户现在的问题是“python如何开启新的cc.py文件并传输字符串AAA给CC.PY”。首先,我需要确认用户的需求。他们想通过Python主程序启动一个名为cc.py的独立脚本,并且将字符串“AAA”传递给这个子进程。用户之前可能已经了解过类似的方法,比如之前的回答中提到的使用subprocess启动子进程并传递参数。不过这次需要具体针对传输字符串到cc.py的情况。 接下来,我要考虑不同的方法来实现这个需求。常见的方式有命令行参数、标准输入、环境变量、文件或管道、网络接口等。用户可能需要一个简单直接的解决方案,所以我会优先介绍命令行参数标准输入这两种方法,因为它们实现起来比较方便,适合传递简单的字符串。 首先,命令行参数方法。使用subprocess模块启动cc.py,并通过sys.argv获取参数。这种方式简单,但需要注意参数的安全性,避免注入攻击。不过对于传递简单字符串来说,问题不大。然后需要确保cc.py能够正确解析参数,比如使用argparse模块来处理命令行参数。 第二种方法是标准输入。主程序通过stdin写入字符串,子进程从stdin读取。这种方法适合传递较大的数据或需要持续输入的情况。但需要处理输入输出的同步问题,比如使用communicate()方法避免死锁。 接下来需要考虑用户的潜在需求。比如,是否需要在子进程执行完毕后获取输出?是否需要处理错误?或者是否需要异步执行?根据用户的问题描述,可能只需要基本的参数传递,但作为全面的回答,应该提及这些可能的扩展点。 另外,用户可能对子进程的管理感兴趣,比如如何等待子进程结束,或者如何处理多个子进程。之前的回答中提到了进程数限制清理机制,但这次的问题比较基础,可能不需要深入这些复杂内容,但可以简要提及。 还要注意跨平台兼容性。例如,subprocess在WindowsLinux下的行为是否一致,特别是shell参数的使用。在示例代码中,应避免使用shell=True,以防止安全漏洞。 然后,我需要验证示例代码的正确性。比如,使用subprocess.Popen时,参数是否正确传递,cc.py是否能正确接收并处理参数。特别是路径问题,如果cc.py不在同一目录下,可能需要使用绝对路径。 最后,总结不同方法的优缺点,帮助用户根据实际需求选择最合适的方式。例如,命令行参数适合简单参数,标准输入适合大量数据,环境变量适合配置信息,文件适合持久化数据,网络方法适合分布式场景。 可能用户在实际应用中会遇到的问题包括:路径错误导致找不到cc.py,权限问题,参数解析错误,或者子进程没有正确读取输入。应该在回答中提醒用户注意这些常见问题,并给出调试建议,比如打印接收到的参数或输入内容。 另外,用户可能希望子进程在后台运行,不影响主程序的执行。这时可能需要使用异步启动的方式,比如结合线程来管理子进程,但这可能超出了当前问题的范围,可以简要提及以供参考。 总之,回答需要清晰、分步骤地介绍不同方法,提供可运行的示例代码,并解释关键点,确保用户能够理解并成功实现需求。</think>以下是Python启动新`cc.py`文件并传递字符串"AAA"的5种实现方法及详细说明: --- ### 方法一:命令行参数传递(推荐) **实现原理**:通过`subprocess`模块启动子进程,使用命令行参数传递数据 `main.py`: ```python import subprocess # 启动子进程并传递参数 cmd = ['python', 'cc.py', 'AAA'] # 直接传递参数 subprocess.Popen(cmd) ``` `cc.py`: ```python import sys if __name__ == "__main__": received_data = sys.argv[1] # 获取第一个参数 print(f"接收到的数据:{received_data}") # 输出:AAA ``` **优势**: - 实现简单直接 - 参数传递即时可见 - 支持任意可执行文件 **注意**: - 参数需进行安全校验(防范命令注入) - 复杂数据建议使用JSON格式 --- ### 方法二:标准输入流传递 **适用场景**:传递大量文本或多行数据 `main.py`: ```python from subprocess import Popen, PIPE # 启动进程并建立输入管道 p = Popen(['python', 'cc.py'], stdin=PIPE, text=True) p.communicate(input='AAA') # 通过标准输入发送数据 ``` `cc.py`: ```python import sys if __name__ == "__main__": data = sys.stdin.read() # 读取全部输入 print(f"接收内容:{data}") # 输出:AAA ``` **特点**: - 支持大数据量传输 - 输入结束自动关闭管道 - 需注意数据编码格式 --- ### 方法三:环境变量传递 **适用场景**:传递配置信息或敏感数据 `main.py`: ```python import os import subprocess # 设置环境变量 env = os.environ.copy() env['SPECIAL_DATA'] = 'AAA' # 传递自定义环境 subprocess.Popen(['python', 'cc.py'], env=env) ``` `cc.py`: ```python import os if __name__ == "__main__": data = os.getenv('SPECIAL_DATA') print(f"环境变量值:{data}") # 输出:AAA ``` **优势**: - 数据隔离性好 - 适合传递敏感信息 - 子进程环境独立 --- ### 方法四:临时文件传递 **适用场景**:需要持久化存储的批量数据传输 `main.py`: ```python import tempfile import subprocess # 创建临时文件 with tempfile.NamedTemporaryFile(mode='w', delete=False) as f: f.write('AAA') temp_path = f.name # 传递文件路径参数 subprocess.Popen(['python', 'cc.py', temp_path]) ``` `cc.py`: ```python import sys if __name__ == "__main__": with open(sys.argv[1], 'r') as f: data = f.read() print(f"文件内容:{data}") # 输出:AAA ``` **特点**: - 适合大文件传输 - 需要文件清理机制 - 支持断点续传 --- ### 方法五:网络接口传递(进阶) **适用场景**:分布式系统间通信 `main.py`: ```python import subprocess import socket # 启动子进程 proc = subprocess.Popen(['python', 'cc.py']) # 通过本地Socket发送数据 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.connect(('localhost', 12345)) s.sendall(b'AAA') ``` `cc.py`: ```python import socket # 创建Socket服务器 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind(('localhost', 12345)) s.listen(1) conn, addr = s.accept() data = conn.recv(1024) print(f"网络接收:{data.decode()}") # 输出:AAA ``` **优势**: - 支持跨机器通信 - 可实现双向交互 - 需要处理网络异常 --- ### 综合对比表 | 方法 | 数据量 | 安全性 | 实时性 | 实现难度 | 适用场景 | |--------------|----------|--------|--------|----------|------------------------| | 命令行参数 | <1KB | 中 | 即时 | ★☆☆ | 简单参数传递 | | 标准输入 | 无限制 | 高 | 即时 | ★★☆ | 流式数据传输 | | 环境变量 | <4KB | 高 | 即时 | ★☆☆ | 配置信息传递 | | 临时文件 | 无限制 | 低 | 延迟 | ★★☆ | 批量/持久化数据 | | 网络接口 | 无限制 | 可调 | 即时 | ★★★ | 分布式系统通信 | --- ### 最佳实践建议 1. **简单场景**优先选用命令行参数方式 2. **敏感数据**建议使用环境变量或加密传输 3. **大数据量**推荐文件或网络方式 4. **添加异常处理**: ```python try: p = subprocess.Popen(...) except subprocess.CalledProcessError as e: print(f"执行错误:{e}") except FileNotFoundError: print("找不到脚本文件") ``` 5. **跨平台注意**: - Windows路径使用双反斜杠`C:\\path\\cc.py` - 检查Python解释器路径(建议使用`sys.executable`) --- ### 完整示例(命令行参数增强版) `main.py`: ```python import subprocess import json from pathlib import Path def run_cc_with_data(data): cc_path = Path(__file__).parent / "cc.py" # 序列化复杂数据 json_data = json.dumps({"payload": data}) # 安全启动子进程 try: proc = subprocess.Popen( [sys.executable, str(cc_path), json_data], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True ) # 获取输出 stdout, stderr = proc.communicate(timeout=30) if proc.returncode == 0: print(f"执行成功:{stdout}") else: print(f"执行失败:{stderr}") except Exception as e: print(f"进程错误:{str(e)}") if __name__ == "__main__": run_cc_with_data("AAA") ``` `cc.py`: ```python import sys import json def process_data(data): # 实际业务逻辑 return f"处理结果:{data.upper()}" if __name__ == "__main__": try: # 反序列化数据 input_data = json.loads(sys.argv[1]) result = process_data(input_data["payload"]) print(result) except (IndexError, json.JSONDecodeError): print("ERROR: 无效的输入参数") sys.exit(1) ``` 该方案实现了: 1. 安全的参数序列化 2. 完整的错误处理 3. 执行结果反馈 4. 跨平台路径处理 5. 超时控制机制
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值