Linux での IP 依存のローカル ポート転送

Linux での IP 依存のローカル ポート転送

サーバーの sshd を非標準ポート 42 でリッスンするように構成しました。

しかし、職場ではファイアウォール/プロキシの背後にいて、ポート 21、22、80、443 への送信接続のみを許可しています。その結果、職場からサーバーに ssh できなくなり、困っています。sshd をポート 22 に戻したくありません。

アイデアはこうです: 私のサーバーでは、ポート22をポート42にローカル転送しますもし送信元 IP は、私の職場ネットワークの外部 IP と一致しています。わかりやすくするために、私のサーバーの IP が 169.1.1.1 (eth1 上) で、私の職場の外部 IP が 169.250.250.250 であると仮定します。169.250.250.250 以外のすべての IP に対して、私のサーバーは、非リスニング ポートの場合と同様に、予想どおり「接続拒否」で応答するはずです。

私は iptables について非常に初心者です。長い iptables マニュアルと、関連する以下の質問を簡単に確認しました。

しかし、これらの質問は、より複雑な複数ホストのシナリオを扱っており、ローカル ポート転送にどのテーブルとチェーンを使用すればよいのか、また、2 つのルール (「質問」パケットと「回答」パケット用) が必要か、それとも「質問」パケット用の 1 つのルールのみが必要かが明確ではありません。

これまでのところ、sysctl 経由で転送を有効にしただけです。明日からソリューションのテストを開始する予定です。簡単なシナリオを実装するためのヒントやケース固有の例をいただければ幸いです。

以下の解決策案は正しいでしょうか?

iptables -A INPUT [-m state] [-i eth1] --source 169.250.250.250 -p tcp
    --destination 169.1.1.1:42 --dport 22 --state NEW,ESTABLISHED,RELATED
    -j ACCEPT

mangle?の代わりにテーブルを使用したほうがよいでしょうか。 ?の代わりにチェーンを使用したfilterほうがよいでしょうか。FORWARDINPUT

答え1

転送/リダイレクトするには、NAT テーブルを編集する必要があります。

このようなルールはおそらく必要なものに最も近いでしょう。

/sbin/iptables --table nat --append PREROUTING --protocol tcp \
               --source 169.250.250.250 --dport 22 \
               --jump REDIRECT --to-ports 42

SSH を標準ポートに残して適切に保護する方がはるかに簡単で、おそらくより良いでしょう。代替ポートを使用すると、意欲的な攻撃者の速度が数秒遅くなるだけです。denyhosts/fail2ban などの侵入防止システムを設定し、パスワードベースの認証を無効にします。または、着信 SSH 接続のレート制限を検討します。

見る:

答え2

私は、IP テーブルの管理に Shorewall を使用します。これは適切な基本ファイアウォールを設定し、必要な操作を簡単に実行できます。/etc/shorewall/rules に次のようなルールを追加します。

DNAT ネット:169.250.250.250 ロケーション:169.250.250.250 tcp 42 22

他の方と同様、別のポートで sshd を実行する理由がわかりません。これがインターネット ポートである場合は、最初に別のポートにアクセスしない限りポートを閉じたままにするためにポート ノッキングを検討してください。Shorewall はこれを簡単に処理します。

関連情報