pepoとネットワークを語ろう

40年前からこれまでとこれからのネットワークを語る

telnetクライアントへの道その4

2009-07-28 11:12:07 | Linux

/usr/include/arpa/telnet.h の全てコマンドやオプションは対処できませんがLinuxやFreeBSDサーバへログインできるように必要最低限なやり取りを出来るように書きます。

コマンドを受信した時のレスポンス例
| IAC | 動作のタイプ  | オプション |
動作タイプ:Do,Will,Won't,Don't,Sbなど
Command: Do Authentication Option → Command: Won't Authentication Option
Command: Do Encryption Option → Command: Don't Encryption Option
Command: Do Terminal Speed → Command: Won't Terminal Speed
Command: Do X Display Location → Command: Won't X Display Location
Command: Do New Environment Option → Command: Won't New Environment Option
Command: Do Environment Option → Command: Won't Environment Option
Command: Will Suppress Go Ahead → Command: Won't Suppress Go Ahead

殆どの場合、処理不可能なコマンドは動作タイプをWon'tと受信したオプションを付けて返信すればよいことになります

以下のリストは、IACを受信したら次キャラクタの動作タイプを判定しオプションに返送する動作タイプを設定して応答をするようにしています


zmodem_check() { /* zmodem check & telnet option */
  int chh;
  chh = ch & 0377;
  ch3 = chh;
  if ( iac_step_flag != 0 ) {
    if ( iac_step_flag == 1 ) {
      dont_flag = do_flag = will_flag = 0;
      iac_step_flag++;
      switch(chh) {
        case DONT:
          dont_flag = 1;
          break;
        case WILL:
          will_flag = 1;
          break;
        case DO:
          do_flag = 1;
          break;
        case SB:
          sb_flag = 1;
          break;
      }
      return;
    }
    if ( iac_step_flag == 2 ) {
      iac_step_flag = 0;
      display_flag = 1;
      switch(chh) {
        case TELOPT_ECHO:
          if (dont_flag == 1) display_flag = 0;
          if (do_flag == 1) {
            display_flag = 1;
            send_wont_char(ch3);
          }
          if (will_flag == 1) {
            display_flag = 1;
          }
          break;
        case TELOPT_ENCRYPT:
          if (do_flag == 1) send_wont_char(ch3);
          if (will_flag == 1) send_dont_char(ch3);
          break;
        case TELOPT_AUTHENTICATION:
          if (do_flag == 1) send_wont_char(ch3);
          if (will_flag == 1) send_dont_char(ch3);
          break;
        case TELOPT_STATUS:
          if (will_flag == 1 || do_flag == 1) send_wont_char(ch3);
          if (dont_flag == 1) send_dont_char(ch3);
          break;
        case TELOPT_NAWS:
          if (send_window_flag == 1 && do_flag == 1) {
            send_window_size();
          }
          break;
        case TELOPT_TTYPE:
          if (send_ttype_flag == 1 && sb_flag == 1) {
            send_ttype();
          }
          break;
        default:
          if (will_flag == 1) send_dont_char(ch3);
          if (do_flag == 1) send_wont_char(ch3);
          if (send_window_flag == 0) {
            send_will_window();
            send_window_flag = 1;
            send_will_ttype();
            send_ttype_flag = 1;
          }
          break;
      }
      return;
    }
  }


// send telnet option
send_wont_char(ch_send) {
  sprintf(f3,"%c%c%c",IAC,WONT,ch_send);
  write(fp2,&f3,strlen(f3));
 return;
}

send_dont_char(ch_send) {
  sprintf(f3,"%c%c%c",IAC,DONT,ch_send);
  write(fp2,&f3,strlen(f3));
 return;
}

send_will_char(ch_send) {
  sprintf(f3,"%c%c%c",IAC,WILL,ch_send);
  write(fp2,&f3,strlen(f3));
 return;
}

send_will_window() {
  sprintf(f3,"%c%c%c",IAC,WILL,TELOPT_NAWS);
  write(fp2,&f3,strlen(f3));
  return;
}

send_will_ttype() {
  sprintf(f3,"%c%c%c",IAC,WILL,TELOPT_TTYPE);
  write(fp2,&f3,strlen(f3));
  return;
}

send_ttype() {
  int dummy = 0;
  sprintf(f3,"%c%c%c%c%s%c%c",IAC,SB,TELOPT_TTYPE,dummy,MY_TTYPE,IAC,SE);
  write(fp2,&f3, 6 + strlen(MY_TTYPE));
  return;
}

 

pepo


telnetクライアントへの道その3

2009-07-27 19:53:53 | Linux

前回では、『| IAC | 動作のタイプ  | オプション |』でtelnetクライアントはtelnetサーバとコマンド&レスポンスのやり取りが必要だと分かったという事で、どのような動作タイプとオプションがあるかincludeファイルを確認しておきます。

[root@epicon-4.6]# cat /usr/include/arpa/telnet.h
/*
 * Copyright (c) 1983, 1993
 * The Regents of the University of California.  All rights reserved.

一部省略


 * @(#)telnet.h 8.2 (Berkeley) 12/15/93
 */

#ifndef _ARPA_TELNET_H
#define _ARPA_TELNET_H 1

/*
 * Definitions for the TELNET protocol.
 */
#define IAC 255  /* interpret as command: */
#define DONT 254  /* you are not to use option */
#define DO 253  /* please, you use option */
#define WONT 252  /* I won't use option */
#define WILL 251  /* I will use option */
#define SB 250  /* interpret as subnegotiation */
#define GA 249  /* you may reverse the line */
#define EL 248  /* erase the current line */
#define EC 247  /* erase the current character */
#define AYT 246  /* are you there */
#define AO 245  /* abort output--but let prog finish */
#define IP 244  /* interrupt process--permanently */
#define BREAK 243  /* break */
#define DM 242  /* data mark--for connect. cleaning */
#define NOP 241  /* nop */
#define SE 240  /* end sub negotiation */
#define EOR     239             /* end of record (transparent mode) */
#define ABORT 238  /* Abort process */
#define SUSP 237  /* Suspend process */
#define xEOF 236  /* End of file: EOF is already used... */

#define SYNCH 242  /* for telfunc calls */

#ifdef TELCMDS
char *telcmds[] = {
 "EOF", "SUSP", "ABORT", "EOR",
 "SE", "NOP", "DMARK", "BRK", "IP", "AO", "AYT", "EC",
 "EL", "GA", "SB", "WILL", "WONT", "DO", "DONT", "IAC", 0,
};
#else
extern char *telcmds[];
#endif

#define TELCMD_FIRST xEOF
#define TELCMD_LAST IAC
#define TELCMD_OK(x) ((unsigned int)(x) <= TELCMD_LAST &&
    (unsigned int)(x) >= TELCMD_FIRST)
#define TELCMD(x) telcmds[(x)-TELCMD_FIRST]

/* telnet options */
#define TELOPT_BINARY 0 /* 8-bit data path */
#define TELOPT_ECHO 1 /* echo */
#define TELOPT_RCP 2 /* prepare to reconnect */
#define TELOPT_SGA 3 /* suppress go ahead */
#define TELOPT_NAMS 4 /* approximate message size */
#define TELOPT_STATUS 5 /* give status */
#define TELOPT_TM 6 /* timing mark */
#define TELOPT_RCTE 7 /* remote controlled transmission and echo */
#define TELOPT_NAOL  8 /* negotiate about output line width */
#define TELOPT_NAOP  9 /* negotiate about output page size */
#define TELOPT_NAOCRD 10 /* negotiate about CR disposition */
#define TELOPT_NAOHTS 11 /* negotiate about horizontal tabstops */
#define TELOPT_NAOHTD 12 /* negotiate about horizontal tab disposition */
#define TELOPT_NAOFFD 13 /* negotiate about formfeed disposition */
#define TELOPT_NAOVTS 14 /* negotiate about vertical tab stops */
#define TELOPT_NAOVTD 15 /* negotiate about vertical tab disposition */
#define TELOPT_NAOLFD 16 /* negotiate about output LF disposition */
#define TELOPT_XASCII 17 /* extended ascii character set */
#define TELOPT_LOGOUT 18 /* force logout */
#define TELOPT_BM 19 /* byte macro */
#define TELOPT_DET 20 /* data entry terminal */
#define TELOPT_SUPDUP 21 /* supdup protocol */
#define TELOPT_SUPDUPOUTPUT 22 /* supdup output */
#define TELOPT_SNDLOC 23 /* send location */
#define TELOPT_TTYPE 24 /* terminal type */
#define TELOPT_EOR 25 /* end or record */
#define TELOPT_TUID 26 /* TACACS user identification */
#define TELOPT_OUTMRK 27 /* output marking */
#define TELOPT_TTYLOC 28 /* terminal location number */
#define TELOPT_3270REGIME 29 /* 3270 regime */
#define TELOPT_X3PAD 30 /* X.3 PAD */
#define TELOPT_NAWS 31 /* window size */
#define TELOPT_TSPEED 32 /* terminal speed */
#define TELOPT_LFLOW 33 /* remote flow control */
#define TELOPT_LINEMODE 34 /* Linemode option */
#define TELOPT_XDISPLOC 35 /* X Display Location */
#define TELOPT_OLD_ENVIRON 36 /* Old - Environment variables */
#define TELOPT_AUTHENTICATION 37/* Authenticate */
#define TELOPT_ENCRYPT 38 /* Encryption option */
#define TELOPT_NEW_ENVIRON 39 /* New - Environment variables */
#define TELOPT_EXOPL 255 /* extended-options-list */


#define NTELOPTS (1+TELOPT_NEW_ENVIRON)
#ifdef TELOPTS
char *telopts[NTELOPTS+1] = {
 "BINARY", "ECHO", "RCP", "SUPPRESS GO AHEAD", "NAME",
 "STATUS", "TIMING MARK", "RCTE", "NAOL", "NAOP",
 "NAOCRD", "NAOHTS", "NAOHTD", "NAOFFD", "NAOVTS",
 "NAOVTD", "NAOLFD", "EXTEND ASCII", "LOGOUT", "BYTE MACRO",
 "DATA ENTRY TERMINAL", "SUPDUP", "SUPDUP OUTPUT",
 "SEND LOCATION", "TERMINAL TYPE", "END OF RECORD",
 "TACACS UID", "OUTPUT MARKING", "TTYLOC",
 "3270 REGIME", "X.3 PAD", "NAWS", "TSPEED", "LFLOW",
 "LINEMODE", "XDISPLOC", "OLD-ENVIRON", "AUTHENTICATION",
 "ENCRYPT", "NEW-ENVIRON",
 0,
};
#define TELOPT_FIRST TELOPT_BINARY
#define TELOPT_LAST TELOPT_NEW_ENVIRON
#define TELOPT_OK(x) ((unsigned int)(x) <= TELOPT_LAST)
#define TELOPT(x) telopts[(x)-TELOPT_FIRST]
#endif

/* sub-option qualifiers */
#define TELQUAL_IS 0 /* option is... */
#define TELQUAL_SEND 1 /* send option */
#define TELQUAL_INFO 2 /* ENVIRON: informational version of IS */
#define TELQUAL_REPLY 2 /* AUTHENTICATION: client version of IS */
#define TELQUAL_NAME 3 /* AUTHENTICATION: client version of IS */

#define LFLOW_OFF  0 /* Disable remote flow control */
#define LFLOW_ON  1 /* Enable remote flow control */
#define LFLOW_RESTART_ANY 2 /* Restart output on any char */
#define LFLOW_RESTART_XON 3 /* Restart output only on XON */

/*
 * LINEMODE suboptions
 */

#define LM_MODE  1
#define LM_FORWARDMASK 2
#define LM_SLC  3

#define MODE_EDIT 0x01
#define MODE_TRAPSIG 0x02
#define MODE_ACK 0x04
#define MODE_SOFT_TAB 0x08
#define MODE_LIT_ECHO 0x10

#define MODE_MASK 0x1f

/* Not part of protocol, but needed to simplify things... */
#define MODE_FLOW  0x0100
#define MODE_ECHO  0x0200
#define MODE_INBIN  0x0400
#define MODE_OUTBIN  0x0800
#define MODE_FORCE  0x1000

#define SLC_SYNCH 1
#define SLC_BRK  2
#define SLC_IP  3
#define SLC_AO  4
#define SLC_AYT  5
#define SLC_EOR  6
#define SLC_ABORT 7
#define SLC_EOF  8
#define SLC_SUSP 9
#define SLC_EC  10
#define SLC_EL  11
#define SLC_EW  12
#define SLC_RP  13
#define SLC_LNEXT 14
#define SLC_XON  15
#define SLC_XOFF 16
#define SLC_FORW1 17
#define SLC_FORW2 18

#define NSLC  18

/*
 * For backwards compatibility, we define SLC_NAMES to be the
 * list of names if SLC_NAMES is not defined.
 */
#define SLC_NAMELIST "0", "SYNCH", "BRK", "IP", "AO", "AYT", "EOR",
   "ABORT", "EOF", "SUSP", "EC", "EL", "EW", "RP",
   "LNEXT", "XON", "XOFF", "FORW1", "FORW2", 0,
一部省略


#endif /* arpa/telnet.h */

pepo

 


telnetクライアントへの道その2

2009-07-26 18:17:36 | Linux

前回の復習でtelnetクライアントはtelnetサーバとコマンド&レスポンスのやり取りが必要、コマンドは常に Interpret as command (IAC) 文字によって示されます。
| IAC | 動作のタイプ  | オプション |
| ff   | fd              |18           |
例として『Will Terminal Type』は上記のようになっている

teratermクライアントとサーバのやり取りをwiresharkでキャプチャ後、アプリケーションレイアのTelnet Data部分を+ボタンで展開

File→Export→File→Plain text(ファイルの種類)→ファイル名をつけて保存

このExportされたtextファイルをtelnetプロトコル部分のみ取り出しクライアント⇔サーバのやりとりを分かりやすくしたものです。

クライアント→サーバ
    Command: Will Terminal Type
    Command: Do Suppress Go Ahead
    Command: Will Suppress Go Ahead
    Command: Do Echo
    Command: Will Negotiate About Window Size
サーバ→クライアント
    Command: Do Terminal Type
    Command: Will Suppress Go Ahead
    Command: Do Suppress Go Ahead
    Command: Will Echo
    Command: Do Negotiate About Window Size
    Command: Do Authentication Option
クライアント→サーバ
    Suboption Begin: Negotiate About Window Size
    Command: Suboption End
クライアント→サーバ
    Command: Won't Authentication Option
サーバ→クライアント
    Command: Will Encryption Option
    Command: Do Encryption Option
    Command: Do Terminal Speed
    Command: Do X Display Location
    Command: Do New Environment Option
    Command: Do Environment Option
クライアント→サーバ
    Command: Don't Encryption Option
クライアント→サーバ
    Command: Won't Encryption Option
    Command: Won't Terminal Speed
    Command: Won't X Display Location
    Command: Won't New Environment Option
    Command: Won't Environment Option
サーバ→クライアント
    Suboption Begin: Terminal Type
    Command: Suboption End
クライアント→サーバ
    Suboption Begin: Terminal Type
    Command: Suboption End
サーバ→クライアント
    Command: Do Echo
    Command: Will Status
    Command: Do Remote Flow Control
クライアント→サーバ
    Command: Won't Echo
サーバ→クライアント
    Data: ¥r¥n
    Data:     vpn (Linux release 2.6.29.4-pepo #1 SMP Fri Jun 12 17:34:30 JST 2009) (1)¥r¥n
    Data: ¥r¥n
クライアント→サーバ
    Command: Don't Status
クライアント→サーバ
    Command: Won't Remote Flow Control
サーバ→クライアント
    Data: login:

pepo


telnetクライアントへの道その1

2009-07-25 15:07:35 | Linux

さて、telnetとはTCP/IPネットワークにおいてネットワークにつながれた
コンピュータを遠隔操作するためものでそのために使用されるプロトコル。
telnetサービスを起動しているコンピュータ(サーバ)にログオンして目の前にいるのと
同じように操作することができるものです。

という事でTCP/IPのクライアントを書いて
  ip_addr = 192.168.0.1;
    ip_port = 23;
   sockfd_ip = socket(AF_INET, SOCK_STREAM, 0);
    address_ip.sin_family = AF_INET;
    address_ip.sin_addr.s_addr = inet_addr(ip_addr);
    address_ip.sin_port = htons(atoi(ip_port));
    len_ip = sizeof(address_ip);
    result_ip = connect(sockfd_ip, (struct sockaddr *)&address_ip, len_ip);
    if(result_ip == -1) {
      perror("rncannot connect");
      fprintf(stderr,"r%s:%srn",ip_addr,ip_port);
      end_process();
    }
    fp2 = sockfd_ip;
  if (read(fp2, &ch, 1) > 0) {
  ・
  ・ 
後はファイルポインタfp2をread/writeすればいいだけのように思いますが
ここまでは、あくまでTCP/IPのクライアント部分だけです

スイッチやルータなどは簡易telnetを実装していることが多い為、TCP/IPのクライアントのみでも充分ログイン可能です
しかし、Linux、FreeBSD、WindowsServerサーバなどのtelnetクライアントはこの後、複雑なtelnetプロトコルをしゃべらす必要があります
詳しくは下記URLを参照して貰いたいが
http://support.microsoft.com/kb/231866/ja

最低限の知識として、telnetクライアントはtelnetサーバとコマンド&レスポンスのやり取りが必要と言うことです
各コマンドは最上位有効ビットを 1 に設定することによりデータと区別されます。
(データは第 8 ビットが 0 に設定された 7 ビットとして転送されます。)
コマンドは常に Interpret as command (IAC) 文字によって示されます。
例えば
| IAC | 動作のタイプ  | オプション |
| ff   | fd              |18           |
上記の『ff,fd,18』は『Will Terminal Type』と言うコマンドでteratermのtelnetクライアントが、ESTABLISHED後、一番にサーバへ送出するコマンドです。
以下は、teratermのtelnetクライアントでログイン・プロンプトが表示されるまでLinuxサーバとのやりとりをwiresharkでキャプチャ後、テキスト形式で保存します

アプリケーションレイアのTelnet Data部分を+ボタンで展開

File→Export→File→Plain text(ファイルの種類)→ファイル名をつけて保存すると下記のようになる(途中省略)

No.     Time        Source                Destination           Protocol Info
      1 0.000000    192.168.2.11          192.168.2.240         TCP      2331 > 23 [SYN] Seq=0 Win=16384 Len=0 MSS=1460

Frame 1 (62 bytes on wire, 62 bytes captured)
Ethernet II, Src: 00:16:6f:5f:7a:02 (00:16:6f:5f:7a:02), Dst: 00:0a:79:b1:58:65 (00:0a:79:b1:58:65)
Internet Protocol, Src: 192.168.2.11 (192.168.2.11), Dst: 192.168.2.240 (192.168.2.240)
Transmission Control Protocol, Src Port: 2331 (2331), Dst Port: 23 (23), Seq: 0, Len: 0

No.     Time        Source                Destination           Protocol Info
      2 0.003797    192.168.2.240         192.168.2.11          TCP      23 > 2331 [SYN, ACK] Seq=0 Ack=1 Win=5840 Len=0 MSS=1460

Frame 2 (63 bytes on wire, 63 bytes captured)
Ethernet II, Src: 00:0a:79:b1:58:65 (00:0a:79:b1:58:65), Dst: 00:16:6f:5f:7a:02 (00:16:6f:5f:7a:02)
Internet Protocol, Src: 192.168.2.240 (192.168.2.240), Dst: 192.168.2.11 (192.168.2.11)
Transmission Control Protocol, Src Port: 23 (23), Dst Port: 2331 (2331), Seq: 0, Ack: 1, Len: 0

No.     Time        Source                Destination           Protocol Info
      3 0.003841    192.168.2.11          192.168.2.240         TCP      2331 > 23 [ACK] Seq=1 Ack=1 Win=17520 Len=0

Frame 3 (54 bytes on wire, 54 bytes captured)
Ethernet II, Src: 00:16:6f:5f:7a:02 (00:16:6f:5f:7a:02), Dst: 00:0a:79:b1:58:65 (00:0a:79:b1:58:65)
Internet Protocol, Src: 192.168.2.11 (192.168.2.11), Dst: 192.168.2.240 (192.168.2.240)
Transmission Control Protocol, Src Port: 2331 (2331), Dst Port: 23 (23), Seq: 1, Ack: 1, Len: 0

No.     Time        Source                Destination           Protocol Info
      4 0.075627    192.168.2.11          192.168.2.240         TELNET   Telnet Data ...

Frame 4 (69 bytes on wire, 69 bytes captured)
Ethernet II, Src: 00:16:6f:5f:7a:02 (00:16:6f:5f:7a:02), Dst: 00:0a:79:b1:58:65 (00:0a:79:b1:58:65)
Internet Protocol, Src: 192.168.2.11 (192.168.2.11), Dst: 192.168.2.240 (192.168.2.240)
Transmission Control Protocol, Src Port: 2331 (2331), Dst Port: 23 (23), Seq: 1, Ack: 1, Len: 15
Telnet
    Command: Will Terminal Type
    Command: Do Suppress Go Ahead
    Command: Will Suppress Go Ahead
    Command: Do Echo
    Command: Will Negotiate About Window Size

No.     Time        Source                Destination           Protocol Info
      5 0.078002    192.168.2.240         192.168.2.11          TCP      23 > 2331 [ACK] Seq=1 Ack=16 Win=5840 Len=0

Frame 5 (60 bytes on wire, 60 bytes captured)
Ethernet II, Src: 00:0a:79:b1:58:65 (00:0a:79:b1:58:65), Dst: 00:16:6f:5f:7a:02 (00:16:6f:5f:7a:02)
Internet Protocol, Src: 192.168.2.240 (192.168.2.240), Dst: 192.168.2.11 (192.168.2.11)
Transmission Control Protocol, Src Port: 23 (23), Dst Port: 2331 (2331), Seq: 1, Ack: 16, Len: 0

No.     Time        Source                Destination           Protocol Info
      6 1.042733    192.168.2.240         192.168.2.11          TELNET   Telnet Data ...

Frame 6 (72 bytes on wire, 72 bytes captured)
Ethernet II, Src: 00:0a:79:b1:58:65 (00:0a:79:b1:58:65), Dst: 00:16:6f:5f:7a:02 (00:16:6f:5f:7a:02)
Internet Protocol, Src: 192.168.2.240 (192.168.2.240), Dst: 192.168.2.11 (192.168.2.11)
Transmission Control Protocol, Src Port: 23 (23), Dst Port: 2331 (2331), Seq: 1, Ack: 16, Len: 18
Telnet
    Command: Do Terminal Type
    Command: Will Suppress Go Ahead
    Command: Do Suppress Go Ahead
    Command: Will Echo
    Command: Do Negotiate About Window Size
    Command: Do Authentication Option

No.     Time        Source                Destination           Protocol Info
      7 1.043224    192.168.2.11          192.168.2.240         TELNET   Telnet Data ...

Frame 7 (63 bytes on wire, 63 bytes captured)
Ethernet II, Src: 00:16:6f:5f:7a:02 (00:16:6f:5f:7a:02), Dst: 00:0a:79:b1:58:65 (00:0a:79:b1:58:65)
Internet Protocol, Src: 192.168.2.11 (192.168.2.11), Dst: 192.168.2.240 (192.168.2.240)
Transmission Control Protocol, Src Port: 2331 (2331), Dst Port: 23 (23), Seq: 16, Ack: 19, Len: 9
Telnet
    Suboption Begin: Negotiate About Window Size
    Command: Suboption End

No.     Time        Source                Destination           Protocol Info
      8 1.044762    192.168.2.240         192.168.2.11          TCP      23 > 2331 [ACK] Seq=19 Ack=25 Win=5840 Len=0

Frame 8 (60 bytes on wire, 60 bytes captured)
Ethernet II, Src: 00:0a:79:b1:58:65 (00:0a:79:b1:58:65), Dst: 00:16:6f:5f:7a:02 (00:16:6f:5f:7a:02)
Internet Protocol, Src: 192.168.2.240 (192.168.2.240), Dst: 192.168.2.11 (192.168.2.11)
Transmission Control Protocol, Src Port: 23 (23), Dst Port: 2331 (2331), Seq: 19, Ack: 25, Len: 0

以下省略

pepo


くじら伝説、包丁事件その1

2009-07-23 13:38:36 | くじら伝説

くじらのままがテレビショッピングで何年か前に購入した包丁

その時の謳い文句が【驚きの20年切れ味保証付き】、切れなくなったら交換OK!

ほんまかいなと、くじらのだんな

その包丁が最近、柄の元からポキリと折れてしまったそうな

今まで生きてて包丁が柄から折れたのん聞いたことがないやん

と言うことで、大事に取って置いたテレビショッピングの連絡先へコール

連絡先の会社名が変わっていたが何とか連絡がつき代替品を送って来たそうな

包丁の刃先に一枚紙が巻かれ、封筒に入った荷姿でポストへ到着、げー

pepoとおやすみ