web-dev-qa-db-ja.com

外部TCPポート80をループバック(127.0.0.1)ポート8080にルーティングする方法は?

実際のIPを使用したテストVDSボックスがあります。物理インターフェイスポート80でWebサーバーを起動すると、そのIPアドレス(およびデフォルトのポート80)を介して別のコンピューターから開くことができます。

python -m SimpleHTTPServer 80

しかし、物理インターフェイスからポート80を再構築しようとすると、eth0 to loopback 127.0.0.1 port 8080 iは別のコンピューターからポート8080に接続できますが、ポート80には接続できません。これはエンドレスな「接続」です。リダイレクトが発生しないようです:

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 127.0.0.1:8080
python -m SimpleHTTPServer 8080

私は何を間違っているのですか? :(

P.S. 「127.0.0.1:8080」でサーバーをバインドすると同じ結果が生成されますが、「0.0.0.0:8080」で実行されているサーバーは「127.0.0.1:8080」にリダイレクトされた接続を受け入れるため、問題ありません。私の知る限り。 :(

iptables -L結果:

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

iptables -t nat -L結果:

Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
DNAT       tcp  --  anywhere             anywhere             tcp dpt:http to:127.0.0.1:8080

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination

netstat -nlp結果:

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      676/sshd        
tcp6       0      0 :::22                   :::*                    LISTEN      676/sshd        
Active UNIX domain sockets (only servers)
Proto RefCnt Flags       Type       State         I-Node   PID/Program name    Path
unix  2      [ ACC ]     STREAM     LISTENING     7964     600/acpid           /var/run/acpid.socket
unix  2      [ ACC ]     STREAM     LISTENING     6590     1/init              @/com/ubuntu/upstart
unix  2      [ ACC ]     SEQPACKET  LISTENING     6760     231/udevd           /run/udev/control
unix  2      [ ACC ]     STREAM     LISTENING     7030     345/dbus-daemon     /var/run/dbus/system_bus_socket

ifconfig -a結果:

eth0      Link encap:Ethernet  HWaddr 00:16:3e:da:1a:98  
          inet addr:5.14.223.181  Bcast:5.14.223.255  Mask:255.255.255.0
          inet6 addr: fe80::140:3eff:febe:201a/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:371264 errors:0 dropped:59 overruns:0 frame:0
          TX packets:2093 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:17377545 (17.3 MB)  TX bytes:214428 (214.4 KB)
          Interrupt:25 

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:10 errors:0 dropped:0 overruns:0 frame:0
          TX packets:10 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:552 (552.0 B)  TX bytes:552 (552.0 B)
3
grigoryvp

私はしばらくの間この問題を解決しようとしてきましたが、最終的にサーバープロセスをローカルホストにバインドしないことに決めました(0.0.0.0:PORTを使用しました)が、しばらくの間、着信パケットが実際にどこに行くのかわかりませんでした正しいNATルールがあると思ったので。

答えは、カーネルがそれらを martian packet としてインターセプトし、それらをサイドに破棄していたことでした。

このサイト には、火星のパケットのロギングを設定するための非常に簡単な一連の手順があります。

別の解決策は、nginxをリバースプロキシとして使用することです。その場合、宛先ポートが80のパケットがiptablesファイアウォールを通過できるようにします(FILTERとNAT=ステージの間にドロップしていないことを確認してください-次のコマンドで確認できます。 Sudo iptables -t nat -L -vまたはSudo iptables -t filter -L -v)。そこから、nginxはすべてのインターフェイスでポート80宛てのトラフィックをリッスンします。着信HTTPリクエストに関連するものを見つけたら、proxy_passディレクティブを使用して、nginxにこのリクエストをlocalhost:8080(127.0.0.1:8080)に転送させることができます。

@MonomiDevの投稿 here は、これを可能にする実際のnginx構成を提供します-そして、nginxがインストールされていない場合、ここにスタックとオンラインの両方でたくさんのチュートリアルがあり、開始しました。

2
JacobWuzHere

ルールをこれに置き換えるだけです。

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080

動作するはずです。これにより、eth0上のすべての80ポートトラフィックが、Tomcatを実行しているlocalhostの8080ポートにリダイレクトされます。


Iptablesなしでこれを行うもう1つの方法(iptablesでそれが可能かどうかさえわからないため)は、xinetdサービスを使用することです。これを使用するには、マシンにxinetdをインストールします(通常、デフォルトでインストールされています)。次のようなファイルを作成します。

 # vim /etc/xinted.d/Tomcat

このコンテンツをファイルに入れます:

service Tomcat
{
    socket_type             = stream
        wait                    = no
        user                    = root
        redirect                = 127.0.0.1 8080
        bind                    = 10.31.33.101 80
}

Xintedサービスを再起動するだけです。

 # service xinetd restart

そしてそれは魅力のように機能します。

4
Napster_X

これを行うとどうなりますか:

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8080 -j REDIRECT --to-port 80  --match comment --comment "Explain."
1
Halfgaar

このようなDNATルールを最後に使用したとき、POSTROUTINGにSNATルールを設定して、正しく機能させる必要がありました。

0
John