ネットワーク関連の基本
なぜか家族チームで Micro Hardening のイベントに参加予定なので、ネットワーク関連の基礎の説明を家族向けにまとめる。以下の説明は基本的に、Linux 環境に login してのお話。
ネットワークの確認(ifconfig)
接続しているネットワークの状態を確認するには、ifconfig を使う。(Linuxの場合)
Windows であれば、cmd.exe を起動して、ipconfig を使う。
((( Linux の場合 )))
$ ifconfig -a
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.11.2 netmask 255.255.255.0 broadcast 192.168.11.255
:
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
:
$ ifconfig eth0 # 特定のインタフェースだけ確認
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.11.2 netmask 255.255.255.0 broadcast 192.168.11.255
:
$ ip link # 新しい Linux 系では、ifconfig が無い場合もある。
# ip link がその代用
((( Windows の場合 )))
C:> ipconfig /all # Linux の ifconfig -a と同じ
上記のコンピュータでは、IPアドレス(例:192.168.11.2)とサブネットマスクの値(255.255.255.0)が設定されている。IPアドレス AND サブネットマスクの値はネットワーク番号と呼ばれ、192.168.11.0 が同じであれば、同じサブネット内と判断できる。サブネットマスクは、上位bitの1の数で表現することもあり、192.168.11.2/24 という書き方もある。
こういったIPアドレスは、各コンピュータに対してあらかじめ決めた値を設定しておく方法(静的アドレス)と、IPアドレスを管理しているサーバにアドレスを一時的に貸し出してもらう方法(動的アドレス)があり、後者のアドレスを貸し出すサーバは、DHCPサーバと呼ばれる。(DHCPでは、アドレス貸し出しを頼んできた端末に、IPアドレス,サブネットマスク,ゲートウェイ,DNSサーバを通知してくれる。後述)
周囲のコンピュータの確認(arp/ping)
基本、インターネットでは IP アドレスで通信相手を判断するが、同じサブネット内では、各コンピュータに割り振られているMACアドレスでコンピュータを識別している。
arp
このため、同じサブネット内では、IPアドレスとMACアドレスの対照表が必要となってくる。この対照表の情報を交換するためのプロトコルが ARP であり、この対照表を確認・操作する命令が arp コマンド。
$ arp -an # -a で全ての一覧を表示、-n でホスト名を調べない
? (192.168.11.24) at <不完全> on eth0
? (192.168.11.13) at 62:84:bd:28:xx:xx [ether] on eth0
? (192.168.11.36) at b8:27:eb:ee:xx:xx [ether] on eth0
:
$ ip neigh # 新しい Linux 系では arp コマンドがない場合もある。
# ip neigh が替わりになる。
ただし、コンピュータが「このMACアドレスは私のIPアドレスですよ」とアナウンスした結果を一定時間覚えているだけなので、かならずそのコンピュータが生きているかは別の話。サブネットの中で、偽のARPを流すことで他のコンピュータ宛のパケットを盗むことも可能(ARPスプーフィング)である。このため、セキュリティ対策としてMACアドレスとIPアドレスの対応(arp)を監視も重要となる。
ping
ping は、潜水艦のソナー音をイメージするコマンドで、ICMPプロトコルのパケットを、指定した IP アドレスor ホスト名に送って、返答の有無や応答時間を表示する。ping では通常、相手に連続してパケットを送る。ネットワークが不安定な場合には、パケットが相手に届かない場合もあるので、パケット欠落があると icmp_sec= の番号が不連続になる。
$ ping 192.168.11.2 PING 192.168.11.2 (192.168.11.2) 56(84) bytes of data. 64 bytes from 192.168.11.2: icmp_seq=1 ttl=64 time=0.054 ms ^C $ ping www.google.com PING www.google.com (172.217.161.228) 56(84) bytes of data. 64 bytes from kix06s05-in-f4.1e100.net (172.217.161.228): icmp_seq=1 ttl=54 time=5.62 ms 64 bytes from kix06s05-in-f4.1e100.net (172.217.161.228): icmp_seq=2 ttl=54 time=5.89 ms 64 bytes from kix06s05-in-f4.1e100.net (172.217.161.228): icmp_seq=3 ttl=54 time=5.93 ms ^C
ただし ping は、特殊な ICMP パケットを送ることで相手コンピュータを攻撃できた事例もあり、返答を返さないシステムもある。
ブロードキャストパケット(ping -b)
IPアドレスで、サブネットマスクとANDをとったネットワーク番号の残りの部分は、ホスト番号と呼ばれる。(例:192.168.11.2/24 であれば、2 の部分) IPアドレスでホスト番号の全bitが1のアドレス(この場合は、192.168.11.255)は、ブロードキャストアドレスと呼ばれ、同じサブネット内の全部のコンピュータにデータを送るときに使う。
((( pingでブロードキャストする場合は、-b オプションが必要 ))) $ ping -b 192.168.11.255 WARNING: pinging broadcast address PING 192.168.11.255 (192.168.11.255) 56(84) bytes of data. 64 bytes from 192.168.11.19: icmp_seq=1 ttl=64 time=70.5 ms 64 bytes from 192.168.11.18: icmp_seq=1 ttl=64 time=70.8 ms (DUP!)
ルーティング
インターネットでは、コンピュータに固有のIPアドレスを割り振り、サブネットを越えて通信ができる。(インターネットプロトコルIP)
基本的に、通信相手のIPアドレス AND サブネットマスク で求まるネットワーク番号が異なれば、サブネットが異なるので直接通信ができない。この場合は、ルータにパケットの中継を依頼することになる。ルータはゲートウェイとも呼ばれる。
ルータは、複数のサブネットを中継する装置であり、どのネットワーク番号ならばどのルータに送る(ルーティングと呼ぶ)というテーブルを持っている。一般的に、下流の末端のネットワークでは、どのネットワークならこの装置、それ以外はこの装置に送る…といった一覧表を持っている。(静的ルーティング)
一方、様々な末端からのデータが集まる上流のルータでは、末端ネットワークの構成が変化することも多いので、RIPというプロトコルで、ルータが相互にルーティング情報を交換している。(動的ルーティング)
ルーティングの確認(netstat -r)
ルーティングの情報を調べるには、netstat -r コマンドを用いる。
$ netstat -rn # -r ルーティング情報 -n ホスト名を調べない カーネルIP経路テーブル 受信先サイト ゲートウェイ ネットマスク フラグ MSS Window irtt インタフェース 0.0.0.0 192.168.11.1 0.0.0.0 UG 0 0 0 eth0 192.168.11.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 $ ip route # 新しい Linux 系では、ip route を使う
この例では、192.168.11.0/255.255.255.0 というサブネットでは直接通信ができ(ゲートウェイが0.0.0.0)、それ以外のパケット(受信先サイトが0.0.0.0)は 192.168.11.1 のルータに送ることになっている。(デフォルトゲートウェイ)
ルートの確認 traceroute
どういった経路で相手コンピュータまでデータが届いているのかを確認するには、traceroute コマンドを用いる。
traceroute コマンドは、ルーティングを調べながら、各ルータに ping を送った結果を表示する。
((( Linux の場合 ))) $ traceroute www.fukui-nct.ac.jp traceroute to www.fukui-nct.ac.jp (104.215.53.205), 30 hops max, 60 byte packets 1 xxxx.xxxx.xxxx (192.168.xx.1) 0.299 ms 0.251 ms 0.354 ms 2 yyyy.yyyy.yyyy (192.168.yy.254) 0.790 ms 1.976 ms 1.343 ms 3 ttn103-198-212-1.ttn.ne.jp (103.198.212.1) 4.304 ms 5.127 ms 4.343 ms 4 ftth-sw1-po-11.ntwk.ttn.ne.jp (202.127.81.33) 3.742 ms 5.580 ms 4.296 ms 5 core-sw2-la-2.ntwk.ttn.ne.jp (202.127.81.29) 5.477 ms 4.692 ms 4.655 ms 6 bbr2-2-4.ntwk.ttn.ne.jp (202.127.81.17) 4.895 ms 2.025 ms 1.904 ms 7 103.246.232.116 (103.246.232.116) 6.707 ms 5.499 ms 6.583 ms ((( Windows の場合 ))) C:> tracert www.fukui-nct.ac.jp # Windowsではコマンド名が違うので注意
DNSによる名前解決
ここまでの話の中で、IPアドレスは、192.168.11.123 といった値であったが、極めて覚えにくい。このために、コンピュータそれぞれに名前をつけることができる。これをホスト名という。ホスト名も組織化されていると、組織を区別する名前が必要でドメイン名と呼ぶ。ホスト名とドメイン名の全体を単純にホスト名とかコンピュータ名と呼ぶことも多いが、正式には、FQDN と呼ぶ。
FQDN = www.fukui-nct.ac.jp (コンピュータ名とかドメイン名と呼ぶことも多い)
ホスト名 = www
ドメイン名 = fukui-nct.ac.jp
コンピュータ名とIPアドレスの情報を管理するのが、DNS(Domain Name Service) であり、下流の DNS の情報を調べながら 上流の DNS と組み合わされて管理されている。
nslookup or dig
この DNS に問い合わせを行うのが nslookup コマンドや dig コマンドである。コンピュータ名からIPアドレスを調べるには、一般的には nslookup コマンドを用いる。(正引き)
$ nslookup www.fukui-nct.ac.jp Server: 192.168.11.xxx Address: 192.168.11.xxx#53 Non-authoritative answer: Name: www.fukui-nct.ac.jp Address: 104.215.53.205 $ dig www.fukui-nct.ac.jp # もっと詳しい情報を調べる場合はdigを使う
利用者が多いサービスでは、1台のコンピュータで処理するのは大変なので、負荷分散を行うために、同じサービスを提供するコンピュータを何台も並べ、コンピュータ名を調べる度に、その複数のコンピュータのIPアドレスを返す場合もある。(ラウンドロビンDNS)
逆引き
迷惑メールを大量に送ってくるとか、クラッキングをしてくるようなコンピュータの中には、きちんと管理されていない怪しいネットワーク組織からの接続の場合がある。こういう場合には、IPアドレスに対して名前が割り振られていない場合も多い。また、攻撃の踏み台に使われている場合、どういった組織のコンピュータが悪用されているのか調べる必要がある。こういう場合には、IPアドレスからコンピュータ名を調べることも多い。(逆引き)
$ nslookup 192.156.146.100 100.146.156.192.in-addr.arpa name = sv1.ip.fukui-nct.ac.jp. $ dig -x 192.156.146.100 # dig で逆引きするときは、-x オプションが必要
逆引きでホスト名が調べられないとか、逆引きしたホスト名で再びIPアドレスを調べるとホスト名が異なる場合は、IPアドレスとドメイン名の管理が怪しい危険なコンピュータの可能性がある。場合によっては、DNSサーバが汚染されていて、コンピュータ名でアクセスしたら悪意のあるサーバに接続される危険性もある。(DNSポイズニング)
パブリック DNS
末端組織のDNSの場合、IPアドレスは組織内でしか使えないプライベートアドレス(例:10.xx.xx.xx , 192.168.xx.xx)の場合、組織内専用の DNS が動いていることが多い。この場合、組織内の DNS と組織外の DNS では、異なる情報が得られる場合もある。
こういう場合は、DNS に問い合わせをする場合に、外部の DNS を指定する。特に、Google パプリック DNS は、DNSサーバのIPアドレスが 8.8.8.8 という覚えやすい値が使われている。
$ nslookup 192.156.146.100 8.8.8.8 100.146.156.192.in-addr.arpa name = sv1.ip.fukui-nct.ac.jp. $ dig @8.8.8.8 192.156.146.100 # dig でDNSサーバを指定するときは、@の後ろで指定
DNS の特殊な情報
DNS には、IPアドレスとホスト名以外にも、様々な情報が登録されている。この情報を調べるには、タイプを指定する。(-query=タイプ のオプションをつける)
$ nslookup -query=a www.google.com 8.8.8.8 # IPv4 アドレスを調べる Name: www.google.com Address: 216.58.199.228 $ nslookup -query=aaaa www.google.com 8.8.8.8 # IPv6アドレスを調べる Name: www.google.com Address: 2404:6800:400a:80c::2004 $ nslookup -query=mx fukui-nct.ac.jp 8.8.8.8 # メールを送るサーバを調べる fukui-nct.ac.jp mail exchanger = 10 ews.ip.fukui-nct.ac.jp. $ nslookup -query=txt tsaitoh.net 8.8.8.8 # その他のTXT情報を調べる tsaitoh.net text = "v=spf1 +ip4:xx.xx.xx.xx..." # この例では、メールサーバの検証方法 SPF の情報が見れた。
DMARCレポートを出力
DMARCの設定をして、なりすましなどのレポートをメールで送る設定をしたけど、xmlファイルはzip圧縮でメール添付だし、xml ファイルも内容が読みづらい。
dmarc-catを使ってみる
“aptitude search dmarc”を実行すると、dmarc-cat というソフトが見つかり、”sudo aptitude install dmarc-cat” インストールして使ってみる。
dmarc-cat 0.9.2/j4 by Ollivier Robert Reporting by: google.com — noreply-dmarc-support@google.com From 2020-02-12 09:00:00 +0900 JST to 2020-02-13 08:59:59 +0900 JST Domain: tsaitoh.net Policy: p=quarantine; dkim=r; spf=r Reports(1): IP Count From RFrom RDKIM RSPF xxxxx-xx-x-x.xxx.ne.jp. 1 xxxxxxx.xxx xxxxxxx.xxx pass pass
これなら、なんとなく読みやすい。でも、どちらにしろ、添付ファイルのzip抽出、zip解凍、dmarc-cat の実行、んで、これらの内容を最終的にメールで読みたい。
メールを dmarc-cat で変換してレポート
ということで、その一連の処理を、procmail から実行させるための perl script をチロっと書いてみた。
#!/usr/bin/perl
# DMARC のレポートメールを dmarc-cat で文字情報にして送信しなおす
#
# .procmailrc に以下を記載
# | dmarc-report-mail.pl メールアドレス
my $mailto = $ARGV[0] ; # 送りなおすメールアドレス
# 添付ファイルを抽出するディレクトリ
my $tmpdir = "/tmp/dmarc-report-$USER-$$" ;
if ( mkdir( $tmpdir ) ) {
# 標準入力のメールから添付ファイルを抽出
system( "/usr/bin/munpack -q -C $tmpdir > /dev/null 2>&1" ) ;
if ( opendir( my $dh , $tmpdir ) ) {
# 保存された全ての添付ファイルの処理
while( my $file = readdir( $dh ) ) {
if ( -f "$tmpdir/$file" ) {
# .zip ファイルだけ処理を行う
if ( $file =~ /\.zip$/ ) {
my $zipfile = "$tmpdir/$file" ;
my $xmlfile = $zipfile ;
$xmlfile =~ s/\.zip$/.xml/ ;
$xmlfile =~ s/X/!/g ;
# 圧縮解除 .zip => .xml
system( "/usr/bin/unzip -q -d $tmpdir '$tmpdir/$file'" ) ;
if ( -f $xmlfile ) {
# .xml => dmarc-cat の出力をメールに送る
if ( $mailto ne ""
&& open( $mh , "| /usr/sbin/sendmail $mailto" ) ) {
print $mh "Subject: DMARC report\n\n" ;
if ( open( my $fh , "/usr/bin/dmarc-cat '$xmlfile' |" ) ) {
while( <$fh> ) {
print $mh $_ ;
}
close( $fh ) ;
}
close( $mh ) ;
}
unlink( $xmlfile ) ; # 解凍されたファイルを消す
}
}
unlink( "$tmpdir/$file" ) ; # 添付ファイルを消す
}
}
closedir( $dh ) ;
}
rmdir( $tmpdir ) ;
}
この script を以下の様な procmailrc にかけて、report-a 宛のレポートを変換後 report-a-dmarc 宛に再転送させる。
:0 * ^To.*report-a@xxxxxxx\.xxx | /...path.../dmarc-report-mail.pl report-a-dmarc@xxxxxxx.xxx :0 * ^To.*report-f@xxxxxxx\.xxx | /...path.../dmarc-report-mail.pl report-f-dmarc@xxxxxxx.xxx
自宅メールサーバをDKIM対応へ
Yahoo のメールアカウントに、迷惑メール対策のため「DMARC」導入を開始しますとのメールが届いている。送信側ドメイン認証のひとつで、なりすましだった場合の取り扱いを設定することができるらしい。
しかし、自宅メールサーバは、mydns.jp を用いたダイナミックDNSを用いたサイト。このため、メールサーバを立ち上げても spam 送信元と誤認(なりすましと誤認)される可能性も高く、自宅サーバからのメールは、受け取り側で迷惑メールフォルダに落ちないか心配したり、すぐに相手に届くか不安であった。
ということで、DMARC の前に、DKIM にて信用してもらえるように設定を行う。DKIMは受信したメールが正しいメールサーバから送られ改ざんされていないか確認する方式。SPFは以前に導入済みだけど、正しいメールサーバから発信されたか確認する方式なので、DKIM ほどの信頼はない。
opendkim のインストール
Debian では、opendkim のパッケージが配布されているので必要なパッケージをインストールする。設定のために セレクタ名 を postfix としてプライベートキーを生成する。/etc/dkimkeys/postfix.txt には、DNS に登録する “IN TXT” の設定が生成される。
$ sudo aptitude install opendkim opendkim-tools $ cd /etc/dkimkeys $ sudo opendkim-genkey -D /etc/dkimkeys -b 1024 -d tsaitoh.net -s postfix $ sudo chown opendkim:opendkim /etc/dkimkeys/*
opendkim の設定として、上記処理で作られたプライベートキーを登録し、DKIM キーを付加する処理のためのサーバと接続するためのソケットを定義する。
((( 以下のファイルを編集 ))) $ sudo vi /etc/opendkim.conf Domain tsaitoh.net KeyFile /etc/dkimkeys/postfix.private Selector postfix Socket inet:8892@localhost
DKIM 電子署名を付加するための postifix の設定
postfix でメールを送信する時に opendkim に接続し DKIM の電子署名を付加するために、前述のソケットに対応する設定を以下の様に記載する。
((( /etc/postfix/main.cf ))) $ sudo vi /etc/postfix/main.cf smtpd_milters = inet:127.0.0.1:8892
DKIM のための DNS の設定
DNSに、公開鍵などの設定を行う。mydns.jp を使っているので、mydns.jp にログインし、DOMAIN INFO にて、以下の設定を加える。
_adsp._domainkey IN TXT dkim=unknown postfix._domainkey IN TXT v=DKIM1; h=sha256; k=rsa; p=XXX...XXX
DNS設定が正しく反映されているか確認。
$ nslookup -query=TXT _adsp._domainkey.tsaitoh.net 8.8.8.8 _adsp._domainkey.tsaitoh.net text = "dkim=unknown" $ nslookup -query=TXT postfix._domainkey.tsaitoh.net 8.8.8.8 postfix._domainkey.tsaitoh.net text = "v=DKIM1; h=sha256; k=rsa; p=XXX...XXX
サーバの再起動とDKIMの確認
$ sudo service opendkim start $ sudo service postfix restart
試しに Google のアカウントにメールを送ったら、メールヘッダに以下が表示されるようになった。SPF は、以前に設定済みなので、自宅サーバからのメールは、確実に相手に届くようになったと思われる。
ARC-Authentication-Results: i=1; mx.google.com;
dkim=pass header.i=@tsaitoh.net ....
spf=pass (google.com: domain of ....
我が家のWiFi機器の登録
子どもに「ネットワーク機器」が新たに届く。そろそろ、専門用語も通じる様になってきたので、セットアップ方法を伝授。
普通の家なら、WiFiルータのAOSSのボタンを押して…と言うところだろうが、我が家はネットワークの登録は手作業。
(1) ルータの設定画面 http://192.168.11.1 に接続し、login: admin , password: ●●●
(2) 詳細設定→無線設定→MACアクセス制限
(3) 登録リストの編集で、登録リストの新規追加
普通の家なら、WiFiルータで DHCP サーバ機能(プライベートアドレスの貸し出し機能)が動いているので、これで終わり。
ただし、我が家では、ネットワーク機器の稼働状況を管理するために、
(4) 固定IPアドレスを割り振るために DHCP サーバへの登録、/etc/dhcp/dhcpd.conf の編集
(5) IPアドレスを名前で呼び出せるようにするための DNS サーバへの登録 /etc/db.xxxx の編集
(6) 登録されていない MAC アドレス機器を監視するために、監視対象から外すための /etc/arpalert/maclist.allow への追記
(7) その他にも hosts への追記、Samba のための lmhosts への追記
と、面倒な設定が必要。これを全部管理するのは大変なので、これらの管理の自動化を行うプログラムが作ってあるので、その設定ファイルに、機器の ホスト名・IPアドレス・MACアドレスを記載すればいい。
詳細は、各設定ファイル内のテンプレート部に併記してあるコメントを参照。
EdgeRouter-X を L2-Switch
先日、EdgeRouter-X を reboot したら設定が飛んでしまった。
VPN は WRM-D2133HP に移行
外部からの L2TP による VPN 接続用に導入していた。しかし新たに導入したWiFi ルータ WRM-D2133HP は L2TP/IPSec に対応していたので、我が家の複雑なネットワーク構成を単純化するためにも VPN は WRM-D2133HP で対応させることにした。
WiFiルータの VPN だから、設定は簡単に終了。
EdgeRouter-X は 単純な L2-Switch 化
VPN を移行し本来なら不要になった EdgeRouter-X だけど、何も使わないのはもったいないし、自宅内の HUB ポートが埋まっているので、単純に L2-Switch の設定に変更。(といってもVLANは切らないけど)
ネットワークが繋がらない filter-aaaa-on-v4
最近、職場や自宅にて時々ネットワークが繋がらないときがある。
ネットワークの設定などは自前サーバを配置しているとはいえ、ちゃんと設定してあるはず。
繋がらないという状態でも、異なるサイトなら問題なくつながるので、プロバイダーや自宅ネットワークが落ちているということはない。でも、ふと IPv6 アドレスが問題になっているのかと反省。
自宅内は閉じているとはいえ、IPv6が使える状態。もしかして、上流接続はIPv4しか使えないけど、たまにIPv6アドレスを引いてしまうとかであろうか。
filter-aaaa-on-v4
そこで、色々調べ、IPv4 アドレスからの問い合わせは、IPv6 を使わせないための設定をしてみた。
((( /etc/bind/named.conf.options )))
options {
:
listen-on-v6 { any; } ;
filter-aaaa-on-v4 yes ;
}
動作確認
$ nslookup localhost Name: localhost Address: 127.0.0.1 $ nslookup localhost ::1 Name: localhost Address: 127.0.0.1 Name: localhost Address: ::1
気のせいかもしれないけど、職場の環境も filter-aaaa-on-v4 つけたけど、IPv4 fallback がなくなったのかな。応答が速くなったように感じる。
Buffaloのファームウェア更新情報のRSS生成
我が家のネットワークは、Buffalo 製品で統一しているけど、ファームウェアの更新は自動取得にしている。
ファームウェア更新の情報を確認したいので、Buffalo の firmware ダウンロードページを自宅の機器に厳選してクローリングし RSS 情報に変換するスクリプトを書いてみた。
PWなしWiFiとVPNの利用
夏休みの家族旅行でホテル。ただ、最近は減ってるけど、ホテルのWiFiがパスワードなし。こういうWiFiは、通信データが盗聴される可能性がある(参考「ホテルのWiFiの危険性は高い?)」ので、最近は使用を避けたい。
でも、家では以前から VPN サーバを使えるようにしているので、この際、家族にも使い方を説明して積極的に使ってもらおう。サーバ,ユーザID,PW,事前共有キーは、別途メールするとして、設定方法は他の人の解説記事をみてもらおう。
VPN接続だと、セキュリティが安心というのもあるけど、自宅だけに制限している機能(WordPressへの記事の投稿とか、自宅ネットワーク状況の表示など)も使える。
WRM-D2133HP v2.84
先日新しく導入したWiFiルータの新しいファームウェア v2.84 が公開されていたので、早々にインストール。
