どこかで見つけたもののほぼコピー。
本当はRubyでやりたかったけど、やり方が解らなかったからPerlで。
外側からTCPの22040ポートにアクセスが来たら、192.168.0.40の22ポートにフォワードする。
こんな感じのを各サーバに入れておいて、サーバ起動時とかにネットワークの後に自動起動させれば、DHCPとかでも設定いらずで外から直接SSHに入れる!
と思ったら、我が家のルータはポート変換に対応していなかった!
まぁIPアドレスの変換には対応してたから、いずれ使う事もあるかも…?
#!/usr/bin/perl use Net::UPnP::ControlPoint; use Net::UPnP::GW::Gateway; my $obj = Net::UPnP::ControlPoint->new(); @dev_list = (); while (@dev_list <= 0 || $retry_cnt > 5) { # @dev_list = $obj->search(st =>'urn:schemas-upnp-org:device:InternetGatewayDevice:1', mx => 10); @dev_list = $obj->search(st =>'upnp:rootdevice', mx => 3); $retry_cnt++; } $devNum= 0; foreach $dev (@dev_list) { my $device_type = $dev->getdevicetype(); if ($device_type ne 'urn:schemas-upnp-org:device:InternetGatewayDevice:1') { next; } print "[$devNum] : " . $dev->getfriendlyname() . "\n"; unless ($dev->getservicebyname('urn:schemas-upnp-org:service:WANIPConnection:1')) { next; } my $gwdev = Net::UPnP::GW::Gateway->new(); $gwdev->setdevice($dev); print "\tExternalIPAddress = " . $gwdev->getexternalipaddress() . "\n"; $gwdev->addportmapping( NewRemoteHost => $gwdev->getexternalipaddress(), NewExternalPort => '22040', NewProtocol => 'tcp', NewInternalPort => '22', NewInternalClient => '192.168.0.40', NewEnabled => 1, NewPortMappingDescription => 'upnp port mapping test', NewLeaseDuration => 0 ); }