はじめに
この記事は「どうしてscp(Secure Copy)が使えないのにrcp(Remote Copy)が使えるの?」と首をひねっているサーバ運用・インフラ初心者の方を対象にしています。
scpはSSHベースでセキュア、rcpは古くて危険――という知識はあっても、実際の現場で「scpがタイムアウトするのにrcpは一発で通る」という経験をした方は多いはずです。本記事では、両コマンドがネットワーク上でどう動くかを追いながら、「なぜscpはブロックされてrcpは通るのか」を構造的に理解できるよう解説します。最後まで読めば、ファイアウォールやポート制御の設計意図が見えてきます。
前提知識
- TCP/IPの基礎(ポート番号の概念を知っている)
- SSHで22番ポートを使うことは知っている
- Linuxで
scp,rcp,ssh,rshのコマンドを打ったことがある(使い方は問わない)
scpとrcpの立ち位置と歴史的背景
scpはSSHプロトコル上で動くファイル転送コマンドで、通信は暗号化されます。一方、rcpは1980年代のBSDに起源を持ち、rsh(リモートシェル)上で動くため平文通信です。セキュリティの観点ではscpが優位ですが、rcpは「レガシーな環境で動かさざるを得ない」「ファイアウォールがrsh系を許可している」という特殊なケースで今も使われます。
重要なのは、scpはSSHのサブシステムとして動くため、SSHが通らない=scpも通らない、という点です。
なぜscpは失敗し、rcpは成功するのか
ポートとコネクションの違い
SSH(scp)
- 22番ポートだけで制御コネクションを張る
- ファイル転送に使うデータコネクションも22番で多重化(SSHプロトコル内部でチャネルが多重化される)
- ファイアウォールが「22番をDROP/REJECT」すれば、全体が通らない
rsh(rcp)
- 514番(rsh)または513番(rlogin)でコマンド用TCPコネクション
- データ転送用に別途TCPコネクションを毎回張る(ポート範囲は1023以下の空きポート)
- ファイアウォールが「1023以下を全部許可」「ESTABLISHED/RELATED を許可」だと、rcpは通る
実験で確かめる
- クライアント側で
iptables -A OUTPUT -p tcp --dport 22 -j DROPとしてscpを実行
→Connection timed out - 同様に
iptables -A OUTPUT -p tcp --dport 514 -j ACCEPT+--match state --state ESTABLISHED,RELATED -j ACCEPTとしてrcpを実行
→ 転送成功(file1 100% |*** ETA 0:00:00) tcpdump -i any port 514 or portrange 1-1023で見ると、rshコネクションのあと、ランダムな高ポート→ランダムな低ポートへの新規TCPコネクションが張られているのが確認できる
ハマりどころ
- 「22番は開いているのにscpがフリーズ」→ 実は出口側のプロキシがSSHプロトコルを嫌ってアプリケーション層で破棄している
- 「rcpは通るがscpが通らない」→ セキュアに見えるが、ファイアウォールが古すぎて逆にrsh系を許可している
- どちらも通らない → データコネクションが一方通行でフィルタされてRSTが返ってきている
セキュアに残す選択肢
rcpを諦めてscpが通らない理由を切り分けるには
1. ssh -vで握手までのログを確認
2. nc -vz host 22で到達性チェック
3. sshd_configでポートを443などに変更(出向きプロキシ回避)
4. 最終手段:sftp(SSH File Transfer Protocol)を有効にしてscp -Oで互換モードを切る
まとめ
- scpはSSHの22番一本で多重化するため、22番がブロックされると完全に不通
- rcpはrsh(514番)+別ポートのデータコネクションを使うため、「1023以下を許可」環境では通りやすい
- 結果として「scpは不可能でrcpなら可能」が起こる
- セキュリティを取るか、可用性を取るか――環境に応じて手段を選ぼう
次回は「sftpが通らない時に使えるポート443のSSHトンネル」について掘り下げます。
参考資料
- OpenSSH アーキテクチャマニュアル
https://www.openssh.com/manual/ - BSD rcp(1) 歴史仕様
https://man.netbsd.org/rcp.1 - IANA サービス名・ポート番号一覧
https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml
