TCP はコネクションの確立を「3ウェイハンドシェイク」で行います。
HOST-A からコネクションの確立要求 (SYN) があった場合、HOST-B はこれに対する返事である確認応答 (ACK) を返しますが、この時 HOST-B は確認応答 (ACK) だけを返すのではなく、HOST-B からのコネクションの確立要求 (SYN) も一緒に返します。これを受け取った HOST-A は HOST-B からのコネクションの確立要求 (SYN) に対する確認応答 (ACK) を返し、HOST-A と HOST-B 間のコネクションが確立されます。
コネクションが確立された後は、ACK 付のパケットがやり取りされます。
このように TCP では接続の開始の時だけ ACK が付きません。
これを利用したのが established オプションです。
- RT-B に適用されているアクセスリストを確認しなさい。
< RT-B >
RT-B# sh run | section int
interface FastEthernet0/0
ip address 192.168.2.2 255.255.255.0
duplex auto
speed auto
interface FastEthernet0/1
ip address 192.168.3.2 255.255.255.0
ip access-group outside in
duplex auto
speed auto
interface Serial0/0/0
no ip address
shutdown
interface Serial0/0/1
no ip address
shutdown
RT-B#
- RT-B の F0/1 へのアクセスリストの適用を解除しなさい。
< RT-B >
RT-B# conf t
Enter configuration commands, one per line. End with CNTL/Z.
RT-B(config)# int f0/1
RT-B(config-if)# no ip access-group outside in
RT-B(config-if)#
- F0/0 へのアクセスリストの適用が解除されたことを確認しなさい。
< RT-B >
RT-B(config-if)# do sh ip int f0/0 | section access list
Outgoing access list is not set
Inbound access list is not set
RT-B(config-if)#
- RT-B で、現在作成済みのアクセスリストを確認しなさい。
< RT-B >
RT-B(config-if)# do sh access-lists
Extended IP access list outside
10 deny tcp any any eq 22 (1 match)
20 deny tcp any any eq telnet (1 match)
30 permit ip any any
RT-B(config-if)#
- RT-B の作成済みのアクセスリストを削除しなさい。
< RT-B >
RT-B(config-if)# no ip access-list extended outside
RT-B(config)#
- アクセスリストが削除されたことを確認しなさい。
< RT-B >
RT-B(config)# do sh access-lists
RT-B(config)#
- RT-B で、外部ネットワークから内部ネットワークへの全てのIPパケットを禁止する名前付きIPアクセスリストを設定しなさい。
名前は outside とする。
< RT-B >
RT-B(config)# ip access-list extended outside
RT-B(config-ext-nacl)# deny ip any any
RT-B(config-ext-nacl)# do sh access-lists
Extended IP access list outside
10 deny ip any any
RT-B(config-ext-nacl)# int f0/1
RT-B(config-if)# ip access-group outside in
RT-B(config-if)#
- RT-C から RT-A へ SSH、Telnet、ping を実行しなさい。
< RT-C >
RT-C# ssh -l ccna 192.168.2.1
% Destination unreachable; gateway or host down
RT-C# telnet 192.168.2.1
Trying 192.168.2.1 ...
% Destination unreachable; gateway or host down
RT-C# ping 192.168.2.1
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 192.168.2.1, timeout is 2 seconds:
.....
Success rate is 0 percent (0/5)
RT-C#
全て失敗しました。 (接続できない)
- RT-A から RT-C へ SSH、Telnet、ping を実行しなさい。
< RT-A >
RT-A# ssh -l ccna 192.168.3.3
RT-A# telnet 192.168.3.3
Trying 192.168.3.3 ...
% Connection timed out; remote host not responding
RT-A# ping 192.168.3.3
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 192.168.3.3, timeout is 2 seconds:
.....
Success rate is 0 percent (0/5)
RT-A#
こちらも全て失敗しました。 (接続できない)
RT-B の F0/1 の in 側に、全て拒否のアクセスリストを設定したので、RT-C から RT-A への接続ができないのはわかりますが、なぜ RT-A から RT-C への接続もできないのでしょうか?
これは RT-A から RT-C に届いたパケットの戻りのパケット (RT-C から RT-A へのパケット) が設定されたアクセスリストで拒否されるからです。思い出してください。例えば、ping の場合、送信元からエコー要求を出して、それを受け取った宛先がエコー応答を送信元に戻すことによって、宛先が生きているかどうかが確認できたんですよね。SSH や Telnet でも宛先からの帰りのパケットを受け取れなければ、通信相手と接続することができません。
- RT-B で、外部ネットワークから内部ネットワークへの全てのIPパケットを禁止するが、
内部ネットワークから外部ネットワークへの TCP 接続は許可するように作成済み名前付きIPアクセスリストを修正しなさい。
< RT-B >
RT-B(config-if)# ip access-list extended outside
RT-B(config-ext-nacl)# no 10
RT-B(config-ext-nacl)# permit tcp any any established
RT-B(config-ext-nacl)# do sh access-lists
Extended IP access list outside
10 permit tcp any any established
RT-B(config-ext-nacl)#
established は、TCP の戻りのパケットを許可するためのオプションです。
established オプションを使用した場合、パケット内の ACK または RST ビットが立っているパケットだけを許可し、これらのビットが立っていないパケットは拒否します。このシナリオの一番最初で説明したように、TCP コネクションの一番最初のパケットだけ ACK が付いていません。したがってこのパケットは通しませんので、外部ネットワークから内部ネットワークへの接続開始要求は拒否されます。
このアクセスリストは F0/1 in に設定されているため、RT-A からの TCP コネクション確立要求パケット (SYN) には影響を与えません。
- RT-C から RT-A へ SSH、Telnet、ping を実行しなさい。
< RT-C >
RT-C# ssh -l ccna 192.168.2.1
% Destination unreachable; gateway or host down
RT-C# telnet 192.168.2.1
Trying 192.168.2.1 ...
% Destination unreachable; gateway or host down
RT-C# ping 192.168.2.1
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 192.168.2.1, timeout is 2 seconds:
U.U.U
Success rate is 0 percent (0/5)
RT-C#
前回同様、全て失敗しました。 (接続できない)
- RT-A から RT-C へ SSH、Telnet、ping を実行しなさい。
< RT-A >
RT-A# ssh -l ccna 192.168.3.3
Password:
RT-C> exit
[Connection to 192.168.3.3 closed by foreign host]
RT-A# telnet 192.168.3.3
Trying 192.168.3.3 ... Open
User Access Verification
Username: ccna
Password: cisco ← 実際には表示はされない
RT-C> exit
[Connection to 192.168.3.3 closed by foreign host]
RT-A# ping 192.168.3.3
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 192.168.3.3, timeout is 2 seconds:
.....
Success rate is 0 percent (0/5)
RT-A#
RT-A から RT-C への SSH、Telnet 接続は成功しましたが、ping は失敗しました。
established は tcp でのみ使用できるオプションですので、tcp でない ping パケットは、設定したアクセスリストでは引っかからずに暗黙の deny で拒否されています。このため、ping のエコー応答が RT-A に戻って来ないわけです。
※ established は3ウェイハンドシェイクの一番最初のパケットに ACK が含まれない仕組みを利用しているので、3ウェイハンドシェイクを使わない UDP や ICMP では使用できません。UDP や ICMP でも established オプションと同様のことがしたい場合、再帰 ACL を使用します。ただ、それぞれのプロトコルの戻りのパケットを通すというアクセスリストを別途追加しても実現できます。
- 作成済み名前付きIPアクセスリストに ICMP のエコー応答を許可する条件文を追加しなさい。
< RT-B >
RT-B(config-ext-nacl)# permit icmp any any echo-reply
RT-B(config-ext-nacl)# do sh access-lists
Extended IP access list outside
10 permit tcp any any established (96 matches)
20 permit icmp any any echo-reply
RT-B(config-ext-nacl)#
- RT-A から RT-C へ ping を実行しなさい。
< RT-A >
RT-A# ping 192.168.3.3
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 192.168.3.3, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 1/2/4 ms
RT-A#
エコー応答を通過させるようにしたので、ping が成功しました。