ASAでNATしてサーバを公開する設定
掲題の設定に関するCisco ASA(いわゆる8.3以降)の情報が、なぜかあまりまとまったものが無かったので、メモ。
テストに利用する構成は下記で、要点は192.168.1.101のWebサーバを、10.0.0.2で外からアクセスできるようにするというもの。ここでは172.16.1.101のホストからアクセス可能なようにする。それ以外の通信はここでは考えていない
むりやり読み替えると、現実のインターネットには無いが、このテスト環境は10.0.0.0/24のグローバルアドレス空間を持っているということもできる。
ASAの設定をしていく。
まずインタフェースとデフォルトルートを設定。
interface GigabitEthernet0nameif outside
security-level 0
ip address 10.0.0.1 255.255.255.0
!
interface GigabitEthernet1
nameif dmz
security-level 50
ip address 192.168.1.254 255.255.255.0
!
route outside 0.0.0.0 0.0.0.0 10.0.0.254 1
ASAでnameifコマンドは必須。outsideやdmzといった名前は勝手にデフォルトでセキュリティレベルが設定される。ここでは、dmzを50として、outsideよりセキュア?信頼できる?(設定数値が小さい)状態としている。
ciscoasa(config-if)# nameif outsideINFO: Security level for "outside" set to 0 by default.
ciscoasa(config-if)# nameif dmz
INFO: Security level for "dmz" set to 0 by default.
オブジェクトを設定する。ASAに限らずFWは、オブジェクトやオブジェクトグループで設定する考え方したほうが良い。
object network ip-192.168.1.101host 192.168.1.101
object network ip-10.0.0.2
host 10.0.0.2
object service src-http
service tcp source eq 80
そして、NATの設定を入れる。ASA8.3以降は、Twice NAT (別名:Manual NAT)と Network Object NAT (別名:Auto NAT) という2方式の設定があって、普段Auto NATをあまり使ったことが無いのでここではManualでやっている。NATタイプなどはCiscoの資料などを参照すると良いと思います。
カッコとか文字にあるし、わりと悟りが必要なタイプの設定だと感じるが、基本[実IP][変換後IP]の順序で各項目を記載する。
nat (dmz,outside) source static ip-192.168.1.101 ip-10.0.0.2 service src-http src-httpここでとても大切なことがあって、このNATの設定を入れると、ASAは10.0.0.2のARPに応答する。外部から見て10.0.0.2の着信がASAの10.0.0.1のインタフェースに対して可能となる。
隣接ルータから見たarpテーブル。
R1#show ip arpProtocol Address Age (min) Hardware Addr Type Interface
Internet 10.0.0.2 4 0000.ab12.1212 ARPA FastEthernet0/0
Internet 10.0.0.1 0 0000.ab12.1212 ARPA FastEthernet0/0
この段階ではまだアクセスはできない。外側のセキュリティの低いインタフェース側の着信方向に、実IPへの許可ACLを設定する必要がある。
access-list hoge extended permit tcp host 172.16.1.101 host 192.168.1.101 eq 80access-group hoge in interface outside
以上。
Arduinoで逃げるプラレール
Arduino nano 3.0互換ボードATMEGA 328 Pを介して、IR赤外線障害物回避センサLM393で物体を検知していなければモータを回し、検知するとモータを止める(モータードライバはTA7291Pを利用)。上記の他に準備したものは、電池ボックス(単三×2)とタミヤのギヤボックスセット。という前回の記事のものを利用して、衝突回避プラレールのプロトタイプをする
と思いきやほとんど同じことをより高いレベルで実現している方がいらしたので、普通は下記参照したほうが良いでしょう。
www.mita.nu今回作ったものは、床で走らせたら前方の物体から逃げてるように見えた
www.youtube.com
スケッチや接続は下記のとおり。
/*モータドライバ接続 *https://fabkura.gitbooks.io/arduino-docs/content/chapter17.html * モータドライバ#10 OUT2 --- モータ(+) * モータドライバ#9 使用無し --- 無し * モータドライバ#8 出力側電源 --- 電源(+) * モータドライバ#7 電源+ --- 電源5V=PIN5V * モータドライバ#6 IN2(信号2) --- digital#2=PIN2 * モータドライバ#5 IN1(信号1) --- digital#4=PIN4 * モータドライバ#4 制御電源(速度) --- digital$3(PWM)=PIN3 * モータドライバ#3 使用無し --- 無し * モータドライバ#2 OUT1 --- モータ(-) * モータドライバ#1 GND --- GND * * *電源(-) --- GND */ /*モータの動作参考 * https://www.petitmonte.com/robot/motor_driver_ta7291p.html */ /*赤外線センサ接続 * OUT --- digital#12=PIN12 * GND --- GND * VCC --- 電源5V=PIN5V * センサはデジタルで通常"1"を返し、検知時に0を返す */ //for Infrared sensor int val = 0; void setup() { pinMode(2,OUTPUT); //IN2 pinMode(4,OUTPUT); //IN1 pinMode(12,INPUT); //infrared sensor Serial.begin(9600); } void loop() { //モーターの回転速度を設定 analogWrite(3,255); val = digitalRead(12); //センサの読み取り if (val==1) { //センサが何も検出していない //回転 // Serial.println(val); //シリアルモニタにセンサの状態を出す用 digitalWrite(4,HIGH); digitalWrite(2,LOW); delay(100); } else { //センサが検出した //ブレーキ // Serial.println(val); //シリアルモニタにセンサの状態を出す用 digitalWrite(4,HIGH); digitalWrite(2,HIGH); delay(100); // 逆回転 analogWrite(3,255); digitalWrite(4,LOW); digitalWrite(2,HIGH); delay(2000); //ブレーキとストップの違い //ブレーキはモータの軸を回すと抵抗力を感じます //ストップは軸をまわすと抵抗無く回ります とのこと } }
Arduino nanoとモータドライバTA7291PとIR赤外線障害物回避センサLM393
Arduino nano 3.0互換ボードATMEGA 328 Pを介して、IR赤外線障害物回避センサLM393で物体を検知していなければモータを回し、検知するとモータを止める。上記の他に準備したものは、電池ボックス(単三×2)とタミヤのギヤボックスセット
今回つかっているこのIRセンサは、検知距離の調節までは厳しかった。本体のメータを調節しても、数センチの距離で検知しているか、していないか程度が測定可能(ただし安い。Amazonでも5個550円だった)
物理的な接続とスケッチは下記のとおり。参考サイトも下記の中に記載。検出状態をシリアルモニタに出力させながら実施しているので、コンソール(USBケーブル)はPCにつないだままで実行している。
/*モータドライバ接続 *https://fabkura.gitbooks.io/arduino-docs/content/chapter17.html * モータドライバ#10 OUT2 --- モータ(+) * モータドライバ#9 使用無し --- 無し * モータドライバ#8 出力側電源 --- 電池ボックス(+) * モータドライバ#7 電源+ --- 電源5V=PIN5V * モータドライバ#6 IN2(信号2) --- digital#2=PIN2 * モータドライバ#5 IN1(信号1) --- digital#4=PIN4 * モータドライバ#4 制御電源(速度) --- digital#3(PWM)=PIN3 * モータドライバ#3 使用無し --- 無し * モータドライバ#2 OUT1 --- モータ(-) * モータドライバ#1 GND --- GND * * *電池ボックス(-) --- GND */ /*モータの動作参考 * https://www.petitmonte.com/robot/motor_driver_ta7291p.html */ /*赤外線センサ接続 * OUT --- digital#12=PIN12 * GND --- GND * VCC --- 電源5V=PIN5V * センサはデジタルで通常"1"を返し、検知時に0を返す */ int val = 0; //for Infrared sensor void setup() { pinMode(2,OUTPUT); //IN2 pinMode(4,OUTPUT); //IN1 pinMode(12,INPUT); //infrared sensor Serial.begin(9600); } void loop() { analogWrite(3,255); //モーターの回転速度を設定。最大にしている val = digitalRead(12); //赤外線センサの読み取り用 if (val==1) { //センサが何も検出していない //モータを回転 Serial.println(val); //シリアルモニタにセンサの状態を出す用 digitalWrite(4,HIGH); digitalWrite(2,LOW); delay(1000); } else { //センサが検出した条件 //ブレーキ Serial.println(val); //シリアルモニタにセンサの状態を出す用 digitalWrite(4,HIGH); digitalWrite(2,HIGH); delay(1000); } }