サーバーから出てローカルホスト上のサーバーに戻るように設定されたトラフィックをリダイレクトする方法はありますか(できれば元の宛先から来ているかのように)?
基本的に、たとえばポート80でリッスンし、たとえば1.2.3.4に送信されたトラフィックを受信する独自のソフトウェアをセットアップできるようにしたいと思います。
したがって、いくつかのコードの例として。サーバーは次のとおりです。
my $server = IO::Socket::INET->new(
LocalAddr => '127.0.0.1',
LocalPort => '80',
Listen => 128,
);
そして、それは次のクライアントからトラフィックを受信します:
my $client = IO::Socket::INET->new(
PeerAddr => 'google.com',
PeerPort => '80',
)
したがって、クライアントをgoogle.comに接続するのではなく、ローカルホストで同じサーバーをリッスンしているサーバーに接続します。
私の意図は、これを使用してリモートホストに接続しているマルウェアをキャッチすることです。
トラフィックを127.0.0.1にリダイレクトする必要は特にありませんが、同じマシンがリッスンできるIPにリダイレクトする必要があります。
編集:私は以下を試しましたが、機能しません-
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 127.0.0.1:80
iptables -t nat -A POSTROUTING -j MASQUERADE
IptablesREDIRECTターゲットを使用します。
iptables -t nat -A OUTPUT -p tcp -d 1.2.3.4 --dport 80 -j REDIRECT
Iptablesのマンページでは、ポートを変更できるREDIRECTの単一のオプションを指定しています。
そのオプションは--to-ports
。
私が理解している限り、TPROXY iptables機能とIP_TRANSPARENTソケットを使用して、完全に透過的なリダイレクトを実現できます(NATを使用せずに)。このようにして、アプリケーションは、宛先IPが別のボックスであった場合でもトラフィックを受け入れる特別なソケットを作成し、iptablesルールを使用して、最初のローカルインターフェイスのポート80の宛先ポート80でトラフィックを変更せずにリダイレクトします。すべて。
iptables -t mangle -A PREROUTING -i eth0 -p tcp -m tcp -d 1.2.3.4 --dport 80 -j TPROXY --on-port 80
これは、NATを実行せずに完全に透過的なモードで動作し、パケットの1バイトを変更しないために、Squidプロキシで使用されます。そのために特別なソケットを使用する必要があることを忘れないでください。そうしないと機能しません!
念のため、tproxyソケットを開く方法についてカーネルドキュメントから抽出します。
fd = socket(AF_INET, SOCK_STREAM, 0);
/* - 8< -*/
int value = 1;
setsockopt(fd, SOL_IP, IP_TRANSPARENT, &value, sizeof(value));
/* - 8< -*/
name.sin_family = AF_INET;
name.sin_port = htons(0xCAFE);
name.sin_addr.s_addr = htonl(0xDEADBEEF);
bind(fd, &name, sizeof(name));