2011-03-15 51 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"; 
}