开发时是否可以从Linux机器模拟“无外部访问”?

开发时是否可以从Linux机器模拟“无外部访问”?

有时我会将应用程序上传到无法访问外部互联网的服务器。

我想在我的机器中创建相同的环境来测试应用程序中的某些功能并避免错误(例如从外部源读取 rss)。

我想过只拔掉以太网电缆来进行模拟,但这似乎很过时,而且与服务器上的限制相比,我不知道在执行此操作时是否会引发相同的异常(特别是在 Python 中)。

那么,如何在我的开发机器上模拟“无外部访问”呢? “停用”我的以太网接口并稍后重新激活(使用“无麻烦”命令)是否与没有外部访问的服务器具有相同的行为?

我使用的是 Ubuntu 10.04。谢谢!

答案1

删除默认路由应该可以做到这一点。您可以使用 显示路由表/sbin/route,并使用以下命令删除默认值:

sudo /sbin/route del default

这将使您的系统连接到本地网络,但不知道将发往本地网络的数据包发送到哪里。这可能非常准确地模拟了“无外部访问”的情况。

您可以将其放回去route add(记住您的网关应该是什么),或者只需重新启动网络即可。我刚刚在带有 NetworkManager 的系统上尝试过,切换默认设置效果很好,我只需单击面板图标并重新选择本地网络即可恢复它。 NM 可能会在其他事件中自行执行此操作,因此请小心。

另一种方法是使用iptables规则来阻止出站流量。但我认为路由方法可能更好。

答案2

你写了

那么,如何在我的开发机器上模拟“无外部访问”呢?

如何“停用”我的以太网接口并在稍后重新激活?

这是两个问题还是一个问题?我不确定你的意思simulate "no external access"。但是,要停用以太网接口,您可以简单地执行以下操作

#ifdown eth0
#ifup eth0

或任何您的互联网设备。这将分别关闭和打开您的以太网接口。

答案3

您可以在仅提供仅主机网络接口的虚拟机(用户模式Linux、VServer、OpenVZ、VirtualBox、VMWare、KVM等)中运行代码(即没有从虚拟机到除主机之外的任何地方的路由) )。

如果您以专用用户身份运行应用程序appuser,则可以限制该用户的网络访问。确保你有iptables(乌班图:iptables 安装 iptables http://bit.ly/software-small) 和iproute2(ip命令)(乌班图:ip路由 安装 iproute http://bit.ly/software-small,iproute 文档 安装 iproute-doc http://bit.ly/software-small)已安装。然后,您可以使用 来iptables标记来自运行为 的进程的传出流量appuser, 和ip ruleip route为该用户设置备用路由表。

ip rule add fwmark 1 table 1
ip route add 127.0.0.0/0 table 1 dev lo
iptables -t mangle -A OUTPUT -m owner --uid-owner appuser -j MARK --set-mark 1

(注:未经测试。另请参阅更多 Linux IP 数据包修改示例.)

答案4

这就是容器的用途(https://linuxcontainers.org/)它们有点像 chroot,但粒度更细,并且具有网络控制和其他功能。

不幸的是我不知道如何使用它们。 (我的训练只是了解它们的存在以及它们的大致作用。)

docker是一个管理容器的应用程序,您不想手动执行此操作。

相关内容