iptables、ループバックからポートをリダイレクトする方法は?

iptables、ループバックからポートをリダイレクトする方法は?

主なルールは次のとおりです。

OUTIF=eth0
 /sbin/iptables --policy INPUT DROP
 /sbin/iptables --policy FORWARD DROP
 /sbin/iptables --policy OUTPUT ACCEPT
 /sbin/iptables -A INPUT -i lo -j ACCEPT
 /sbin/iptables -A INPUT -i $OUTIF -m state --state RELATED,ESTABLISHED -j ACCEPT

lomysqlがポート3306でリッスンするようにしたいと思います。また、ロボットから離れていることを望むので、WANインターフェイス()eth0のポート33060でリッスンしたいと思います。

成功せずに何度もリダイレクトしようとしました。たとえば、

/sbin/iptables -A INPUT -p tcp -i $OUTIF --dport 34306 -j ACCEPT
/sbin/iptables -A PREROUTING -t nat -p tcp -s 0/0 --dport 34306 \
               -j DNAT --to 127.0.0.1:3306

どうすればいいですか?

編集する:

使いたいガンディールしかし、まだiptablesを使ってこれを行う方法を知りたいです。

ベストアンサー1

これは機能しますが、外部からポート 3306 へのアクセスを許可する場合にのみ可能です。しかし、これはうまくいきません)

iptables -t nat -A PREROUTING -p tcp --dport 34306 --syn -j DNAT --to :3306

しかし、最終的にやりたいことは:(しかし、それも動作しません)

iptables -t nat -A PREROUTING -p tcp --dport 34306 --syn -j DNAT --to 127.0.0.1:3306

つまり、外部インターフェイスのポート34306に送信されたパケットを127.0.0.1、ポート3306にリダイレクトしようとします。この方法は機能しますが、宛先が127.0.0.1に書き換えられると、パケットは火星パケット(外部から入った、宛先127.0.0.1)になります。火星パケットは正常に静かにフィルタリングされ、あなたは本当にそれを望んでいます。

ファイアウォールタグに関連するよりバイパス的な解決策があります。理論:パケットが外部インターフェイスでポート34306 / tcpを呼び出すと、それが許可されているとマークされ、3306 / tcpから来たように見えるように書き直されます。 3306/tcp へのトラフィックマーク付き許可される。 3306/tcp への他のすべてのトラフィックは拒否されます(明示的またはデフォルトのポリシーを介して暗黙的に)。パスワード:

IFACE=eth0 # or whatever
HIPORT=34306
REALPORT=3306
MARK=42 # not-so-random random number
iptables -t mangle -A PREROUTING -p tcp -i $IFACE --dport $HIPORT -j MARK --set-mark $MARK
iptables -t nat -A PREROUTING -p tcp --dport $HIPORT --syn -j DNAT --to :$REALPORT
iptables -A INPUT -p tcp -m mark --mark $MARK -j ACCEPT
iptables -A INPUT -p tcp --dport $REALPORT -j DROP # explicitly dropping

最後のルールは、許可されていないパケットに対してアクションを取ることができる場所です。私は削除されたすべてのパケットを記録するのが好きなので、私のチェーンは最後の2つのルールa-j LOGとに属します-j DROP。だから私の場合は必要ではありませんが、あなたのマイレージはもちろん変わります。

私はこれをテストしましたが、私の設定に適しています。これは予想より少しバイパス的ですが、これはネットフィルターの寿命です。

使用する場合ステータスフィルタリング--synルール3(-m markチェーン内INPUT)に追加し、ヘルスチェックルールの前に貼り付けます。ルール4を使用してパケットを明示的に破棄/拒否し、ステートフルファイアウォールを実装する場合は、--synこのルールも追加する必要があります。より複雑ですが(8バイト全体)、タグ解決規則は各TCP接続のSYN(最初)パケットにのみ適用されます。承認/拒否決定が行われると、ステートフルチェックルールは残りのタスクを実行するため、ファイアウォールはすべてのパケットに対してチェックフラグを保持する必要はありません。 CPUサイクルを無駄にする理由はなく、ネットワーク性能を高く保つことができます。

注意事項:

  1. あなたの質問にポート33060が記載されていますが、コードはポート34306を使用します。私は後者を使用しました。
  2. MySQLが実際に127.0.0.1:3306を受信して​​いることを確認してください。ローカル通信用にインターネットドメイン(TCP / IP)ソケットの代わりにUnixドメインソケットを使用でき、ネットワークに接続されていません。
  3. 必要なのはDNATパケットだけですSYN。 Stateful NAT は他のすべてのパケットを自動的に変換します。これにより、作業が少し速くなります。
  4. -s 0/0を明示的に指定する必要はなく、ソースを完全に無視するだけです。

問題は次のとおりです。あいまいなセキュリティは厳しいホステスです。 MySQLがリッスンするポートを変更すると、実際に自分自身を保護することはできません。ポートスキャナは自動化されたデバイスなので、システム内のすべてのポートをスキャンすることには注意しません。 :)安全な方法でトンネルをssh使用することをお勧めします-L。より高度な機能が必要な場合は、VPNを使用してください。しかし、時には人生がレモンを与え、ネットフィルターでレモネードを作らなければならないこともあります。 (それはあなたが持っている数少ないものの1つかもしれません。)できないそれにしてください)

おすすめ記事