小编Gre*_*SAT的帖子

netfilter/iptables:为什么不使用原始表?

在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)
  • 更快地处理数据包,而无需通过 conntrack+mangle+nat+routing。因此使用的 CPU/内存稍微减少了(反过来,由于必须加载 iptable_raw 模块而稍微补偿了这一点)
  • 只有一个规则,以防盒子也是路由器(显然不是每个规则都可以),因为不需要为过滤/转发添加相同的规则

我只进行了快速测试,这非常有效。
我发现的文档总是描述在严格情况下使用的原始表。但没有人给出哪怕是最小的理由。

问题:除了教条之外,是否有任何理由不使用原始表?

linux iptables

28
推荐指数
1
解决办法
3万
查看次数

Linux 总是发送 ICMP 重定向

我有几个 Debian Squeeze(最新的 6.0.6)用作路由器。
当链路断开时,它们将 ICMP 重定向发送到本地主机。这是 Debian 和其他几个的默认行为。因此,一旦链接恢复正常,主机在重新启动之前无法访问它。

我不希望从这些路由器发送任何 ICMP 重定向。

我测试echo 0 > /proc/sys/net/ipv4/conf/all/send_redirectssysctl -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 重定向?

linux networking ip

15
推荐指数
1
解决办法
2万
查看次数

从模板创建文本文件的工具

我必须定期从模板创建 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 脚本更好的自动化工具吗?

shell-script text-processing

9
推荐指数
3
解决办法
1万
查看次数

将 UDP 单播数据包转换为广播?

我们需要从 Internet 唤醒我们内部 LAN 上的一些计算机。
我们有一个有点封闭的路由器,配置它的方法很少。
我想使用 netfilter (iptables) 来执行此操作,因为它不涉及守护进程或类似程序,但其他解决方案也可以。

我的想法是:

  • 外部计算机向公共 IP 地址发出 WOL(Wake-On-LAN)数据包(内部具有正确的 MAC)
  • 路由器上打开了正确的端口(比如 1234),将数据重定向到 Linux 机器
  • Linux box将UDP单播包转化为广播包(内容完全一样,只是目的地址修改为255.255.255.255或192.168.0.255)
  • 多播数据包到达每个网卡,并且所需的计算机现在处于唤醒状态

为此,一个非常简单的 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。 …

iptables wake-on-lan broadcast

8
推荐指数
2
解决办法
1万
查看次数

Bash:带有可选参数的命令行

我正在运行这种代码:

#!/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)

bash quoting arguments

7
推荐指数
2
解决办法
1765
查看次数

kexec 和 USE_GRUB_CONFIG

我发现 kexec 对于加速 Linux 服务器的重启非常有用。

一个参数/etc/default/kexecUSE_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呢?我是不是哪里错了,还是大多数管理员更喜欢用特殊参数慢启动然后用它们快速重启?

linux grub debian kexec

7
推荐指数
1
解决办法
887
查看次数

x11vnc:如何有登录屏幕?

我长期以来一直使用x11vnc从我的办公室连接到我的家。我的目标是完全访问我的计算机,就像我在它面前一样。所以当我回到家时,我可以继续远程启动,反之亦然。
问题是我必须在上班前打开 X 会话,因为 x11vnc 不允许我看到任何登录屏幕。所以我不能远程重启,我不能以其他用户的身份登录,等等。

有没有办法让这个登录屏幕?

display-manager x11vnc

6
推荐指数
1
解决办法
9731
查看次数

从 ZFS 快照中恢复已删除的文件(仍然可以通过 lsof 查看)

我在 Linux Debian 上有一个 ZFS 卷。
每天晚上在此卷上拍摄快照。
不管什么原因,几天前删除了一个大文件(虚拟磁盘)。此文件仍在使用中(由kvm)。lsof显示此文件已删除。

如果我暂停该kvm过程,我可以恢复已删除的文件cp /proc/<pid>/fd/21 myfile.bak并在另一个虚拟机中使用它。但我不需要这个当前文件。

我需要这个文件的 2 天旧版本。
由于该文件在几天前被删除,因此它不在备份中。
我认为该文件存在于 ZFS 快照中,但不确定。我没有看到它/zpool/.zfs/snapshotname/path/to/file

有谁知道从 ZFS 快照中获取未真正删除的文件的方法?

zfs

6
推荐指数
2
解决办法
3498
查看次数

如何覆盖/etc/systemd/system.conf?

我想修改 systemd 中的默认行为。
此默认行为在CtrlAltDelBurstAction=reboot-force中注释掉/etc/systemd/system.conf

我只需要取消注释这一行并将其修改为CtrlAltDelBurstAction=none.
但是有没有一种“干净的方法”来做到这一点,而不是干扰原始发行版文件?

我测试过,systemctl edit system但这引发了一个错误,说明system.service未找到。

systemd

6
推荐指数
1
解决办法
3353
查看次数

软件 RAID 5 和 6 条带大小:为什么越小效率越低?

我在这里读到,小条带大小对于 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 的条带大小对于现代磁盘来说是最佳的(如果正确对齐)。

那么再一次,小条带大小如何减慢这一速度呢?

raid

5
推荐指数
1
解决办法
7545
查看次数

扫描更多端口时,nmap 呈指数级增长

我有时使用 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 端口?

nmap

3
推荐指数
2
解决办法
1万
查看次数

在没有 CUPS 的情况下安装 LPD 的“官方”方式是什么?

我想在不安装完整的 CUPS 的情况下安装 LPD(行式打印机守护程序)。
仅 LPD 就比 CUPS 小得多。
它适用于 Raspbian(Raspberry 上的 Debian)。

在 Debian 中,有 2 个等效的软件包包含 LPD 的必要部分:rlpr并且cups-bsd 都只包含 4 个可执行文件和相关的手册页。但是他们缺乏在 Linux 启动时将 LPQ 作为守护程序运行的机制。

创建自己的 systemd 服务文件很容易。但是有没有一种“官方”的方式来运行 LPQ 守护进程?

debian printing apt raspbian

3
推荐指数
1
解决办法
609
查看次数