iptablesでどのように移植できますか?


118

ポート8001のppp0に着信する接続が、ポート8080のeth0の192.168.1.200にルーティングされるようにします。

これら2つのルールがあります

-A PREROUTING  -p tcp -m tcp --dport 8001 -j DNAT --to-destination 192.168.1.200:8080

-A FORWARD -m state -p tcp -d 192.168.1.200 --dport 8080 --state NEW,ESTABLISHED,RELATED -j ACCEPT

そしてそれは動作しません。私は何が欠けていますか?



(これはが、私はNPRタグで行くつもりですができ、プログラミングに関連する、不十分もちろん言い方けれども。)
ミハイLimbăşan

これについてはどうでしょうか。私は、インナーネットから呼び出されるEclipseでサーバーアプリケーションをデバッグできるように環境を設定しようとしているプログラマーです。十分近い?

確かに、それが「言い回しが悪い」という意味です...それに応じて質問を編集してください。
ミハイリンバシャン08

回答:


97

まず、転送が許可されているかどうかを確認する必要があります。

cat /proc/sys/net/ipv4/conf/ppp0/forwarding 
cat /proc/sys/net/ipv4/conf/eth0/forwarding 

両方が返さ1れる場合は問題ありません。そうでない場合は、次を実行します。

echo '1' | sudo tee /proc/sys/net/ipv4/conf/ppp0/forwarding
echo '1' | sudo tee /proc/sys/net/ipv4/conf/eth0/forwarding

第二に- テーブルにのみDNAT適用できますnat。そのため、テーブル仕様も追加してルールを拡張する必要があります(-t nat):

iptables -t nat -A PREROUTING -p tcp -i ppp0 --dport 8001 -j DNAT --to-destination 192.168.1.200:8080
iptables -A FORWARD -p tcp -d 192.168.1.200 --dport 8080 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

両方のルールはTCPトラフィックにのみ適用されます(UDPも変更したい場合は、-p udpオプションを設定して同様のルールを提供する必要があります)。

最後になりましたが、ルーティングの構成も重要です。タイプ:

ip route

192.168.1.0/24返されたルーティングエントリにあるかどうかを確認します。


16
私は個人的に好むsysctlような構文をsysctl net.ipv4.conf.eth0.forwarding=1
Doud

1
間違って入力されたルールを削除するにはどうすればよいですか?
ニコライ・レショフ14

2
2行目:「iptables -A FORWARD -p tcp -d 192.168.1.200 --dport 8080 -m state --state NEW、ESTABLISHED、RELATED -j ACCEPT」は、ファイアウォールの制限/セキュリティがない場合は不要です。ほとんどのホームLANに当てはまりますが、そうでない場合は-Aに注意してください。制限/セキュリティの後に追加され、動作しない可能性があります(そのため、代わりに-Iをチェックして、iptablesルールのIN FRONTを追加します)
THESorcerer

2
@ÁronLőrincz、いいえ。iptablesルールは、ブート時に明示的にロードされない限り、揮発性です。
sherrellbc

1
@Nickolai Leschov、同じ置換-Aを入力-D
アレクセイ・

14

私はあなたが欲しいと思う:

iptables -A FORWARD -m state -p tcp -d 192.168.1.200 --dport 8080 --state 
    NEW,ESTABLISHED,RELATED -j ACCEPT

iptables -t nat -A PREROUTING -p tcp --dport 8001 -j DNAT --to-destination
    192.168.1.200:8080

2
うーん...それは私がすでに持っているものです。iptables-restoreを使用してロードするので、それぞれが独自のセクションにありますが、それが上で書いたものです。

さて、元の構文は見栄えが悪くなりました。ルールで-i ppp0を試しましたか?問題は正確に何ですか?
ロバートギャンブル

13

ポストルーティングの送信元アドレスSNAT 'ingを忘れます:

sysctl net.ipv4.ip_forward=1
yours_wan_ip=101.23.3.1
-A PREROUTING  -p tcp -m tcp -d $yours_wan_ip --dport 8001 -j DNAT --to-destination 192.168.1.200:8080

-A FORWARD -m state -p tcp -d 192.168.1.200 --dport 8080 --state NEW,ESTABLISHED,RELATED -j ACCEPT

-A POSTROUTING -t nat -p tcp -m tcp -s 192.168.1.200 --sport 8080 -j SNAT --to-source $yours_wan_ip

また、192.168.1.200アドレスを持つコンピューターのLinuxファイアウォールをデフォルトゲートウェイとして設定することを忘れないでください。


あなたはPOSTROUNTINGステップで逆にそれを得ました。この時点では会話はまだでは--destinationなく約です--source
sherrellbc

6

Linuxルーターでこれを行うために、次のbashスクリプトを作成しました。WAN IPが自動的に推測され、選択を確認してから次に進みます。

#!/bin/bash

# decide which action to use
action="add"
if [[ "-r" == "$1" ]]; then
  action="remove"
  shift
fi

# break out components
dest_addr_lan="$1"
dest_port_wan="$2"
dest_port_lan="$3"

# figure out our WAN ip
wan_addr=`curl -4 -s icanhazip.com`

# auto fill our dest lan port if we need to
if [ -z $dest_port_lan ]; then
  dest_port_lan="$dest_port_wan"
fi

# print info for review
echo "Destination LAN Address: $dest_addr_lan"
echo "Destination Port WAN: $dest_port_wan"
echo "Destination Port LAN: $dest_port_lan"
echo "WAN Address: $wan_addr"

# confirm with user
read -p "Does everything look correct? " -n 1 -r
echo    # (optional) move to a new line
if [[ $REPLY =~ ^[Yy]$ ]]; then
  if [[ "remove" == "$action" ]]; then
    iptables -t nat -D PREROUTING  -p tcp -m tcp -d $wan_addr --dport     $dest_port_wan -j DNAT --to-destination $dest_addr_lan:$dest_port_lan
    iptables -D FORWARD -m state -p tcp -d $dest_addr_lan --dport     $dest_port_lan --state NEW,ESTABLISHED,RELATED -j ACCEPT
    iptables -t nat -D POSTROUTING -p tcp -m tcp -s $dest_addr_lan --sport     $dest_port_lan -j SNAT --to-source $wan_addr
    echo "Forwarding rule removed"
  else
    iptables -t nat -A PREROUTING  -p tcp -m tcp -d $wan_addr --dport     $dest_port_wan -j DNAT --to-destination $dest_addr_lan:$dest_port_lan
    iptables -A FORWARD -m state -p tcp -d $dest_addr_lan --dport     $dest_port_lan --state NEW,ESTABLISHED,RELATED -j ACCEPT
    iptables -t nat -A POSTROUTING -p tcp -m tcp -s $dest_addr_lan --sport $dest_port_lan -j SNAT --to-source $wan_addr
    echo "Forwarding rule added"
  fi
else
  echo "Info not confirmed, exiting..."
fi

スクリプトの使用は単純で、コピーしてファイルに貼り付けるだけです。

# chmod +x port_forward.sh
# ./port_forward.sh 192.168.1.100 3000
... confirm details ... press y
# Forwarding rule added

同じルールを削除するには

# ./port_forward.sh -r 192.168.1.100 3000
... confirm details ... press y
# Forwarding rule removed

これにより、各ルーターの時間を節約できると思いました。


2

私は、MACHINE_AにサービスがMACHINE_Bで物理的に実行されていると考えさせるタスクを行いましたが、すべてのリクエストを透過的にMACHINE_Cに再ルーティングしました。

トリックは、マスケレードを使用することでした。

sysctl net.ipv4.ip_forward=1

iptables -t nat -A PREROUTING -p tcp -d MACHINE_B --dport 443 -j DNAT --to-destination MACHINE_C

iptables -t nat -A POSTROUTING -s MACHINE_A -o INTERFACE_NAME -j MASQUERADE

コマンドを微調整したい場合があることに注意してください。

  1. 特定のインターフェイスでのみパケット転送を許可します。例えば:

    sysctl net.ipv4.conf.eth0.forwarding=1
    
  2. MACHINE_Aだけでなく、他のすべてのユーザーもポート転送を使用できるようにするには、以下を削除します。

    -s MACHINE_A
    

1

試して

echo "1" > /proc/sys/net/ipv4/conf/ppp0/forwarding
echo "1" > /proc/sys/net/ipv4/conf/eth0/forwarding

これらのファイルは、インターフェース間でパケットを転送することが許可されていることをカーネルに伝えます。


0

このコマンドは私には機能しません:

-A POSTROUTING -t nat -p tcp -m tcp -s 192.168.1.200 --sport 8080 -j SNAT --to-source $yours_wan_ip

私は2つのLANインターフェイスを持っています。

iptables -t nat -A POSTROUTING -o $LAN_IF -p tcp -m tcp --dport $FW_PORT -j SNAT --to-source $LAN_IP
  • LAN_IF-LANインターフェース(例:eth1、br0 ...)
  • FW_PORD-転送されたポート(宛先ホスト上)
  • LAN_IP-LANインターフェース上のIPアドレス(ルーター上)

もちろん、前もって進むことも必要です:)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.