私はローカルGitプロジェクトを開発しており、root以外のユーザーを使用してポート2222で別々のSSHサービスを実行しています。それ以外はufwファイアウォールを使用してポート2222を開きます。接続が期待どおりに機能し、正常であるかどうかをテストするためにオープンしました。
SSHのデフォルトポートは22であり、ユーザーがリポジトリにアクセスするためにアドレスに別のポートを書きたくないので、22から2222に事前にルーティングしたいと思います。そして、Pre-Routing中はポート2222を外部からアクセスできないという点も有効であればいいです。
基本的に最初の部分を完了しました。トラフィックを2222から2222に事前にルーティングしており、ポート2222も開いていると正しく機能しますが、ポート2222を閉じようとすると22への接続も機能しません(ポートを開くルールは次のとおり)。まだそこにあります)。 iptablesはポート22を2222に変換し、それをufwに渡すように見えるため、これはやや論理的です。 ufwはこれを認識し、ポート2222が開いていないため接続を拒否します。
現在これはufwのbefore.rulesにあり、ポート2222も開いていると機能します。
*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A PREROUTING -p tcp --dport 22 -j REDIRECT --to-port 2222
ポート2222を開かずに事前ルーティングを実行する方法はありますか?
答え1
原則としてはいいえ。ここで使用することは重要ではありませんufw
。これは、iptablesルールを生成するフロントエンドの役割のみを持っているからです。ご存知のように、NATルールはフィルタリングの前に処理されるため、フィルタはNATルールの後に生成されたパケットを表示できます。 (ウィキペディアではかなり怖く見えるチャートパケットはネットフィルタ内を流れ、これは独立していることを意味します。 )
別のポートからサーバーにアクセスできるようにすることが大きな問題かどうかはわかりません。
ただし、実際にポート2222に直接送信されたパケットを破棄するには、いくつかのトリック、つまり接続タグ(ターゲットとCONNMARK
モジュールconnmark
など)を使用してこれを実行できます。
テーブルからnat
接続にフラグを設定し、宛先ポートにリダイレクトします。
iptables -t nat -A PREROUTING -p tcp --dport 22 -j CONNMARK --set-mark 1234
iptables -t nat -A PREROUTING -p tcp --dport 22 -j REDIRECT --to-port 2222
(デフォルト)テーブルにfilter
タグがない場合、接続は拒否されます。
iptables -A INPUT -p tcp --dport 2222 -m connmark ! --mark 1234 -j REJECT
他のルールと矛盾しない限り、タグ番号が何であるかは問題ではありません。
(NATテーブルでもルールを作成することが可能かどうかはわかりませんDROP
。iptables v1.4.21はこれを許可しないようですが、カーネルではなくiptables自体から苦情が発生しますREJECT
。)
答え2
私は何らかの方法でバッチ処理したり、iptablesを直接実行するよりも設定を使用したいと思います。私はいつもフィルタテーブルのINPUTとOUTPUTのデフォルト操作としてDROPを設定します。だから私の解決策は次のとおりです。
ナット
...
-A 入力 -p tcp --dport 2222 -m connmark ! - マーク1234
-A ディクショナリパス -p tcp --dport 22 -j リダイレクト --to-port 2222
フィルター
...
-p tcp --dport 2222 -m connmark --mark 1234 -j 承諾