Cara mudah untuk "mengedit" lalu lintas yang berasal dari host tcp (linux)

9

Saya perlu membuat beberapa modifikasi kecil untuk lalu lintas masuk dari host tcp yang dikenal: port sebelum proses penanganan koneksi mendapatkan aliran.

Misalnya, biarkan 192.168.1.88 menjadi host jarak jauh yang menjalankan server web.
Saya membutuhkan itu, ketika suatu proses pada host lokal saya menerima data dari 192.168.1.88:80 (misalnya browser), data pertama kali diganti diganti text-Adengan text-B, seperti ini:

  • 127.0.0.1: ... terhubung ke 192.168.1.88:80
  • 127.0.0.1: ... kirim ke 192.168.1.88:80:

    GET /
    
  • 192.168.1.88:80 mengirim ke 127.0.0.1: ...:

    HTTP/1.0 200 OK
    Content-Type: text/plain
    
    Some text-A, some other text
    
  • Data itu agak dicegat oleh sistem dan diteruskan ke program yang outputnya adalah:

    HTTP/1.0 200 OK
    Content-Type: text/plain
    
    Some text-B, some other text
    
  • sistem memberikan data yang begitu berubah ke proses penanganan 127.0.0.1: ..., seperti jika itu berasal dari 192.168.1.88:80.

Dengan asumsi saya memiliki cara berbasis aliran untuk membuat perubahan ini (menggunakan sedmisalnya), apa cara termudah untuk pra-proses aliran tcp yang masuk?

Saya kira ini akan melibatkan iptables, tapi saya tidak terlalu pandai.

Perhatikan bahwa aplikasi harus merasa berurusan dengan host asli, jadi menyiapkan proxy sepertinya bukan solusi.

etuardu
sumber
Apakah ini permintaan HTTP?
polinomial
Pertanyaan Anda tidak cukup jelas. Anda perlu memberikan rincian lebih lanjut.
Khaled
1
Anda tidak dapat melakukannya di tingkat paket. Satu paket mungkin berisi "teks-" dan yang berikutnya mungkin berisi "A". Anda harus mengembangkan proxy tak terlihat yang mengikuti protokol. (Anda harus mengikuti protokol karena jika Anda mendapatkan "teks-" dan itu adalah bagian dari "teks-A", Anda harus menunggu potongan berikutnya sebelum meneruskannya atau filter Anda tidak akan berfungsi. Tetapi jika itu akhirnya pesan logis, Anda tidak bisa menunggu karena Anda akan menunggu selamanya.) Saya percaya tidak ada cara mudah untuk melakukan ini.
David Schwartz
Sudah ada sistem inspeksi paket stateful yang dapat melakukan misalnya menulis ulang lalu lintas FTP sehingga bekerja di seluruh NAT. Itu semacam tempat untuk memulai.
pjc50
Saya membutuhkannya untuk bekerja dengan respon http terutama tetapi akan lebih baik jika berfungsi pada semua lapisan aplikasi.
etuardu

Jawaban:

21

Gunakan proksi jaring dan iptables.

iptables -t nat -D PREROUTING -s yourhost -d desthost -p tcp --dport 80 -j REDIRECT --to 10101

Lalu lari:

netsed tcp 10101 desthost 80 s/text-A/text-B

NetSED adalah utilitas kecil dan praktis yang dirancang untuk mengubah, secara real time, isi paket yang diteruskan melalui jaringan Anda. Ini sangat berguna untuk perubahan paket jaringan, penempaan, atau manipulasi. NetSED mendukung:

  • audit protokol kotak hitam - setiap kali ada dua atau lebih kotak eksklusif yang berkomunikasi menggunakan beberapa protokol tidak berdokumen. Dengan memberlakukan perubahan pada transmisi yang sedang berlangsung, Anda akan dapat menguji apakah aplikasi yang diperiksa dapat diklaim aman.

  • percobaan menghasilkan fuzz, tes integritas - setiap kali Anda melakukan tes stabilitas aplikasi untuk melihat bagaimana itu peduli untuk integritas data;

  • kasus penggunaan umum lainnya: transfer menipu, pemfilteran konten, konversi protokol - apa pun yang paling sesuai dengan tugas Anda.

dfc
sumber
Itu sangat sederhana dan keren.
mbrownnyc
Saya tidak tahu netsed, itu cocok untuk tujuan saya. Satu-satunya hal yang tidak saya dapatkan adalah bagaimana mengatur "proxy transparan lokal" (lihat pertanyaan). Mungkin saya harus mengatur antarmuka jaringan (virtual) lain untuk mendapatkan itu. Ngomong-ngomong, untuk sekarang ini adalah jawaban yang paling memuaskan.
etuardu
Apakah Anda menjalankan kernel distribusi generik? Jika Anda iptables, dukungan mungkin sudah dikompilasi. Untuk menyiapkan proxy transparan, Anda hanya perlu mengisi rincian yang sesuai untuk host / port Anda. Lihatlah readme dan lihat apakah itu mengisi beberapa detail. silicone.homelinux.org/git/netsed.git/blob_plain/HEAD:/README
dfc
Saya pikir jaring hanya akan bekerja pada satu paket pada suatu waktu? Jadi, jika permintaan http dibagi menjadi dua paket, regex untuk substitusi tidak akan cocok dan permintaan akan diteruskan ke server yang tidak dimodifikasi.
paulos
1
ok sekarang, untuk berjaga-jaga jika seseorang membutuhkan ini suatu hari: bukan karena saya benar-benar memahaminya, tetapi untuk benar-benar memodifikasi paket OUTGOING (yang tidak ingin dilakukan oleh op), Anda harus memodifikasi OUTPUT, bukan PREROUTING. juga, -Dpilihannya harus -A untuk saya. juga, untuk -jopsi, saya harus menggunakan DNAT --to-destination (ip) atau REDIRECT --to-port. Akhirnya, saya TIDAK bisa memperbaiki kesalahan segmentasi netsed. lihat juga: ubuntuforums.org/showthread.php?t=2337389
phil294
3

iptables+ penggunaan libnetfilter_qu adalah opsi lain yang akan melakukan apa yang Anda inginkan:

"... [reinject] paket yang diubah ke subsistem kernel nfnetlink_queue."

Kemungkinan akan memberi Anda ekstensibilitas yang paling besar karena terserah Anda untuk membuat kode perangkat lunak.

Ada pembungkus python juga tersedia.

mbrownnyc
sumber
2
Contoh aplikasi yang menggunakan netfilter_queue: github.com/rgerganov/nfqsed
rgerganov