OpenWrtのFirewall設定を読み解きVLAN含めてセキュアなフィルタ設定を行う


OpenWrtでホワイトリスト型ファイアウォールの構築を実践してみました。Wifi含めてVLANを設定した環境下で、高度なファイアウォール設定をする方法を色々と検証しながら調べた結果を共有させていただきます。構成は以下です。

上記環境の構築は「OpenWRTでVLAN毎に無線LANを設定する方法」参照

OpenWrtのFirewall設定はpfsense等と比べて分かりにくいです。何を設定すればどうなるのかがぱっと見で分かりにくく、「設定した後管理コンソールにつなげられなくなったら面倒」という先入観もあり、二の足を踏んでいました。しかし、以下3点の実績が作れたことから、FireWallの設定を詰めました。

【事前作業】リカバリポイントを事前取得

設定作業に入る前に、OpenWrtの現状の設定をバックアップしておくと、リセットしてしまった場合に元に戻しやすくなるため、システム>バックアップ/フラッシュより、事前に設定をバックアップしておきます。

【事前作業】SSHを繋いでおく

設定をミスったときに、ファイアウォールの設定上、管理コンソールにすらつながらなくなることが懸念されます。しかし、OpenWrtは以下赤字の設定がある為、SSHログイン(SSHセッションさえ張っておけば)さえしておけば、高確率でリカバリ可能です。

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            /* !fw3 */
input_rule  all  --  0.0.0.0/0            0.0.0.0/0            /* !fw3: Custom input rule chain */
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED /* !fw3 */

OpenWrtのゾーン設定とファイアウォール設定

ファイアウォールゾーンと各インターフェース、各VLANの関係性

マニュアルより、「各インターフェース毎に1つのゾーン」、「各VLAN毎に1つのゾーン」となる事を推奨と記載されています。本投稿でもそれに倣います。

今回は、「OpenWRTでVLAN毎に無線LANを設定する方法」で作成した環境に対してファイアウォール設定をしてみます。具体的には、以下画面の様に、VLAN毎にゾーンを設定しています。

各々のゾーンの説明は以下です。

VLAN IDZoneName名前備考
1lan家庭内NW機器、サーバ、iPhone、Android、PC等々。VLAN4の監視カメラを収容する録画サーバもこちらに設置。
2VLAN2仕事用仕事用のPC設置用。在宅勤務等に。他セグメントとは通信できなくて良い
3VLAN3ゲスト用DNS、MAIL(送受信共)、HTTP、HTTPSのみ、インターネットと通信可。他セグメントへは通信不可
4VLAN4監視カメラ用LAN接続タイプの監視カメラは、最悪末端のLANケーブルを抜かれてそれを攻撃者のノートPC等に挿される可能性を考慮して、他のセグメントへは通信不可、インターネット接続不可、録画用サーバへのONVIF通信のみ許可としています。
999wanWANインターネット側(画像の一番上の光終端装置、ないしは、ISP提供の終端装置と接続)
各々のゾーンの説明

ファイアウォール設計方針

作業する前に、ファイアウォールの設計方針を決めておきます。

  • ホワイトリスト方式で通信を許可する
  • LAN⇒WAN、VLAN⇒VLANのデフォルトのルールはReject(タイムアウトまで待たせないようにする)
  • インターネット⇒WANのデフォルトルールはDROP(外部からのアクセスは応答すらしない)
  • ルータからのDNS、NTP、パッケージアップデート(HTTPS)通信は許可する
  • その他方針は、上述した「各々のゾーンの説明」に準ずる

なぜ、ここまで厳しいルールにするかというと、時代の流れとともにIOT機器が家庭内に入り込んできましたが、そのファームウェア開発元は大抵の場合には米国や中国、台湾等の諸外国となります。

製造元に監視カメラ画像を送っていないと思っていたが、実は定期的に送っていたり、solarwinds製品の様に開発元に対して既に攻撃が成功しており、バックドア込みで製品出荷された物を利用してしまっている可能性もあります。ゼロトラストのような大掛かりなことは出来ませんが、最低限、大きな区分(ゾーン/VLAN)ごとに機器を分けて必要最低限のみ通すように設計し、以下を目指します。

  • 異常なパケットはログに記録させ、気付けるようにする
  • 万が一があっても、VLANを超えて被害拡大させないようにする
  • 【将来的に】Proxyを経由してのみアクセスできるようにする(URLの区別とロギング)

設定対象ゾーンで、ログを取るように設定する

IOT機器(Amazon Alexa、Google Home、各種スマートホーム製品)等を利用していると、思いもかけないポートで通信をしていることもあります。今回は、設定後にそれら機器が使えなくなることが無いように、ログが取れるようにしておきます。

ネットワーク>ファイアウォールより、対象ゾーンの編集を押下

詳細設定タブの Enable logging on this zoneにチェックを入れ、その下のLimit log messagesには、10/minutesとでも入れておきます。

VLAN2~4についても、同様に設定し、保存&適用を押下します。

許可ルールを設定していく

OpenWrtの初期状態だと、たいていの箇所はデフォルトでAcceptとなっているため、管理画面含めてインターネットへの通信も通ります。この後、デフォルトでRejectとしていくため以下の流れで設定を進めます。

  1. LAN⇒管理画面(HTTP/HTTPS)、SSH、DNS、NTPアクセスを許可
  2. デフォルトのルールセットをRejectとする(DNSキャッシュ切れ後にネット通信不可になります)
  3. ルータ⇒インターネットでDNS、NTP、パッケージアップデート(HTTP/HTTPS)を許可
  4. LAN⇒インターネット接続を許可
  5. VLAN2~3のインターネット接続を許可
  6. LAN、VLAN2~4間の接続のうち、必要最低限を許可

1.LAN⇒管理画面(HTTP/HTTPS)、SSH、DNS、NTPアクセスを許可

ファイアウォール画面の追加ボタンを押下し、以下のようにルールを追加します。

HTTPSを追加する場合には、以下のように設定します。複数ポートは半角スペース区切りで指定することで、まとめて記載できます。(大破様、ご教示ありがとうございます。)

上記画面同様に、以下を設定します。

名前プロトコルSource ZoneSource Port宛先ゾーンDestination PortAction
Allow-LAN-to-System-TCPTCPlan1024-65535デバイス22 53 80 443accept
Allow-LAN-to-System-UDPUDPlanデバイス53 67 123accept
Allow-LAN-to-System-UDP-RetUDPデバイス53 67 123lanaccept
LAN⇒管理画面(HTTP/HTTPS)、SSH、DHCP、DNS、NTPアクセスを許可

※管理画面へはHTTPSのみで良いと思っていましたが、再起動後にHTTPに対してGUI画面で通信していることをログから発見したので、本投稿の最後の方で追記しました。

上記の表の各々のルールを設定したら、保存&更新を押下します。

LAN⇒管理画面(HTTP/HTTPS)、SSH、DNS、NTPアクセスを許可

ここまでで、iptables上は以下が変更点となります。INPUTチェインにあるzone_lan_inputチェインに飛ばされ、そこに追加したルールが存在することになります。

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            /* !fw3 */
input_rule  all  --  0.0.0.0/0            0.0.0.0/0            /* !fw3: Custom input rule chain */
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED /* !fw3 */
syn_flood  tcp  --  0.0.0.0/0            0.0.0.0/0            tcp flags:0x17/0x02 /* !fw3 */
zone_lan_input  all  --  0.0.0.0/0            0.0.0.0/0            /* !fw3 */
zone_wan_input  all  --  0.0.0.0/0            0.0.0.0/0            /* !fw3 */
zone_VLAN2_input  all  --  0.0.0.0/0            0.0.0.0/0            /* !fw3 */
zone_VLAN3_input  all  --  0.0.0.0/0            0.0.0.0/0            /* !fw3 */
zone_VLAN4_input  all  --  0.0.0.0/0            0.0.0.0/0            /* !fw3 */

#------割愛------#

Chain zone_lan_input (1 references)
target     prot opt source               destination
input_lan_rule  all  --  0.0.0.0/0            0.0.0.0/0            /* !fw3: Custom lan input rule chain */
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp spts:1024:65535 dpt:443 /* !fw3: Allow-System-HTTPS */
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp spts:1024:65535 dpt:22 /* !fw3: Allow-System-SSH */
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:53 /* !fw3: Allow-System-DNS */
ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0            udp dpt:53 /* !fw3: Allow-System-DNS */
ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0            udp dpt:123 /* !fw3: Allow-System-NTP */

#------割愛------#

2.デフォルトのルールセットをRejectとする

ここまで来たら、デフォルトのファイアウォールルールをRejectにします。

一般設定のINPUT、OUTPUT、FORWARDをrejectにし、かつ、lan⇒wanのINPUT、OUTPUT、FORWARDもrejectにして、保存&適用を押下します。

※lan⇒wanのみ対応した理由は、設定ミスを考慮して、VLAN2~4はこの設定が完了したうえで変更するような作業の流れにしたためです。まとめて設定してしまっても問題はありません。

上記設定によるiptables上の変更点は以下(全部で300行以上あるので、変更箇所のみ記載)。iptablesの確認結果は何度も調べるのが面倒なので、掲載しています。読み飛ばしてもらって構いません。

Chain INPUT (policy DROP)
target     prot opt source               destination
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            /* !fw3 */
input_rule  all  --  0.0.0.0/0            0.0.0.0/0            /* !fw3: Custom input rule chain */
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED /* !fw3 */
syn_flood  tcp  --  0.0.0.0/0            0.0.0.0/0            tcp flags:0x17/0x02 /* !fw3 */
zone_lan_input  all  --  0.0.0.0/0            0.0.0.0/0            /* !fw3 */
zone_wan_input  all  --  0.0.0.0/0            0.0.0.0/0            /* !fw3 */
zone_VLAN2_input  all  --  0.0.0.0/0            0.0.0.0/0            /* !fw3 */
zone_VLAN3_input  all  --  0.0.0.0/0            0.0.0.0/0            /* !fw3 */
zone_VLAN4_input  all  --  0.0.0.0/0            0.0.0.0/0            /* !fw3 */
reject     all  --  0.0.0.0/0            0.0.0.0/0            /* !fw3 */

Chain FORWARD (policy DROP)
target     prot opt source               destination
forwarding_rule  all  --  0.0.0.0/0            0.0.0.0/0            /* !fw3: Custom forwarding rule chain */
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED /* !fw3 */
zone_lan_forward  all  --  0.0.0.0/0            0.0.0.0/0            /* !fw3 */
zone_wan_forward  all  --  0.0.0.0/0            0.0.0.0/0            /* !fw3 */
zone_VLAN2_forward  all  --  0.0.0.0/0            0.0.0.0/0            /* !fw3 */
zone_VLAN3_forward  all  --  0.0.0.0/0            0.0.0.0/0            /* !fw3 */
zone_VLAN4_forward  all  --  0.0.0.0/0            0.0.0.0/0            /* !fw3 */
reject     all  --  0.0.0.0/0            0.0.0.0/0            /* !fw3 */

Chain OUTPUT (policy DROP)
target     prot opt source               destination
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            /* !fw3 */
output_rule  all  --  0.0.0.0/0            0.0.0.0/0            /* !fw3: Custom output rule chain */
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED /* !fw3 */
zone_lan_output  all  --  0.0.0.0/0            0.0.0.0/0            /* !fw3 */
zone_wan_output  all  --  0.0.0.0/0            0.0.0.0/0            /* !fw3 */
zone_VLAN2_output  all  --  0.0.0.0/0            0.0.0.0/0            /* !fw3 */
zone_VLAN3_output  all  --  0.0.0.0/0            0.0.0.0/0            /* !fw3 */
zone_VLAN4_output  all  --  0.0.0.0/0            0.0.0.0/0            /* !fw3 */
reject     all  --  0.0.0.0/0            0.0.0.0/0            /* !fw3 */

# Chain reject (5 references)# ・・・・元々
Chain reject (10 references)# ・・・・変更後


Chain zone_lan_dest_ACCEPT (2 references)
target     prot opt source               destination
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            /* !fw3 */

Chain zone_lan_dest_REJECT (2 references)
target     prot opt source               destination
LOG        all  --  0.0.0.0/0            0.0.0.0/0            limit: avg 10/sec burst 5 /* !fw3 */ LOG flags 0 level 4 prefix "REJECT lan out: "
reject     all  --  0.0.0.0/0            0.0.0.0/0            /* !fw3 */

Chain zone_lan_forward (1 references)
target     prot opt source               destination
forwarding_lan_rule  all  --  0.0.0.0/0            0.0.0.0/0            /* !fw3: Custom lan forwarding rule chain */
zone_wan_dest_ACCEPT  all  --  0.0.0.0/0            0.0.0.0/0            /* !fw3: Zone lan to wan forwarding policy */
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            ctstate DNAT /* !fw3: Accept port forwards */
zone_lan_dest_REJECT  all  --  0.0.0.0/0            0.0.0.0/0            /* !fw3 */


Chain zone_lan_input (1 references)
target     prot opt source               destination
input_lan_rule  all  --  0.0.0.0/0            0.0.0.0/0            /* !fw3: Custom lan input rule chain */
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp spts:1024:65535 dpt:443 /* !fw3: Allow-LAN-HTTPS */
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp spts:1024:65535 dpt:22 /* !fw3: Allow-LAN-SSH */
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:53 /* !fw3: Allow-LAN-DNS */
ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0            udp dpt:53 /* !fw3: Allow-LAN-DNS */
ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0            udp dpt:123 /* !fw3: Allow-LAN-NTP */
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            ctstate DNAT /* !fw3: Accept port redirections */
zone_lan_src_REJECT  all  --  0.0.0.0/0            0.0.0.0/0            /* !fw3 */


zone_lan_dest_REJECT  all  --  0.0.0.0/0            0.0.0.0/0            /* !fw3 */

Chain zone_lan_src_REJECT (1 references)
target     prot opt source               destination
LOG        all  --  0.0.0.0/0            0.0.0.0/0            limit: avg 10/sec burst 5 /* !fw3 */ LOG flags 0 level 4 prefix "REJECT lan in: "
reject     all  --  0.0.0.0/0            0.0.0.0/0            /* !fw3 */

VLAN2~4についても、同様に設定します。VLAN2~4はDHCPの更新と、NTP、DNSは通したかったため、その為の制御を入れています。ごくまれにホストがTCP/53でDNSを聞いてくることがある為、TCPについても設定しておきました。

名前プロトコルSource ZoneSource Port宛先ゾーンDestination PortAction
Allow-VLAN2-to-System-TCPTCPVLAN2デバイス53accept
Allow-VLAN2-to-System-UDPUDPVLAN2デバイス53 67 123accept
Allow-VLAN2-to-System-UDP-RetUDPデバイス53 67 123VLAN2accept
VLAN2用のDNS、NTP、DHCPアクセスを許可
名前プロトコルSource ZoneSource Port宛先ゾーンDestination PortAction
Allow-VLAN3-to-System-TCPTCPVLAN3デバイス53accept
Allow-VLAN3-to-System-UDPUDPVLAN3デバイス53 67 123accept
Allow-VLAN3-to-System-UDP-RetUDPデバイス53 67 123VLAN3accept
VLAN3用のDNS、NTP、DHCPアクセスを許可
名前プロトコルSource ZoneSource Port宛先ゾーンDestination PortAction
Allow-VLAN3-to-System-TCPTCPVLAN4デバイス53accept
Allow-VLAN4-to-System-UDPUDPVLAN4デバイス53 67 123accept
Allow-VLAN4-to-System-UDP-RetUDPデバイス53 67 123VLAN4accept
VLAN4用のDNS、NTP、DHCPアクセスを許可

※上記設定をすることで、ホワイトリスト方式のファイアウォール設定になります。この時点ではまだルータ本体⇒インターネットへの通信、特にDNSを許可していないので、DNSのキャッシュが切れ次第、インターネット接続が不可となります。なので、続いて後続の3、4番の作業を実施し、DNSが引けるようにしてください。

3.ルータ⇒インターネットでDNS、NTP、パッケージアップデート(HTTP/HTTPS)を許可

Firewall – Traffic Rulesに以下を設定して、保存&適用します。

名前プロトコルSource ZoneSource Port宛先ゾーンDestination PortAction
Allow-System-to-WAN-TCPTCPデバイス1024-65535wan53 80 443accept
Allow-System-to-WAN-UDPUDPデバイスwan53 123accept
Allow-System-to-WAN-UDP-RetUDPwan53 123デバイスaccept

4.LAN⇒インターネット接続を許可

Firewall – Traffic Rulesに以下を設定して、保存&適用します。SMTP,SMTPS,POP3S,IMAP4Sはよく使われるメールポートを設定しました。必要に応じてカスタマイズしてください。他に追加する必要がありそうなポートは、SSH(22/TCP)や、SMTP(25/TCP<587等に変更になっていることが大半のはず)でしょうか。

名前プロトコルSource ZoneSource Port宛先ゾーンDestination PortAction
Allow-LAN-to-WAN-TCPTCPlan1024-65535wan80 443 465 587 993 995accept

5.VLAN2~3のインターネット接続を許可

LANと同様にVLAN2/VLAN3にも以下をセッティングします。

名前プロトコルSource ZoneSource Port宛先ゾーンDestination PortAction
Allow-VLAN2-to-WAN-TCPTCPlan1024-65535wan80 443 465 587 993 995accept
Allow-VLAN3-to-WAN-TCPTCPlan1024-65535wan80 443 465 587 993 995accept

一通りのファイアウォール設定を作成したら、保存&適用で、反映します。

6.LAN、VLAN2~4間の接続のうち、必要最低限を許可

構成図上、ONVIF対応のネットワークカメラをVLAN4に設置し、LAN上にあるサーバに映像を送ることになっています。その設定をします。

名前プロトコルSource ZoneSource Port宛先ゾーンDestination PortAction
Allow-VLAN4-to-LAN-TCPTCPVLAN4lanONVIFポートaccept

上記プロトコル及びONVIFポートはメーカーによってポート番号が異なるので、適宜変更してください。また、UDPで通信する場合には、戻りの設定を忘れると通信できません。

【仕上げ】VLAN3~4のデフォルトのルールセットをRejectとする

ここまで来たら、「2.デフォルトのルールセットをRejectとする」で、設定しなかったVLAN2~4のデフォルトのファイアウォールルールをRejectにします。

保存&適用を押下します。

その他のチューニング

システム>カーネルログから、ブロックした通信ログが確認できますが、とにかくNetBIOSのログが大量に出て目障りなので、ログを取得せずに拒否する設定にします。

五月蠅いNetBIOS(TCP/UDP 137-138)を止める

明らかに不要な通信は、「Firewall – Traffic Rules」に設定を入れるのも大変なので、「Firewall – Custom Rules」に以下を指定してまとめてブロックしてしまうと楽です。

# This file is interpreted as shell script.
# Put your custom iptables rules here, they will
# be executed with each firewall (re-)start.

# Internal uci firewall chains are flushed and recreated on reload, so
# put custom rules into the root chains e.g. INPUT or FORWARD or into the
# special user chains, e.g. input_wan_rule or postrouting_lan_rule.

iptables -I INPUT -p tcp --dport 137:138 -j DROP
iptables -I INPUT -p udp --dport 137:138 -j DROP
iptables -I FORWARD -p tcp --dport 137:138 -j DROP

過剰ブロックの解消に向けて

上記まででは、必要最低限、よく使われる通信を許可してきました。これだけの場合、過剰にブロックしてしまうことがあります。過剰にブロックしてしまった場合には、ログが出るように設定していますので、ステータス>システムログより、RejectやDROPの表記でGrepし、該当通信が必要な物であれば、ファイアウォールにACCEPTとして登録し、チューニングを行ってください。

また、ファイアウォールのゾーンごとに「詳細設定タブの Enable logging on this zone」を設定することで、デフォルトのルールでブロックした場合にはログが出力されるように設定しています。ICMPでの死活監視等をしているデバイスがあったりすると、それをブロックしていると結構ログが出て邪魔になるので、そういったものは、個別にRejectするルールを設定してチューニングしてください。

なお、LAN内はReject(ブロックしたことを応答するのでタイムアウトを待たない)が好ましいです。反対にインターネットからはDROPが望ましい(攻撃者に対してはブロックしたことすら応答する必要はない)です。

トラブルシューティング

設定にあたって、トラブルシューティングのノウハウがたまりました。特に、TCPのようなステートフルなプロトコル以外は、戻りについても「Firewall – Traffic Rules」で指定する必要があります。それを指定しそびれてIPが割り当てられないや、DNSが引けない等の問題が出た記憶があります。

Noトラブル内容解決策
1ファイアウォール設定前までは出来ていたが、DHCPでアドレスが割り当てられないUDPの通信は行きと戻りの両方を「Firewall – Traffic Rules」で指定する必要があります。両方とも存在するか確認してください。
2ファイアウォール設定前までは出来ていたが、ウェブサイトが見れないDNSの53の行き来両方を「Firewall – Traffic Rules」で指定しているか確認してください。
3システムログに拒否された通信ログが大量に出力されて邪魔「2.デフォルトのルールセットをRejectとする」で設定した設定を戻すか、該当パケットを削除するルールを「Firewall – Traffic Rules」に指定するとログを減らせると思います。
4よくわからないが管理コンソールに接続できず、リセットしたい万が一の時はリセットボタンを使ってください

参考URL

最後に

OpenWrtのファイアウォール設定は、GUIと実際に生成されるiptablesの間でどのように反映されるのか、当初、全くピンときませんでした。特に「Firewall – Zone Settings」でチェックボックスを入れて設定する箇所やログの取り方、ACKの扱い(Related/Established)の指定方法あたりは、設定>iptables -L -n>前後のDIFF比較で手探りで進めました。

その際に改善して欲しいGUIの設定項目もありました(以下、私の調査不足でした。大破様より利用できる旨ご教示いただきました。ありがとうございました。)。

  • 「Firewall – Traffic Rules」で、並びを変更できるようにしてほしい<GUIから指定可能でした。三本線のアイコンで上下させて保存すればOKでした。
  • 「Firewall – Traffic Rules」で、ポートをリスト指定されて欲しい80,443等まとめて指定できれば、ルールも簡略化でき、パフォーマンスもほんの少し上がるはず。<こちらも、半角スペース区切りで指定可能でした。

なお、実際に生成されるルールで問題なく動くことは確認していますが、もし勘違い等で間違った情報を記載していたら、コメント欄よりご指摘いただけると幸甚です。

タグ , , . ブックマークする パーマリンク.

OpenWrtのFirewall設定を読み解きVLAN含めてセキュアなフィルタ設定を行う への2件のフィードバック

  1. 大破 の発言:

    こんにちは。
    GUI (LuCI) でのTraffic Rulesなどの設定は、横向き三本線のボタンをドラッグすることにより並べ替えが可能です。また、スペースで区切ることにより単一ルール内で複数ポートの設定が可能です。

    • lasas の発言:

      ご教示ありがとうございます。教えて頂いた通りの操作で設定出来ました。現状、ルールが多数存在していて読みにくかったので、教えて頂いた事で大幅にスリムアップでき、非常に助かりました。投稿内容も修正させていただきます。

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください