BASH shell scriptでの二次元配列(風)
うまい参考がなかったので、下記にメモ。二次元配列風 bash。下記をファイル名fileとして保存
#!/bin/bash ARRAYS=("a 1" "b 2 3" "ccc 4 5 6") for ARRAY in "${ARRAYS[@]}" do #echo ARRAY is \" "${ARRAY}" \" ARRAY=(`echo ${ARRAY}`) for ELEM in "${ARRAY[@]}" do echo "${ELEM}" done done
結果
~$ bash file a 1 b 2 3 ccc 4 5 6
~$bash -x filea
- ARRAYS=("a 1" "b 2 3" "ccc 4 5 6")
- for ARRAY in "${ARRAYS[@]}"
- ARRAY=(`echo ${ARRAY}`)
- echo a 1
- for ELEM in "${ARRAY[@]}"
- echo a
1
- for ELEM in "${ARRAY[@]}"
- echo 1
b
- for ARRAY in "${ARRAYS[@]}"
- ARRAY=(`echo ${ARRAY}`)
- echo b 2 3
- for ELEM in "${ARRAY[@]}"
- echo b
2
- for ELEM in "${ARRAY[@]}"
- echo 2
3
- for ELEM in "${ARRAY[@]}"
- echo 3
ccc
- for ARRAY in "${ARRAYS[@]}"
- ARRAY=(`echo ${ARRAY}`)
- echo ccc 4 5 6
- for ELEM in "${ARRAY[@]}"
- echo ccc
4
- for ELEM in "${ARRAY[@]}"
- echo 4
5
- for ELEM in "${ARRAY[@]}"
- echo 5
6
- for ELEM in "${ARRAY[@]}"
- echo 6
ASAでPATでICMPが返ってこないとき
ASAは(限らずファイアウォールとか少しレイヤ高くなるものは)あまりまとまった情報が出てこない。おそらくできる人はできるけど、いつの間にか操作を悟っているので、特にネットワークの世界では、プロダクトの知識を知らないとダメなやつと思われがちなので、そのような世界観では、発信はされないためと考える
ASAでPATしている環境で、NAT元(内側)から外(変換後インタフェースのさらいに外のどっか)にping打って応答が返ってこないというケース。
こんなログが出てて、何かACL空けなきゃいけないのかね。FWってステートフルパケットインスペクションじゃないのかね。というとき。
Deny inbound icmp src outside:X.X.X.X dst inside:Y.Y.Y.Y (type 0, code 0)
いくつかのプロトコルは、インスペクションルールを別途定義する(例えば思いつきやすいものではFTPを想像してみる)。CLIコンフィギュレーションガイドから「アプリケーション レイヤ プロトコル インスペクション」とか「インスペクション」で探してみると情報は見つかる。
ICMPについてで述べると、下記のような情報もある。
「ASA で ICMP Inspection の正しい適用方法」
https://community.cisco.com/t5/%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3-%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88/asa-%E3%81%A7-icmp-inspection-%E3%81%AE%E6%AD%A3%E3%81%97%E3%81%84%E9%81%A9%E7%94%A8%E6%96%B9%E6%B3%95/ta-p/3121813
例えば上記リンクの設定例2)を引用
access-list ICMP extended permit icmp any any
!
class-map ICMP
match access-list ICMP
!
policy-map global_policy
class ICMP
inspect icmp
そして、有効化も忘れずに。例えばglobalで
service-policy global_policy global
SSHポートフォワーディング(トンネリング)のコネクション
sshポートフォワーディング(トンネリング)は、おおまかにはsshサーバを踏み台にして、そこへのssh接続を文字通り"トンネル"のように使って、別の宛先に別のプロトコルを通す。使い方は調べるとたくさん出てくる。
例えば、下記のようにしたとする。
$ ssh username@192.168.1.11 -L 3456:192.168.1.11:80
3456は、クライアントにできるトンネルの入り口になるポート番号
クライアントからは、192.168.1.11 のsshサーバへsshでつながる
192.168.1.11:80はトンネルから出た先の最終的な接続先
※上記はsshサーバと最終的な接続先が同じホスト上
例えばクライアントが192.168.1.10だとして、上記のコマンドでsshトンネルを作ったのちに、クライアントから "127.0.0.1:3456" に接続した場合のコネクションは下記のようになる。
この場合だと、192.168.1.11でウェブサーバが動いていて、192.168.1.10でブラウザを立ち上げ、アドレスバーへ http://127.0.0.1:3456 とするイメージ。
[127.0.0.1:63611(ランダムポート)]---<コネクション>---[クライアント トンネル入口 127.0.0.1:3456]
[ssh クライアント 192.168.1.10:63588(ランダムポート)]---<コネクション>---[sshサーバ 192.168.1.11:22]
[sshサーバ トンネル出口 192.168.1.11:49999(ランダムポート)]---<コネクション>---[80番で待ってるサーバ 192.168.1.11:80]
実際の動作切り分けやログを考慮する際に。