Jika ada cara untuk mendapatkan pid proses sebelum dimulai, maka saya belum pernah mendengarnya.
Anda dapat menulis pembungkus yang bercabang terlebih dahulu, lalu menambahkan aturan dan menjalankan proses (dengan asumsi program yang Anda jalankan tidak bercabang lagi), karena PID tidak diubah oleh panggilan exec(3).
/* NOTE this contains zero error checking */
int main(int argc, char **argv) {
/* Eat argv[0] the name of the wrapper script */
argv++;
argc--;
pid_t my_pid = getpid();
char *iptables_cmd = NULL;
asprintf(&iptables_cmd, "/sbin/iptables -A INPUT -m owner --pid_owner %d -j ACCEPT", my_pid);
system(iptables_cmd);
execv(argv[0], argv);
}
Berdasarkan jawaban @Bgs, saya akan melakukannya seperti ini:
- Tambahkan grup sistem baru, mis.
snitch
sudo addgroup --system snitch
- Tambahkan diri Anda ke grup itu, sehingga Anda tidak akan dimintai kata sandi untuk menjalankan proses dengan grup utama yang disetel ke grup itu:
sudo adduser $USER snitch
- Tambahkan IPv4 dan IPv6 aturan untuk mencatat dan menolak paket apa pun yang dihasilkan oleh proses milik grup itu:
sudo iptables -A OUTPUT -m owner --gid-owner snitch -j LOG --log-prefix 'Snitch: '
sudo ip6tables -A OUTPUT -m owner --gid-owner snitch -j LOG --log-prefix 'Snitch: '
sudo iptables -A OUTPUT -m owner --gid-owner snitch -j REJECT
sudo ip6tables -A OUTPUT -m owner --gid-owner snitch -j REJECT
- Buka pengawasan ekor pada pesan kernel:
dmesg -w
- Luncurkan proses target Anda menggunakan
sg
atau cara serupa lainnya:
sg snitch 'your target program'
-m owner --pid-owner PID
Lihat http://linuxpoison.blogspot.com/2010/11/how-to-limit-network-access-by-user.html dan http://linux.die.net/man/8/iptables
Perhatikan bahwa Anda memerlukan modul ipt_owner, karena --pid-owner tidak didukung oleh xt_owner.
Misalnya (ini hanya perkiraan)
#!/bin/bash
[email protected] &
iptables -m owner --pid-owner %1 -j REJECT
Namun pada kenyataannya, Anda lebih baik menggunakan --uid-owner dan --gid-owner. Pertama, kriteria --pid-owner hanya cocok dengan pid yang tepat, artinya program Anda dapat dengan mudah menghasilkan proses anak yang tidak akan diblokir oleh aturan ini. (Setidaknya saya belum membaca sebaliknya.) Kedua, iptables(8) memperingatkan bahwa --pid-owner rusak pada sistem SMP (yang mungkin atau mungkin tidak berlaku untuk Anda, tetapi dalam kedua kasus membatasi portabilitas). Ketiga, ada kondisi race pada script di atas, karena prosesnya dimulai sebelum diblokir. (Jika ada cara untuk mendapatkan pid proses sebelum dimulai, maka saya belum pernah mendengarnya.)
Sepertinya pemilik modul iptables adalah yang Anda inginkan. Pertama, periksa apakah tersedia di sistem Anda:
iptables -m owner --help
Anda dapat membaca selengkapnya di sini:http://www.frozentux.net/iptables-tutorial/iptables-tutorial.html#OWNERMATCH