在Linux下,我们通常使用“过滤器”表来做常见的过滤:
iptables --table filter --append INPUT --source 1.2.3.4 --jump DROP
iptables --table filter --append INPUT --in-interface lo --jump ACCEPT
Run Code Online (Sandbox Code Playgroud)
根据下面的 netfilter 流程图,数据包首先通过“原始”表:
所以我们可以写:
iptables --table raw --append PREROUTING --source 1.2.3.4 --jump DROP
iptables --table raw --append PREROUTING --in-interface lo --jump ACCEPT
Run Code Online (Sandbox Code Playgroud)
我只进行了快速测试,这非常有效。
我发现的文档总是描述在严格情况下使用的原始表。但没有人给出哪怕是最小的理由。
问题:除了教条之外,是否有任何理由不使用原始表?
我有几个 Debian Squeeze(最新的 6.0.6)用作路由器。
当链路断开时,它们将 ICMP 重定向发送到本地主机。这是 Debian 和其他几个的默认行为。因此,一旦链接恢复正常,主机在重新启动之前无法访问它。
我不希望从这些路由器发送任何 ICMP 重定向。
我测试echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects和sysctl -w net.ipv4.conf.all.send_redirects=0并把net.ipv4.conf.all.send_redirects=0到/etc/sysctl.d/local.conf
这些解决方案中的每把正确的价值为/proc/sys/net/ipv4/conf/all/send_redirects
但是......
内核不断发送ICMP重定向。即使在重新启动后:
$ tcpdump -n -i eth0
00:56:17.186995 IP 192.168.0.254 > 192.168.0.100: ICMP redirect 10.10.13.102 to host 192.168.0.1, length 68
Run Code Online (Sandbox Code Playgroud)
并且本地主机(Windows 计算机)的路由表被污染。
我可以用 netfilter 防止这种情况:
iptables -t mangle -A POSTROUTING -p icmp --icmp-type redirect -j DROP
知道为什么通常的方法不起作用吗?
以及如何在不使用 netfilter 的情况下防止发送 ICMP 重定向?
我必须定期从模板创建 100 多个文本文件。
我目前使用一个过于复杂的 shell 脚本。我认为有一个更聪明的方法来处理这个问题,但我不知道如何。
我有一个“数据库”:
# outputfile template data1 data2 data3
first.txt $template_main $text1 abcd 1234
second.txt $template_main $text2 efgh 5678
third.txt $template_other $text1 ij 90
Run Code Online (Sandbox Code Playgroud)
和一个配置文件:
template_main=main.txt
template_other=other.txt
text1=whatever
text2=blah
Run Code Online (Sandbox Code Playgroud)
模板是带有 %%data2%% 等占位符的文本文件(占位符形式可以更改)。
有人知道比复杂的 shell 脚本更好的自动化工具吗?
我们需要从 Internet 唤醒我们内部 LAN 上的一些计算机。
我们有一个有点封闭的路由器,配置它的方法很少。
我想使用 netfilter (iptables) 来执行此操作,因为它不涉及守护进程或类似程序,但其他解决方案也可以。
我的想法是:
为此,一个非常简单的 netfilter 规则是:
iptables --table nat --append PREROUTING --in-interface eth+ --protocol udp --destination-port 1234 --jump DNAT --to-destination 192.168.0.255
唉 netfilter 似乎忽略了转换到广播。192.168.0.255 和 255.255.255.255 什么也没给。还用 192.168.0.0 和 0.0.0.0 进行了测试,
我使用 tcpdump 来查看会发生什么:
tcpdump -n dst port 1234
13:54:28.583556 IP www.xxx.yyy.zzz.43852 > 192.168.0.100.1234: UDP, length 102
仅此而已。我应该有第二行,如:
13:54:28.xxxxxx IP www.xxx.yyy.zzz.43852 > 192.168.0.255.1234: UDP, length 102
如果我重定向到非多播地址,则一切正常。我有 2 条预期的线路。但显然这不适用于 WOL。 …
我正在运行这种代码:
#!/usr/bin/env bash
set -u
exclude1='--exclude=/path/*'
exclude2='--exclude=/path with spaces/*'
exclude3='' # any 'exclude' can be empty
tar -czf backup.tgz "$exclude1" "$exclude2" "$exclude3" 2>&1 | grep -i 'my_reg_exp' > error.log
RESULT=("${PIPESTATUS[@]}")
... etc ...
Run Code Online (Sandbox Code Playgroud)
当我运行此代码时,出现此错误:
tar: : Cannot stat: No such file or directory
Run Code Online (Sandbox Code Playgroud)
这是因为“$exclude3”被翻译为一个空参数。就像我这样做一样:
tar -czf backup.tgz "$exclude1" "$exclude2" ''
Run Code Online (Sandbox Code Playgroud)
避免此错误的一种方法是删除 $excludeX 周围的双引号。但是如果 $excludeX 包含任何空格或其他奇怪的字符,这是一个问题。
另一种方法是使用,eval但因为我需要保留双引号,所以我不知道如何在需要时抑制引号和空参数。
我找到的唯一解决方案是使用字符串连接构造命令行:
CMD='tar -czf backup.tgz'
if [[ -n "$exclude1" ]]; then CMD+=" \"$exclude1\" "; fi
if [[ -n "$exclude2" ]]; then CMD+=" \"$exclude2\" …Run Code Online (Sandbox Code Playgroud) 我发现 kexec 对于加速 Linux 服务器的重启非常有用。
一个参数/etc/default/kexec是USE_GRUB_CONFIG.
此参数旨在“读取 Grub 配置文件”。但我不明白是什么决定了将其设置为 true 或 false 之间的选择。
我的理解:在 Debian 中,该/etc/init.d/kexec-load文件包含用于使用 kexec 重新启动的代码。当USE_GRUB_CONFIG设置为 true 时,则读取 Grub 配置文件并使用其参数重新启动。
如果USE_GRUB_CONFIG设置为 false,则使用当前参数重新加载当前内核。
所以USE_GRUB_CONFIG设置为 true 总是使用“正常”内核重新启动。
并USE_GRUB_CONFIG设置为 false 总是重新启动而不更改任何内容,忽略可以对 Grub 执行的任何操作。
然后我推断我应该将它设置为 true 以利用更新到 Grub 配置。
那么为什么默认值是false呢?我是不是哪里错了,还是大多数管理员更喜欢用特殊参数慢启动然后用它们快速重启?
我长期以来一直使用x11vnc从我的办公室连接到我的家。我的目标是完全访问我的计算机,就像我在它面前一样。所以当我回到家时,我可以继续远程启动,反之亦然。
问题是我必须在上班前打开 X 会话,因为 x11vnc 不允许我看到任何登录屏幕。所以我不能远程重启,我不能以其他用户的身份登录,等等。
有没有办法让这个登录屏幕?
我在 Linux Debian 上有一个 ZFS 卷。
每天晚上在此卷上拍摄快照。
不管什么原因,几天前删除了一个大文件(虚拟磁盘)。此文件仍在使用中(由kvm)。lsof显示此文件已删除。
如果我暂停该kvm过程,我可以恢复已删除的文件cp /proc/<pid>/fd/21 myfile.bak并在另一个虚拟机中使用它。但我不需要这个当前文件。
我需要这个文件的 2 天旧版本。
由于该文件在几天前被删除,因此它不在备份中。
我认为该文件存在于 ZFS 快照中,但不确定。我没有看到它/zpool/.zfs/snapshotname/path/to/file
有谁知道从 ZFS 快照中获取未真正删除的文件的方法?
我想修改 systemd 中的默认行为。
此默认行为在CtrlAltDelBurstAction=reboot-force中注释掉/etc/systemd/system.conf。
我只需要取消注释这一行并将其修改为CtrlAltDelBurstAction=none.
但是有没有一种“干净的方法”来做到这一点,而不是干扰原始发行版文件?
我测试过,systemctl edit system但这引发了一个错误,说明system.service未找到。
我在这里读到,小条带大小对于 Linux 中的软件(也可能是硬件)RAID 5 和 6 不利。我看到的罕见基准完全同意这一点。
但大家给出的解释是这会引起更多的头部运动。我只是不明白小条纹如何导致更多的头部运动。
假设我们有一个包含 4 个本地 SAS 驱动器的 RAID 6 设置。
情况 1:我们写入 1 Gb 的顺序数据
程序要求内核写入数据,然后内核将其划分以匹配条带大小并计算要写入每个磁盘的每个块(数据和/或奇偶校验)。
内核能够同时写入 4 个磁盘(使用适当的磁盘控制器)。
如果写入的数据未与条带完全对齐,则内核只需在计算结果数据之前读取第一个和最后一个条带。所有其他条带只会被覆盖,而不关心以前的数据。
由于此计算的完成速度比磁盘吞吐量快得多,因此每个块都会直接写入每个磁盘上前一个块的旁边,而不会暂停。所以这基本上是对 4 个磁盘的顺序写入。
小的条带大小如何减慢这一速度?
情况 2:我们在随机位置写入 1,000,000 x 1 kb 的数据
1 kb 小于条带大小(常见条带大小当前为 512 kb)
程序要求内核写入一些数据,然后写入一些其他数据,然后再写入一些其他数据等等。对于每次写入,内核必须读取磁盘上的当前数据,计算新内容,然后将其写回磁盘。然后头部移动到其他地方,并且该操作会重复 999,999 次。
条带大小越小,读取/计算/写入数据的速度就越快。理想情况下,4 kb 的条带大小对于现代磁盘来说是最佳的(如果正确对齐)。
那么再一次,小条带大小如何减慢这一速度呢?
我有时使用 nmap 来检查我的主机。例如:nmap -sS -p- example.com
但是这个命令永远不会完成。
所以我把扫描分成小部分:nmap -sS -p 0-999 example.com(12 秒完成)
然后nmap -sS -p 1000-1999 example.com(14 秒完成)等等。这很乏味。
如果使用较宽的零件:nmap -sS -p 0-3999 example.com
需要 3 分钟以上才能完成。
并且nmap -sS -p 0-7999 example.com在 30 分钟后还没有完成。
所以:
1000 个端口 -> 12 秒
4000 个端口 -> 3 分钟
9000 个端口 -> 30 分钟
有什么问题?
如何使用 nmap 找到一台主机的开放 TCP 端口?
我想在不安装完整的 CUPS 的情况下安装 LPD(行式打印机守护程序)。
仅 LPD 就比 CUPS 小得多。
它适用于 Raspbian(Raspberry 上的 Debian)。
在 Debian 中,有 2 个等效的软件包包含 LPD 的必要部分:rlpr并且cups-bsd
都只包含 4 个可执行文件和相关的手册页。但是他们缺乏在 Linux 启动时将 LPQ 作为守护程序运行的机制。
创建自己的 systemd 服务文件很容易。但是有没有一种“官方”的方式来运行 LPQ 守护进程?