ポートから別のホスト:ポートへのすべてのTCPトラフィックルーティング

ポートから別のホスト:ポートへのすべてのTCPトラフィックルーティング

10.0.1.110.0.1.2リモートサーバー()とローカルコンピューター()の間にVPNを作成して、サーバーがローカルコンピューターに接続するか、その逆も可能にするワイヤーガード構成があります。

サーバーがポートから着信したすべてのTCP接続を8000自分のローカルコンピュータにルーティングしたいと思います。

私が試したこと:

この回答:

iptables -t nat -I PREROUTING -p tcp --dport 8000 -j DNAT --to-destination 10.0.1.2:8000
iptables -t nat -I POSTROUTING -p tcp --dport 8000 -d 10.0.1.2 -j MASQUERADE

この回答もあります(quora):

iptables -t nat -A PREROUTING -p tcp --dport 8000 -j DNAT --to-destination 10.0.1.2:8000
iptables -t nat -D POSTROUTING -j MASQUERADE

またこれを試しました:

iptables -t nat -A POSTROUTING -p tcp -d 10.0.1.2 --dport 8000 -j MASQUERADE
iptables -t nat -A PREROUTING -p tcp --dport 8000 -j DNAT --to-destination 10.0.1.2:8000

どちらも機能しません(インターネット経由でアクセスできません)。

もちろん、nginxこれを行うためにサーバーを設定することはできますが、Webソケット接続のように、私が望むほど信頼性が高く強力ではありません。

VPN接続とファイアウォールはうまく機能します。curlリモートサーバーのシェルからローカルコンピュータのサーバーにアクセスでき、リモートサーバー8000のポートから起動されたHTTPサーバーにアクセスできます。道sysctl net.ipv4.ip_forward1

答え1

たとえば、テーブルを制御できる他のツールを実行しているかどうかは説明していませんfirewalld。これにより、ルールが適用されない場合があります。

FORWARDまた、メインテーブルのルールについて話しているのを見ることはできません。

iptablesの完全なリストを見ることができませんでした。 NATルールの前に適用されるチェーンの前部からDROPまたはREJECTに移動する他のルールがある可能性があります。

(RHEL 7で独自のファイアウォールを構築する方法について詳しく説明します。https://www.sweharris.org/post/2017-05-07-home-grown-router/ - 簡単な要約は次のとおりです。)

通常、最初から始める場合は、NATを開始する前にマスターテーブルを設定する必要があります。 INPUTチェーンはコンピュータに向かうパケット用で、OUTPUTチェーンはコンピュータで発生するパケット用で、FORWARDチェーンはパケット用です。時間旅行あなたのマシン。

私の場合は、3つすべてを同じに設定しました。

iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
iptables -A OUTPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -m conntrack --ctstate INVALID -j DROP
iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate INVALID -j DROP

開始トラフィックを許可する必要があります。

iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -i internal_interface -j ACCEPT
iptables -A INPUT -p icmp -j ACCEPT
iptables -A FORWARD -i internal_interface -j ACCEPT
iptables -A FORWARD -i external_interface -m conntrack --ctstate DNAT -j ACCEPT

eth0私は「external_interface」を使用します。これは、VPN、トンネル、tun0またはブリッジ(私が使用するもの)などのインターフェイスです。

これにより、「内部」のトラフィックが外部に到達し、外部から応答することができます。

NATを起動して、「内部」マシンが「外部」マシンにアクセスできるようになりました。

iptables -t nat -A POSTROUTING -o external_interface -j MASQUERADE

これにより、ローカルネットワークを離れて外部の世界に向かうすべてのトラフィックが外部インターフェイスのアドレスにNATされます。

これで、すでに試したのと同様のルールを使用して、外部トラフィックがファイアウォールの背後にある内部コンピュータに到達することを許可できます。

例えば

iptables -t nat -A PREROUTING -p tcp -m tcp --dport 443 -j DNAT --to-destination 10.0.0.2:443

これらの規則の一部は必ずしも必要ではありませんが、間違った形式のパケット、内部が外部(および外部からの応答)に到達する機能、ポート転送を介して内部の特定のサービスに到達する外部の機能をフィルタリングすることがあります。 。

関連情報