中年プログラマーの息抜き

カシマルです。 最近、新しい土地へ引っ越しをしたのですが、これを機に何か始めたいなと思ってブログをはじめました。気の向くままに更新していきます。

CISCO 841M 設定:その13:L3スイッチでVLAN 間のルーティングをフィルタする

f:id:tm-b:20170728004131j:plain

はじめに

L3スイッチが4ポートあり、それぞれVLAN1, VLAN2, VLAN3, VLAN4で分離したとしても、ルーティング機能により、VLAN2⇔VLAN3などVLANをまたいだ通信が可能です。(ノードからping を打つと届きます。)今回は例として、VLAN2⇔VLAN3をフィルタし通信を出来なくなるようなACLを考えてみました。(ノードからping が届かなくなります。)

VLAN2は「192.168.20.0/24」、VLAN3は「192.168.30.0/24」とします。

機材

CISCO 841M本体
・KAUMO USB RJ45 シリアルコンソールケーブル
・Win10 ノートPC

VLAN内でのフィルタイメージ

VLAN内で機能するACLを設置し、VLAN内で発生する通信がACLのIN側から入りフィルタを通過したものだけが外に出られると考えます・・・
※ここでフィルタしたいと思います。

VLAN2 ( ⇒ ) ルーティング ⇒ VLAN3ノード
 → (ACL120-in) ↑

VLAN3 ( ⇒ ) ルーティング ⇒ VLAN2ノード
 → (ACL130-in) ↑

設定の流れ

・VLAN2のACLグループ(120)を作成、設定する

・VLAN3のACLグループ(130)を作成、設定する

ACLグループ(120)

no access-list 120
access-list 120 deny ip any 192.168.30.0 0.0.0.255
access-list 120 permit ip any any
interface Vlan2
  ip access-group 120 in
  exit

ACLグループ(130)

no access-list 130
access-list 130 deny ip any 192.168.20.0 0.0.0.255
access-list 130 permit ip any any
interface Vlan3
  ip access-group 130 in
  exit

まとめ

in と out のイメージがつかみにくかったですが、VLAN内のACLということで考えをまとめ、整理しました。ネットワーク単位ではなくノード単位で細かく設定する場合は特にだと思いますが、いろいろな可能性を考えると、VLANで設定しておくほうが人にやさしいのかなと…

d(`Д´)b39

PERL[CGI]でPHPのSESSIONを利用してみます

はじめに

PERLで作ったダウンローダーって行数少なくソフト的にはファイルサイズに上限がないなど、個人的に便利なので社内のちょっとしたシステムでよく使います。

一方でメイン画面は他言語でPERLを使う機会は減っていて、ほかの言語で書いたプログラムとセッション情報を共有するには工夫が必要なこともあります。

今回は、メイン画面をPHPでログイン処理するようなシステムがあり、そのセッション情報をPERLから利用する機会があったのでそのメモです。

簡単に機能説明

PHP
ログイン情報をセッションで保持する
({ id }を含む連想配列をloginという名前で保持する)
PERLCGI
ログイン情報をPHPのセッションから取得する
(取得できればファイルをダウンロードさせる)
リクエストパラメータでファイルを特定する
(id=5 みたいなパラメータでMySQLを検索)

依存ライブラリ(CPAN

ライブラリ使ってみます。下の三つを配置してCGIスクリプトから参照。CPANの環境からだと「PHP::Session」を入れたら全部落ちてくるような気もします。

CGIDBIなど一般的なライブラリ
XSERVERなどレンサバで最初から使えるものは割愛します。
・UNIVERSAL::require
https://metacpan.org/pod/UNIVERSAL::require
PHP::Session
https://metacpan.org/pod/PHP::Session
PHP::Session::Serializer::PHP
https://metacpan.org/pod/PHP::Session::Serializer::PHP

CGIのサンプル

エラー処理は省略。(例えば、PHP::Session->new が失敗すると異常終了します)

#!/usr/bin/perl
use strict;
use warnings;
use lib 'modules';#依存ライブラリを配置したディレクトリ

use CGI qw(:standard);
use PHP::Session;
#セッションファイルの場所はphpinfo()等で確認して、
my $session = PHP::Session->new(cookie('PHPSESSID'), { save_path => '/***/php/session' });
if ($session && $session->get('login') && $session->get('login')->{'id'}) {
    use DBI;
    use Encode qw/encode_utf8/;
    use URI::Escape;

    my %form = ( "id" => "" );
    my $query = $ENV{'QUERY_STRING'};
    $query =~ tr/+/ /;
    $query =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg;
    foreach (split(/&/, $query)) {
        my ($k, $v) = split(/=/,$_);
        $v =~ tr/+/ /;
        $v =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
        $form{$k} = $v;
    }

    if ($form{"id"}) {
        my $dsn = "dbi:mysql:database=***;host=***;port=***";
        my $user = "***";
        my $pass ="***";
        my $dbh = DBI->connect($dsn, $user, $pass, {
            AutoCommit => 1,
            PrintError => 0,
            RaiseError => 1,
            ShowErrorStatement => 1,
            AutoInactiveDestroy => 1
        })|| die $DBI::errstr;
        my $sth = $dbh->prepare("SELECT name `ファイル名`,path `ファイルパス` FROM ***);

        $sth->execute();
        if (my @row = $sth->fetchrow) {
            my $name = URI::Escape::uri_escape($row[0]);
            open IN,"$row[1]" || die "E3001:400 Bad Request.";
            print "Content-type: application/octet-stream\n";
            print "Content-Disposition: attachment; filename=\"$row[0]\"; filename*=UTF-8''$name\n\n";
            print ;
            close IN;
        } else {
            die "E3002:400 Bad Request.";
        }
        $sth->finish;
        $dbh->disconnect;
    } else {
        die "E3003:400 Bad Request.";
    }
} else {
    die "E3004:401 Unauthorized.";
}



1;

まとめ

PERLは好きな言語です。

ab39

swift4 DateFormatter->string 日時と文字列の相互変換で9時間ずれる ので ずれないようにする

はじめに

今回はswiftを使った日付操作で気がついたことのメモ。swiftではDate、Locale、TimeZone、DateFormatter、など考慮したその一例です、ある日時に対して、DateFormatterを利用した「Date<-->String」の相互変換をswiftで書いてみます。

TimeZoneを意識せず実装してみる

DateとStringが異る日時

実行日時:2019-01-1 09:00:00
-> 日時:Date()
-> 日時:2019-01-1 00:00:00 (9時間ずれる)
-> Date -->String:e0.string(from: e1)
-> Date -->String:2019-01-1 09:00:00 (正しい日時)
-> String -->Date:e0.date(from: e2)
-> String -->Date:2019-01-1 00:00:00 (9時間ずれる)
let e0 = DateFormatter()
e0.dateFormat = "yyyy-MM-dd HH:mm:ss"
let e1 = Date()
let e2 = e0.string(from: e1)
let e3 = e0.date(from: e2)

TimeZoneを日本時間に固定してみる

実行日時:2019-01-1 09:00:00

DateとStringが同じ日時

-> 日時:Date.current
-> 日時:2019-01-1 09:00:00 (正しい日時)
-> Date -->String:DateFormatter.current("yyyy-MM-dd HH:mm:ss").string(from: d1)
-> Date -->String:2019-01-1 09:00:00 (正しい日時)
-> String -->Date:DateFormatter.current("yyyy-MM-dd HH:mm:ss").date(from: d2)
-> String -->Date:2019-01-1 09:00:00 (正しい日時)
let d1 = Date.current
let d2 = DateFormatter.current("yyyy-MM-dd HH:mm:ss").string(from: d1)
let d3 = DateFormatter.current("yyyy-MM-dd HH:mm:ss").date(from: d2)

extension TimeZone {
    static let gmt = TimeZone(secondsFromGMT: 0)!
    static let jst = TimeZone(identifier: "Asia/Tokyo")!
}

extension Locale {
    static let japan = Locale(identifier: "ja_JP")
}

extension DateFormatter {
    static func current(_ dateFormat: String) -> DateFormatter {
        let df = DateFormatter()
        df.timeZone = TimeZone.gmt
        df.locale = Locale.japan
        df.dateFormat = dateFormat
        return df
    }
}

extension Date {
    static var current: Date = Date(timeIntervalSinceNow: TimeInterval(TimeZone.jst.secondsFromGMT()))
}

まとめ

以前に書いたカレンダーの記事では・・・

ということで??、例えば、0:0:0 や 23:59:59 正しい日時を扱えるように。

【Android】日当-ヒナタ-

週末で審査に出そうと思います・・

ab39