web-dev-qa-db-ja.com

iptablesでどのようにポートフォワードできますか?

ポート8001のppp0に着信する接続を、ポート8080のeth0の192.168.1.200にルーティングする必要があります。

私はこれら二つのルールを持っています

-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

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

118
Stu

まず最初に-転送がまったく許可されているかどうかを確認する必要があります。

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

2番目のこと-DNATnatテーブルにのみ適用できます。そのため、テーブル仕様も追加してルールを拡張する必要があります(-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があるかどうかを確認します。

97
oo_olo_oo

あなたが望むのは:

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
15
Robert Gamble

ポストルーティングの送信元アドレスSNATを忘れてしまった:

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ファイアウォールをデフォルトゲートウェイとして設定することを忘れないでください。

14
Zealotous

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

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

6
Nullivex

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
    
3

試す

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

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

1
Adam Liss

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

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

私は2つのLANインターフェースを持ち、次のように書くとFORWARDが機能します。

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アドレス

もちろんPREROUTINGとFORWARDも必要です:)

0
Andrew