我正在尝试建立一个 VPN(使用 OpenVPN),以便所有流量,只有流量,去往/来自特定进程,通过 VPN;其他进程应该继续直接使用物理设备。我的理解是,在 Linux 中执行此操作的方法是使用网络命名空间。
如果我正常使用 OpenVPN(即通过 VPN 从客户端汇集所有流量),它工作正常。具体来说,我像这样启动 OpenVPN:
# openvpn --config destination.ovpn --auth-user-pass credentials.txt
Run Code Online (Sandbox Code Playgroud)
(destination.ovpn 的编辑版本在这个问题的末尾。)
我被困在下一步,编写将隧道设备限制为命名空间的脚本。我试过了:
将隧道设备直接放在命名空间中
# ip netns add tns0
# ip link set dev tun0 netns tns0
# ip netns exec tns0 ( ... commands to bring up tun0 as usual ... )
Run Code Online (Sandbox Code Playgroud)
这些命令成功执行,但在命名空间内产生的流量(例如 with ip netns exec tns0 traceroute -n 8.8.8.8)落入了一个黑洞。
假设“您[仍然]只能将虚拟以太网(veth)接口分配给网络命名空间”(如果属实,将获得今年最荒谬的不必要的API限制奖),创建一个veth对和一个网桥,以及将 veth 对的一端放在命名空间中。这甚至不会让地面上的流量下降:它不会让我将隧道放入桥中![编辑:这似乎是因为只能将分接头设备放入网桥。与无法将任意设备放入网络命名空间不同,这实际上是有道理的,网桥是以太网层的概念;不幸的是,我的 VPN 提供商不支持 Tap 模式下的 OpenVPN,所以我需要一个解决方法。]
# ip addr add …Run Code Online (Sandbox Code Playgroud)如果我编写一个程序试图在每个可能的地址读取内存,并且我在“完整”的 Unix 上运行它,它将无法访问所有物理 RAM。但是操作系统如何阻止它这样做呢?
我更熟悉小型 CPU 架构,其中任何一段汇编代码都可以访问所有内容。我不明白程序(内核)如何检测到这种恶意操作。
我有来自故障硬盘驱动器的两个部分磁盘映像。文件 B 包含磁盘的大部分内容,在扇区读取失败的地方存在间隙。文件 A 是告诉ddrescue重试所有失败扇区的结果,因此它几乎完全是空白,但包含一些重读成功的地方。我现在需要将文件 A 的有趣内容合并回文件 B。算法很简单:
while not eof(A):
read 512 bytes from A
if any of them are nonzero:
seek to corresponding offset in B
write bytes into B
Run Code Online (Sandbox Code Playgroud)
我可以坐下来自己写这个,但我首先想知道是否其他人已经编写并调试了它。
(更复杂的是,由于空间有限,文件 B 和文件 A 位于两台不同的计算机上——这就是为什么我没有告诉ddrescue首先尝试填补 B 中的空白——但 A 可以是通过网络传输相对容易,稀疏。)
我正在用一个程序开始一个过程。我希望进程在程序执行时终止,因为它丢失了标准输入。
我终止了程序,然后去进程的proc/pid/fd,发现它的stdin仍然链接到/dev/pts/2。
为什么在这种情况下进程不会关闭?更好的是,是否有我可以使用的包装器或技术来确保程序在其标准输入管道关闭时关闭?
众所周知的是,在很多如果不是全部的Unix,一个进程的退出状态时就会穿过截断的最低8位_exit,waitpid和WEXITSTATUS。(POSIX的当前迭代指定的状态应该不会当穿过被截断_exit和waitid,但是这不是有关这个问题。)
是它曾经的情况下,可能深在过去,退出状态将被截断的最低7位时通过任何机构后是相当于_exit/ waitpid/WEXITSTATUS在时间?如果是这样,那是哪个历史实现,以及多久以前的实现?