iptablesを使用したネットワーク間パケットのルーティング

iptablesを使用したネットワーク間パケットのルーティング

iptablesのみを使用して一種のプロキシを作成しようとしています。

Linuxマシン(マイエージェント)には2つのポートがあります。

  • p2p1 がインターネットに接続されます。
  • em1はローカルネットワークに接続されています。

ローカルネットワークには2つのデバイスがあります(Linuxシステムを除く)。ここに接続するには、次のように入力する必要があります(インターネット上のすべてのコンピュータで)。

  • xx.xx.xx.xx:10001
  • xx.xx.xx.xx:10002

ここで、xx.xx.xx.xx はパブリック IP (動的 IP) です。

これらのデバイスは、次のIPにアクセスしてem1ポートのLinuxシステムからアクセスできます。

  • 192.168.3.100:80
  • 192.168.3.101:80

したがって、p2p1からxx.xx.xx.xx:10001にルーティングされたすべてのトラフィックは、em1から192.168.3.100にリダイレクトする必要があります。

また、パケットが戻ってくる方法を見つけるために、送信元IPなどを保存する必要があります。

これがIPテーブルスクリプトで使用されるものです。

iptables -t nat -F  # Clear out any old rules.

MyIP=10.27.155.200
MyPort=10001
DestIP=192.168.3.100
DestPort=80

iptables -t nat -A PREROUTING --dst $MyIP -p tcp --dport $MyPort -j DNAT --to-destination $DestIP:$DestPort
iptables -t nat -A POSTROUTING -p tcp --dst $DestIP --dport $DestPort -j SNAT --to-source $MyIP
iptables -t nat -A OUTPUT --dst $MyIP -p tcp--dport $MyPort -j DNAT --to-destination $DestIP:$DestPort

私のIPは動的であるため、明らかに問題がありますが、毎回ハードコードしています。また、パケットがコンピュータに返されると、元のソースにどのように到達したかはわかりません。

ここでどこに行くべきかわかりません。

答え1

ポートを転送する前に、次の2つの方法のいずれかを使用してカーネルで転送を有効にする必要があります。

  • /procrootで設定を変更します。再起動するまで持続します。

    echo 1 > /proc/sys/net/ipv4/ip_forward

  • 設定の変更/etc/sysctl.conf: これは持続します。

    接続net.ipv4.ip_forward=1/etc/sysctl.confに実行$ sudo sysctl -p

2番目にすべきことは、iptables次の構文を使用して転送ルールを設定することです。

iptables -t nat -A PREROUTING -i [external_interface] -p [protocol] \ 
--dport [external_port] -j DNAT --to-destination [internal_ip]:[internal_port]

したがって、スクリプトを使用してください。

external_iface=p2p1
iptables -t nat -A PREROUTING -i $external_iface -p tcp \
--dport $MyPort -j DNAT --to-destination ${DestIP}:${DestPort}

これにより、psp1のポート10001(IPアドレスに関係ありません)から192.168.3.100のポート80にすべてのトラフィックが転送されます。 192.168.3.100では、トラフィックはem1に割り当てられているすべてのIPアドレスからのものです。

\ルールには要件はありません。ルールを2行に分割するためにのみ使用されます。

関連情報