web-dev-qa-db-ja.com

Linux:異なるネットワーク上の2つのホスト間でiptablesを使用してポート転送を移植する方法

私はほぼ必死です...私は約2日間iptables転送の例を読んでいて、単純なポート転送を行うことができません。異なるネットワーク上に2台のマシンがあります。 server1(ip 195.21.2.41のS1)は私の家にあり、server2(ip 10.234.141.126のs2)はAmazon EC2にあります。

S2に向かうすべてのトラフィックをs1に転送する必要があります。私はこれを試しました:

すべてのルールのフラッシュ、転送するカーネルパラメータのアクティブ化、ポストルーティングおよびプレルーティングルールの追加

iptables -F -t nat
iptables -F
echo 1 > /proc/sys/net/ipv4/ip_forward 
iptables -t nat -A POSTROUTING -d 195.21.2.41 -j MASQUERADE
iptables -t nat -A PREROUTING -i eth0 -d 10.234.141.126 -p tcp --dport 80 -j DNAT --to 195.21.2.41

オプションで私も追加しました:

iptables -A FORWARD -p tcp -i eth0 -d 195.21.2.41 --dport 80 -j ACCEPT

それから私は試しました:

telnet 10.234.141.126 80

しかし、うまくいきませんでした。なぜこれが機能しないのですか?

更新:いくつかのテストを見てみましょう:

[root@ip-10-234-141-216 ~]# telnet 195.21.2.41 80
Trying 195.21.2.41...
Connected to 195.21.2.41.
Escape character is '^]'.
[root@ip-10-234-141-216 ~]# iptables -F -t nat
[root@ip-10-234-141-216 ~]# iptables -F
[root@ip-10-234-141-216 ~]# echo 1 > /proc/sys/net/ipv4/ip_forward 
[root@ip-10-234-141-216 ~]# /sbin/iptables -t nat -A PREROUTING -i eth0 -p tcp -d 10.234.141.126 --dport 80 -j DNAT --to-destination 195.21.2.41
[root@ip-10-234-141-226 ~]# /sbin/iptables -t nat -A POSTROUTING -j MASQUERADE
[root@ip-10-234-141-216 ~]# /sbin/iptables -A FORWARD -i eth0 -p tcp --dport 80 -j ACCEPT
[root@ip-10-234-141-216 ~]# 
[root@ip-10-234-141-216 ~]# telnet 10.234.141.126 80
Trying 10.234.141.126...
telnet: connect to address 10.234.141.126: Connection refused

UPDATE 2ルート出力:

[root@ip-10-234-141-216 ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.234.141.0    0.0.0.0         255.255.254.0   U     0      0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 eth0
0.0.0.0         10.234.141.1    0.0.0.0         UG    0      0        0 eth0
3
Fakada

すべての着信トラフィックを別のマシンに転送される指定されたポートにリダイレクトする必要があるだけの場合は、iptablesの代わりにrinetdを試してください。これはトラフィックリダイレクトサーバーです。

3
Stone

なぜiptablesを使用しないのですか?

iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 3306 -j DNAT --to 192.168.7.101:3306

単発の仕事:

iptables -t nat -A POSTROUTING -j MASQUERADE
echo "1" > /proc/sys/net/ipv4/ip_forward
sysctl net.ipv4.ip_forward=1
1
Qian Chen

同じルーターマシンからtelnetを実行するため、機能しません。このルートマシンを次の希望として使用するすべてのマシンから正常に機能するか、これらの機能を実行するだけの場合は、このルールを追加できます。

/sbin/iptables -t nat -A OUTPUT -i eth0 -p tcp -d 10.234.141.126 --dport 80 -j DNAT --to-destination 195.21.2.41
1
AhmedShabana

現在、同じ問題が発生しています。私はそれを解決しました

echo 1 >| /proc/sys/net/ipv4/ip_forward
iptables -t nat -A  PREROUTING -p tcp -d 47.168.137.12 --dport 8081 -j DNAT --to 47.168.137.11:8086
iptables -t nat  -A POSTROUTING -j MASQUERADE
1
Ahmet Karakaya

--toではなく--to-destinationを使用していることを除いて、あなたのルールは私にはよく見えます。 iptablesの別のバージョンを使用している可能性がありますが、man 8 iptables(v.1.4.7)によると、

   --to offset
          Set the offset from which it starts looking for any matching. If not passed, default is the packet size.

次に、DNATセクションで:

   --to-destination [ipaddr][-ipaddr][:port[-port]]
          which can specify a single new destination IP address, an inclusive range of IP addresses, and optionally, a port range  (which  is  only
          valid  if the rule also specifies -p tcp or -p udp).  If no port range is specified, then the destination port will never be modified. If
          no IP address is specified then only the destination port will be modified.

          In Kernels up to 2.6.10 you can add several --to-destination options. For those  kernels,  if  you  specify  more  than  one  destination
          address, either via an address range or multiple --to-destination options, a simple round-robin (one after another in cycle) load balanc-
          ing takes place between these addresses.  Later Kernels (>= 2.6.11-rc1) don’t have the ability to NAT to multiple ranges anymore.

これは私が試してみるものです:

/sbin/iptables -t nat -A PREROUTING -i eth0 -p tcp -d 10.234.141.126 --dport 80 -j DNAT --to-destination 195.21.2.41
/sbin/iptables -t nat -A POSTROUTING -j MASQUERADE
/sbin/iptables -A FORWARD -i eth0 -p tcp --dport 80 -j ACCEPT

また、ファイアウォールで接続が妨げられていないことを確認するために、10.234.141.126から宛先にTelnetで接続してみます。

telnet 195.21.2.41 80
0