誰かが私を助けるか、少なくとも正しい方向を教えてくれることを願っています。ホストからインターネットへのアウトバウンドトラフィックを提供するAWSにNATインスタンスがあります。これは素晴らしい作品です。私がしなければならないのは、ホストとNATシステムから任意のポートを取得し(たとえば、ポート26を使用します)、ポート25のNATシステムから出るように変換することです。このルールは私が仕事をしたいものです:
iptables -A POSTROUTING -t nat -o eth0 -p tcp --dport 26 -j SNAT --to 172.17.2.125:25
現在のルールはIPアドレスを変更しますが、発信ポートは変更されていません。
リダイレクトはポートを幸せに変更しますが、送信元IPは変更しません(したがって、正しいパブリックIPにボックスを入れません)。
私はpfSenseや他のファイアウォール製品を使用することを検討しました。彼らはこれができると思いますが、「単純」に見えるものに比べて過剰なようです。クレイジーなようにインターネットを検索しようとしましたが、間違った用語を検索したようです。 「透明なプロキシ」を試しましたが、それも動作しないようです。
これを少し更新してください
HOST = 172.17.1.125、ポート26を介したアウトバウンドSMTP接続NAT = 172.17.2.126 DESTINATION = 216.1.2.3ポート25(標準SMTPポート)
必要なのは持っていることだ。
ホスト(内部) - > NAT - >ターゲット
これを正しく行うには、NATサーバーはポート26トラフィックを172.17.2.126ポート25に変換する必要があります。
答え1
テスト設定:2つのネットワーク名前空間ns0
(外部メールサーバー)ns1
(ホスト)。デフォルトのネットワーク名前空間(NAT)は転送とNATを実行します。名前空間を連結する2つのvethペア:
ns0 ---> <------ main ns -----> <--- ns1
veth0b --- veth0a veth1a --- veth1b
10.0.0.1 10.0.0.254 10.0.1.254 10.0.1.1
tcpdump
veth0aとveth1aから。 「メールサーバー」としてnc -k -l -p 9999
ポート9999をリッスンします。ns0
クライアントは、NATなし、デフォルトのランダムソースポートを介してnc
正常に接続されます。ns1
$ echo foo | nc 10.0.0.1 9999 -q0
veth*a: IP 10.0.1.1.60560 > 10.0.0.1.9999
veth*a: IP 10.0.0.1.9999 > 10.0.1.1.60560
ソースポートでのマッチング(驚きを避けるためにすべてのマッチングに追加しましたが-s
なくても機能します-s
):
# iptables -t nat -A POSTROUTING -o veth0a -s 10.0.1.1/32 -p tcp --sport 8001 -j SNAT --to 10.0.1.81:9900
$ echo foo | nc 10.0.0.1 -p 8001 9999 -q0
veth1a: IP 10.0.1.1.8001 > 10.0.0.1.9999
veth0a: IP 10.0.1.81.9900 > 10.0.0.1.9999
veth0a: IP 10.0.0.1.9999 > 10.0.1.81.9900
veth1a: IP 10.0.0.1.9999 > 10.0.1.1.8001
宛先ポートの一致(規則が宛先ポートを書き換えることができないため、「サーバー」に到達しません):
# iptables -t nat -A POSTROUTING -o veth0a -s 10.0.1.1/32 -p tcp --dport 7002 -j SNAT --to 10.0.1.82:9900
$ echo bar | nc 10.0.0.1 7002 -q0
veth1a: IP 10.0.1.1.38614 > 10.0.0.1.7002
veth0a: IP 10.0.1.82.9900 > 10.0.0.1.7002
veth0a: IP 10.0.0.1.7002 > 10.0.1.82.9900
veth1a: IP 10.0.0.1.7002 > 10.0.1.1.38614
ご覧のとおり、ソースアドレスとソースポートの両方が見事に変換されました。存在するSNAT(ソースNAT)、翻訳のみ可能源泉アドレスとポートはSが意味するもので、リンクされた文書に記載されているものです。対照的に、DNATでは以下を翻訳できます。目的地アドレスとポート。 SNATはPOSTROUTING veth0a
(この設定ではオンにする必要があります)で発生し、DNATはPREROUTING(この設定ではオンにする必要があります)veth1a
で発生します。したがって、これらの2つを1つのルールにまとめることはできず、PREROUTINGがPOSTROUTINGの前に発生するため、SNAT以降はDNATを実行できません。
私の考えでは、本当に欲しいものは様々なメールサーバーにアクセスすることですが、源泉標準の25ポートを別のポートと交換すると、アドレスを確認できます。目的地ポート。たとえば、mail.xxx.com:26
連絡先はmail.xxx.com:25
ある住所から来る必要があり、mail.xxx.com:27
連絡先はmail.xxx.com:25
別の住所から来る必要があります。 (スパム発送とは関係がないことを心から願っています...)したがって、送信元ポートは重要ではなく、指定された宛先ポートによって送信元アドレスが決まり、宛先ポートを再び25に変更する必要があります。これは正しいですか?その場合、natの仕組みのため、Linuxでは簡単にはできません。
スパムを処理するためにこのプログラムが必要ないと確信できる場合は、MTAソフトウェアの機能に応じて2つのより良いオプションを考えてみましょう。
答え2
私はこの問題を解決するのに役立つ人を見つけました。以下は、AWSがポートを発信するIPアドレスにマッピングするために使用するルールです。
まず、正しく機能するには、NATインスタンスを介して実行する必要があります。構成方法に関する多くのリソースがあります。
iptables -t mangle -A PREROUTING -p tcp --dport 27 -j MARK --set-mark 27
iptables -t nat -A PREROUTING -p tcp --dport 27 -j DNAT --to :25
iptables -t nat -A POSTROUTING -m mark --mark 27 -j SNAT --to-source 10.0.0.11