web-dev-qa-db-ja.com

AWS VPCを介したポート転送NAT

はい、私はすでにインターネットを精査し、人気のあるIPTables/DNATガイド/ページ/投稿のほとんどを読みました。

私の問題

概要複数のサブネットを持つVPCがあります。特に1つのサブネットでは、インターネット接続にEIPが必要です。このサブネットにWebサーバーがあります。 NATのの後ろからアクセスする必要があります(同じサブネット内にもあり、EIPがあります)。特定のポート宛ての着信パケットが別のホストに送信されるようにNATを設定しようとしています(本質的にはDNATが必要です)

パート1:VPC内:

NATアクセス可能なSSHプロキシを介してWANインスタンスにSSH接続しました。以下は、Amazon NATインスタンスに付属するデフォルトのIPTablesです。特別なことは何もありません。予想どおりPOSTROUTEルールのみです。 NATインスタンスにはoneインターフェースしかありません。 eth0(そしてlo、しかし存在しないふりをしましょう)

[root@IP_NAT ec2-user]# iptables -t nat -L --line-numbers
Chain PREROUTING (policy ACCEPT)
num  target     prot opt source               destination         

Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
num  target     prot opt source               destination     

OK。次に、2つのポート転送を追加して、NATの背後でWebサーバーにアクセスできるようにします

[root@IP_NAT ec2-user]# iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination IP_WEBSERVER:80
[root@IP_NAT ec2-user]# iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 443 -j DNAT --to-destination IP_WEBSERVER:443

正しい!私の仕事をチェックする時間:

[root@IP_NAT ec2-user]# iptables -t nat -L --line-numbers
Chain PREROUTING (policy ACCEPT)
num  target     prot opt source               destination         
1    DNAT       tcp  --  anywhere             anywhere             tcp dpt:http to:IP_WEBSERVER:80
2    DNAT       tcp  --  anywhere             anywhere             tcp dpt:https to:IP_WEBSERVER:443

Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
num  target     prot opt source               destination         
1    MASQUERADE  all  --  ip-10-0-0-0.us-west-1.compute.internal/16  anywhere  

したがって、問題なく動作するように見えます。例外として、彼らはしません。 :(。natとWebサーバーの間で心に込めてwget/telnet/ping/sshを実行できます。NATにsomeポートでtelnetを実行できますが、その他はタイムアウト。NATインスタンスを管理するAWSセキュリティグループが正しいポートの入出力を許可していることをtriple確認しました。テストのためだけにallトラフィックを許可しましたすべてのポートで両方のイン/アウト私はまだ同じ問題を抱えています。

ウェブサーバーのログには何も表示されません。

私のlocalマシンからの出力の一部を次に示します。

LOCAL_USER@LOCAL_Host:~$ telnet AWS_EIP 443
Trying AWS_EIP...
^C                (time out, here)
LOCAL_USER@LOCAL_Host:~$ telnet AWS_EIP 80
Trying AWS_EIP...
^C                (time out, here)
LOCAL_USER@LOCAL_Host:~$ telnet AWS_EIP 22
Trying AWS_EIP...
Connected to AWS_EIP.
Escape character is '^]'.
SSH-2.0-OpenSSH_6.2
asd
Protocol mismatch.
Connection closed by foreign Host.

したがって、ポート22でTCP接続を開こうとすると、すぐに機能します。 iptablesがこれらのポートでトラフィックを明示的に許可しているにもかかわらず、ポート443または80でNATが「リッスン」しないのはなぜですか?

役立つ情報の最後のビットとして、sysctl.confファイルを次に示します。

[root@IP_NAT ec2-user]# cat /etc/sysctl.conf 

# Controls IP packet forwarding
net.ipv4.ip_forward = 1

# Controls source route verification
net.ipv4.conf.default.rp_filter = 0

# Do not accept source routing
net.ipv4.conf.default.accept_source_route = 1

# Controls the System Request debugging functionality of the kernel
kernel.sysrq = 0

# Controls whether core dumps will append the PID to the core filename.
# Useful for debugging multi-threaded applications.
kernel.core_uses_pid = 1

# Controls the use of TCP syncookies
net.ipv4.tcp_syncookies = 1

なぜパケットが私のウェブサーバーに届かないのかについて何か考えはありますか?

3
user1521764

あなたの質問の情報から、私はあなたが2つのEIPを使用していると思います。 1つはNATサーバー用で、もう1つはWebサーバー用です。その場合、NATサーバーと世界中の誰もが接続できるはずです。すべてのファイアウォール/セキュリティグループが正しいと想定して、EIP罰金を介してWebサーバーに接続します。

今、私はNATサーバーが実際に何のためにあるのか混乱しています。このNATの背後にあるホストのグループがWebサーバーで、すべてのホストにそれぞれ独自のEIPを持たせたくない場合は、2つのVPCサブネットとNATサーバーがSNATを実行する必要があるようです( MASQUERADEルールで何をしているのかを確認します。この設定については、 http://docs.aws.Amazon.com/AmazonVPC/latest/UserGuide/VPC_NAT_Instance.html に記載されています。

基本的な要件は次のとおりです(前のジョブでこれを実行したことがありました)。

  • A NATゲートウェイサーバーが必要です。IP転送をiptablesのMASQUERADEルールと共に有効にする必要があります(上記のように、DNATルールなし)。
  • 少なくとも2つのサブネットが必要です:
    • VPCルートテーブル内のそのサブネットのデフォルトルートがインターネットゲートウェイを指す1つの「パブリック」サブネット。このサブネット内のすべてのホストがインターネットにアクセスするには、EIPが必要です。 NATゲートウェイサーバーはこのサブネット内にある必要があります。
    • デフォルトルートがNATゲートウェイサーバーを指す1つの「プライベート」サブネット。これは、ホームネットワークのDSLルーターのように、NATによって隠されたネットワークです。そのサブネット内のすべてのホストがアクセスしますNATとそのEIPを介したインターネット(または、プライベートRFC1918アドレスの代わりにパブリックEIPアドレスが使用されている場合は、パブリックサブネット内のホスト)。

最後に、WebサーバーにEIPを与えないようにしたい場合、個人的にはテストしていませんが、Webサーバーをプライベートサブネットに移動して、内部を指すようにDNATルールを変更します住所。明らかに、VPCサブネット、ルートなどは、上記のAWSドキュメントに従って構成する必要があります。

3
martian111
[root@IP_NAT ec2-user]# iptables -t nat -L --line-numbers
Chain PREROUTING (policy ACCEPT)
num  target     prot opt source               destination         
1    DNAT       tcp  --  anywhere             anywhere             tcp dpt:http to:IP_WEBSERVER:80
2    DNAT       tcp  --  anywhere             anywhere             tcp dpt:https to:IP_WEBSERVER:443

Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
num  target     prot opt source               destination         
1    MASQUERADE  all  --  ip-10-0-0-0.us-west-1.compute.internal/16  anywhere  

回答

この問題に遭遇する将来の人々のために:あなたのセキュリティグループがあなたが正しいパブリックIPを介して戻ってくることを許可していることを確認してください。着信IPのCIDR範囲を入力しましたが、これは上記と同じ構成をすべて使用して機能しました。注:ウェブアプリまたはnatインスタンスのパブリックIPは、nestatで見つけたIPとは異なります。

0
James Edards