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つの方法のいずれかを使用してカーネルで転送を有効にする必要があります。
/proc
rootで設定を変更します。再起動するまで持続します。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行に分割するためにのみ使用されます。