2011-03-15 32 views
8

这是我的场景:模拟主机无法访问 - 如何实现/实现它

A是供应服务器,B是客户端。每当B的设置发生任何变化时,它都会将相应的配置文件上传到A.

我正在作为自动化工程师工作,以实现自动化。其中一种情况表示断开A与网络的连接或停止服务器A.对B进行一些更改并确保B无法将文件上载到供应服务器A.

要自动执行此操作,服务器A并执行相应的操作。

由于A和B也用于其他目的的其他方,所以我不能从网络断开或者A或B或A处

所以停止服务器,我期待着任何解决方案,使我可以模拟主机(配置服务器)无法访问的情况。所以当B向A发送更新时,它会失败,但实际上A正常运行。

请给我一些方法来实现它。

我使用Perl作为编程语言,但如果解决方案可用其他语言,我很好。

回答

16

我在使用空路由之前完成了这个操作。这是使用ip命令在shell中最好的做法。

# blackhole all packets destined for 192.168.2.1 
ip route add blackhole 192.168.2.1 
# to delete the same route, replace add with del 
ip route del blackhole 192.168.2.1 

根据你的使用情况,为不可达路由可以更好地工作,因为它返回一个ICMP不可达的而不是丢弃的数据包,但他们往往有相同的效果。

ip route add unreachable 192.168.2.1 

而对于彻底,如果你真的想模拟主机不可达的情况(与网络不可达),你就必须这样做,在防火墙级别。

# resond with icmp-host-unreachable for *any* outbound packet to 192.168.2.1 
iptables -I OUTPUT -d 192.168.2.1 -j REJECT --reject-with=icmp-host-unreachable 
# delete the same rule (without looking up the rule #) 
iptables -D OUTPUT -d 192.168.2.1 -j REJECT --reject-with=icmp-host-unreachable 
+0

感谢吉姆为您的及时答复。我是网络领域的新手。如果我没有错,我需要在服务器端执行这些更改? – rpg 2011-03-15 15:52:03

+0

@ converter42 - 谢谢:) – JimB 2011-03-15 15:54:11

+0

@ user502937 - 不会,您可以使用服务器的IP在客户端添加路由。这会使服务器看起来“消失”,(或者从技术上讲,到服务器的路由消失了)。 – JimB 2011-03-15 15:57:23

1

另一个,或许更容易的选择是改变B的配置具有用于A(例如192.0.2.0)执行当测试一个虚假的IP地址。

+0

我希望我能做到这一点。正如我所提到的,A和B被其他方使用,所以我无法对现有设置进行任何更改。 – rpg 2011-03-16 05:25:18

0

Test::MockObject::Extends - 非常适合修改小部分模块以创建特定的测试场景。适用于你无法测试的东西,因为它们会影响生产环境或你无法控制的地方。

#!/usr/bin/perl 

use strict; 
use warnings; 
use Test::MockObject::Extends; 

#Fake module that has your remote connect subroutine 
use Fake::Module; 

my $object = Fake::Module->new(); 

#replace your obj with a copy that Test::MO:E will let us mess with 
$object = Test::MockObject::Extends->new($object) 

#replace your connect function with a temp fake version 
$object->mock(
    'your_remote_connect_sub' => sub { 
     #Whatever data that should returned by your connect function if the server is unavailable 
     return undef; 
    }, 
); 

#test your sub now 
if (!defined($object->your_remove_connect_sub())) { 
    print "Remote server unavailable\n"; 
}