$ aws sts get-caller-identity
を実行すると次の情報が表示される
・UserId
・Account
・Arn
pp select anonymous no ppp ccp type none ppp ccp type mppe-any]]>
最終的にはPPPoEパススルーも設定し、
クライアント配下のN.Wからもダイアルアップしたい。
コード中の変数は次の通り。
使用する際は適宜変更してください。
【ユーザ1】
アカウント:user1@example.local
パスワード:user1
固定IP:20.0.0.10
【ユーザ2】
アカウント:user2@example.local
パスワード:user2
固定IP:20.0.0.20
【ユーザ3】
アカウント:user3@example.local
パスワード:user3
固定IP:20.0.0.30
【ユーザ4】
アカウント:user4@example.local
パスワード:user4
固定IP:20.0.0.40
!! ! AAAの設定 !! aaa new-model aaa authentication ppp PPP local aaa authorization network default local ! aaa attribute list USER1_LIST attribute type addr 20.0.0.10 service ppp protocol ip exit aaa attribute list USER2_LIST attribute type addr 20.0.0.20 service ppp protocol ip exit aaa attribute list USER3_LIST attribute type addr 20.0.0.30 service ppp protocol ip exit aaa attribute list USER4_LIST attribute type addr 20.0.0.40 service ppp protocol ip exit ! username user1@example.local password 0 user1 username user1@example.local aaa attribute list USER1_LIST username user2@example.local password 0 user2 username user2@example.local aaa attribute list USER2_LIST username user3@example.local password 0 user3 username user3@example.local aaa attribute list USER3_LIST username user4@example.local password 0 user4 username user4@example.local aaa attribute list USER4_LIST !! ! PPPoEサーバの設定 !! interface Virtual-Template9 ip address 20.0.0.254 255.255.255.0 ppp authentication chap PPP exit ! bba-group pppoe group-9 virtual-template 9 exit ! interface Vlan9 pppoe enable group group-9 exit ! interface GigabitEthernet0/0 switchport access vlan 9 exit interface GigabitEthernet0/1 switchport access vlan 9 exit interface GigabitEthernet0/2 switchport access vlan 9 exit interface GigabitEthernet0/3 switchport access vlan 9 exit]]>
今回使用したSwitchBotはこちら。
指紋認証でアンロックができるので便利なのではあるが、
家に近づくだけで自動的にアンロックさせたかった。
(両手に荷物を持っている時に便利)
【ロック状態を確認する】
TaskerからPHPへはPOSTでtoken,secret,deviceIDを送信する。
deviceIDはここから調べることが出来る。
$token = isset($_POST['token']) ? htmlspecialchars($_POST['token'], ENT_QUOTES, 'UTF-8') : ""; $secret = isset($_POST['secret']) ? htmlspecialchars($_POST['secret'], ENT_QUOTES, 'UTF-8') : ""; $deviceId = isset($_POST['deviceId']) ? htmlspecialchars($_POST['deviceId'], ENT_QUOTES, 'UTF-8') : ""; $time = (string)floor( microtime(true) * 1000 ); $nonce = "xyzzy"; $sha256 = hash_hmac( 'sha256', "{$token}{$time}{$nonce}", $secret, true); $header = []; $header[] = "Authorization:{$token}"; $header[] = "t:{$time}"; $header[] = "sign:".base64_encode($sha256); $header[] = "nonce:{$nonce}"; $header[] = "Content-Type:application/json"; $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, "https://api.switch-bot.com/v1.1/devices/{$deviceId}/status"); curl_setopt($curl, CURLOPT_POST, 'true'); curl_setopt($curl, CURLOPT_HEADER, 'true'); curl_setopt($curl, CURLINFO_HEADER_OUT, 'true'); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 'true'); curl_setopt($curl, CURLOPT_HTTPHEADER, $header); header("Content-Type: application/json; charset=utf-8"); echo curl_exec( $curl );
【施錠を操作する】
TaskerからPHPへはPOSTでtoken,secret,deviceID,cmdを送信する。
cmdは”lock”もしくは”unlock”
deviceIDはここから調べることが出来る。
$token = isset($_POST['token']) ? htmlspecialchars($_POST['token'], ENT_QUOTES, 'UTF-8') : ""; $secret = isset($_POST['secret']) ? htmlspecialchars($_POST['secret'], ENT_QUOTES, 'UTF-8') : ""; $deviceId = isset($_POST['deviceId']) ? htmlspecialchars($_POST['deviceId'], ENT_QUOTES, 'UTF-8') : ""; $cmd = isset($_POST['cmd']) ? htmlspecialchars($_POST['cmd'], ENT_QUOTES, 'UTF-8') : ""; $time = (string)floor( microtime(true) * 1000 ); $nonce = "xyzzy"; $sha256 = hash_hmac( 'sha256', "{$token}{$time}{$nonce}", $secret, true); $header = []; $header[] = "Authorization:{$token}"; $header[] = "t:{$time}"; $header[] = "sign:".base64_encode($sha256); $header[] = "nonce:{$nonce}"; $header[] = "Content-Type:application/json"; $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, "https://api.switch-bot.com/v1.1/devices/{$deviceId}/commands"); curl_setopt($curl, CURLOPT_POST, 'true'); curl_setopt($curl, CURLOPT_POSTFIELDS, '{"command": "'.$cmd.'","parameter": "default","commandType": "command"}'); curl_setopt($curl, CURLOPT_HEADER, 'true'); curl_setopt($curl, CURLINFO_HEADER_OUT, 'true'); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 'true'); curl_setopt($curl, CURLOPT_HTTPHEADER, $header); header("Content-Type: application/json; charset=utf-8"); echo curl_exec( $curl );]]>
$tokenと$secretはSwitchbotのアプリを開いて
プロフィール > 設定 > 開発者向けオプションで確認可能。
なお、開発者向けオプションが非表示の場合は、アプリバージョンを10回ほど連打すると表示される。
$timeは13桁のタイムスタンプ。
$nonceは任意の文字列。
$sign = base64_encode( hash_hmac('sha256' ,$token . $time . $nonce ,$secret ,true ) );
ちなみに、サクッとデバイス一覧が欲しい場合はこちらから取得可能。
]]>
実際にそのようなコマンドが存在するのか確認しようと思いましたが、
そもそもこのSlingboxは外部と接続する必要がないので遮断してみました。
VPNで接続するため内部通信は可能です。
===説明追記ここから===
コンフィグを流すルータはciscoのC841M-4X-JSEC/K9。
Slingboxが繋がっているネットワークは192.168.82.254/24。
SlingboxのIPは192.168.82.148で固定する。
別拠点のネットワークからもアクセスしたいので192.168.0.0/16で許可している。
家庭用ルータの一例を別記事に記載しました。
【(家庭用ルータで)Slingboxを外部ネットワークから遮断する】
===説明追記ここまで===
ip dhcp pool SlingBox host 192.168.82.148 255.255.255.0 client-identifier 0100.0dc5.MACA.DD client-name SlingBox default-router 192.168.82.254 dns-server 192.168.82.254 lease infinite ! ip access-list extended Vlan82_Out permit ip 192.168.0.0 0.0.255.255 host 192.168.82.148 deny ip any host 192.168.82.148 permit ip any any !
これでうまくいくと良いな
もしポート開放で接続に成功している人がおられましたら
そのポート以外を遮断してみては如何でしょうか?
今回の環境ではWAN回線とそれに伴うN.Wが2つ存在しています。
192.168.28.0/24 (IPoE)
192.168.29.0/24 (PPPoE)
基本的に各端末は28のN.Wに属しています。
IPoEはIPv4アドレスを共有しているので希望するポートを開けられません。
ですので外部からのアクセスはPPPoEから入ってくるように構築しています。
PPPoEでダイアルアップしている端末はciscoのC841M。
VLANで192.168.28.253を設定し28のN.Wに属しています。
この時のデフォルトゲートウェイは192.168.28.254
WOLで起こしたい端末は、192.168.28.105とします。
この環境で起こっていた現象は次の通り。
・LANからWOLは成功
・VPNで外部からWOLは成功
・105をシャットダウンしてしばらくはWANからのWOLも成功
3番目の症状からルータがARP情報をクリアしてしまうのが原因と推測し
ルータにARP情報を教えてあげました。
登録する情報は次の通り
IPアドレス:192.168.28.105
MACアドレス:AB-CD-EF-12-34-56
arp 192.168.28.105 ABCD.EF12.3456 ARPA
前から残っていたコンフィグ
interface Vlan28 ip directed-broadcast 101 ! interface Dialer1 ip directed-broadcast 101 ! ip nat inside source static udp 192.168.28.105 9 interface Dialer1 9 access-list 101 permit udp any any eq 9]]>
# do sh hosts | include hoge hoge.com None (temp, OK) 0 IP XXX.XXX.XXX.XXX
こうなってしまうとip host HOGE~を打ち込んでもpermになってくれません。
なので一時エントリーをクリアします。
# do clear host HOGE
このあとip hostでアドレスを登録します
# ip host HOGE 192.168.0.0
これでshow hostsした時にpermになっているのが確認できると思います。
]]>RT1
ospf use on ospf router id 192.168.141.254 ospf area backbone ip vlan1 ospf area backbone passive tunnel select 10 ip tunnel ospf area backbone cost=10 ip tunnel address 10.14.15.9/30 ospf configure refresh
RT2
ospf use on ospf router id 192.168.151.254 ospf area backbone ip vlan1 ospf area backbone passivetunnel select 10 ip tunnel ospf area backbone cost=10 ip tunnel address 10.14.15.10/30 ospf configure refresh
この状態で show status ospf interfaceしてもVLAN1しか表示されなかった。
もちろんトンネルは繋がっており、pingも通る。
どうやらtunnelを張る際にremote addressも明記する必要があるらしい。
RT1
ospf use on ospf router id 192.168.141.254 ospf area backbone ip vlan1 ospf area backbone passive tunnel select 10 ip tunnel ospf area backbone cost=10 ip tunnel address 10.14.15.9/30 /* ↓この1行を追加 */ ip tunnel remote address 10.14.15.10 ospf configure refresh
RT2
ospf use on ospf router id 192.168.151.254 ospf area backbone ip vlan1 ospf area backbone passivetunnel select 10 ip tunnel ospf area backbone cost=10 ip tunnel address 10.14.15.10/30 /* ↓この1行を追加 */ ip tunnel remote address 10.14.15.9 ospf configure refresh]]>
シスコで言うこういうやつ
C841M(config)#
これがないと間違った端末にコンフィグ流してしまう可能性があるのよね。
(実際昨日の半日棒に振った…)
RTXでは
console prompt HOGE
で、実装できます。
ただし、各モードとくっついてしまいます。
例えば、トンネルモードの時に登録すると
tunnel1# console prompt hoge hogetunnel1#
区切りがありません。
アンダーバーなどを4文字目に使うと見やすいかも知れません。