Ubuntu LTS 18を実行し、iptablesをファイアウォールとして使用するVPSがかなりあります.現在、私は外部IPアドレスからログインしようとしているポート22でSSHを実行しています。
IPTablesを介して任意のポート番号(2222など)をポート22にリダイレクトして、これらのヒットを制限したいと思います。何らかの理由でポート2222でリッスンするようにSSHスクリプトの設定を調整したくありません。
「ボーナス」として、ポート22をIP xxxx(現在1.1.1.1)にのみ開くことができることを願っています。
私は以下を試しました:
私のIPを除くすべてのIPを除外:
iptables -A INPUT -s 1.1.1.1/32 -i venet0 -p tcp -m tcp --dport 22 -j ACCEPT
これは素晴らしい作品です。
これで2222を22にリダイレクトします。
iptables -t nat -A PREROUTING -i venet0 -p tcp --dport 2222 -j REDIRECT --to-port 22
これはうまくいかないようです。リダイレクトはポート 22 を開く場合にのみ機能します。しかし、港はすべての訪問者に開かれています。
誰かがこれを説明できますか?ありがとうございます!
ベストアンサー1
INPUT
1つのIPアドレスだけがポート22にアクセスできるようにし、他のポートもローカルポート22にリダイレクトする場合は、ルールはNATの後に処理されるルールであるため、すべての人にポート22を開く必要がありますREDIRECT
。
1つのアプローチは次のとおりです。
iptables -t nat -A PREROUTING -s 1.1.1.1 --proto tcp --dport 22 -j ACCEPT
iptables -t nat -A PREROUTING --proto tcp --dport 22 -j REDIRECT --to-port 65535
iptables -t nat -A PREROUTING --proto tcp --dport 2222 -j REDIRECT --to-port 22
iptables -A INPUT --proto tcp --dport 22 -j ACCEPT
iptables -A INPUT --proto tcp --dport 65535 -j DROP
NATテーブルは最初に処理されるため、PREROUTING
ポート22の送信元アドレス1.1.1.1が許可されます(NATが実行されないことを意味します)。ポート22に到達しようとしている他のソースアドレスは、着信ポート22パケットをポート65535(残念ながらnatテーブルDROP
では使用できませんPREROUTING
)にリダイレクトする次のルールに達します。
次に、ポート2222への接続はポート22にリダイレクトされ、ポート22に着信するすべてのパケットが許可され、最後にポート65535(ポート22への「他の」接続)への着信接続が許可されます。
注 最初の入力規則の 1 つとして、次の行があるとします。
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
そうしないと、発信接続に送信元ポート65535があり、そのポートへの応答がブロックされます。または、65535ルールに一致するTCPフラグを追加してSYNパケットのみを一致させます。しかし、ESTABLISHED,RELATED
効率を得るためには、パケットができるだけ早くINPUTチェーンに入ることを許可することは常に良いです。
-i venet0
そのインターフェイスに着信パケットにのみ適用されるルールであれば、自由に追加してください。