Hanya izinkan lalu lintas keluar tertentu pada antarmuka tertentu

15

Saya memiliki masalah yang agak aneh. Saya memiliki server dengan dua antarmuka jaringan eth0dan eth1. Masing-masing terhubung ke jaringan yang berbeda. Setiap jaringan memiliki gateway internet. Server memiliki berbagai koneksi keluar : http (beberapa skrip di server mengikis situs web), klien nfs, klien samba, klien dns, dan pembuat email untuk beberapa nama.

Untuk alasan saya tidak akan masuk, saya perlu membagi klien keluar ini sehingga lalu lintas keluar http, nfs, samba dan dns hanya diminta eth0sementara semua yang lain berjalan lancar eth1.

Saya telah membaca sekitar beberapa pencarian Google dan sepertinya iptablesitulah yang saya butuhkan tetapi saya benar-benar tidak tahu. Saya hanya terbiasa mengelola aturan firewall masuk ufw.

Bisakah seseorang memulai saya dengan beberapa contoh aturan dan memberi tahu saya cara mendapatkan sistem untuk mengadopsi aturan ini saat boot? Idealnya tanpa mengunci saya dari koneksi SSH saya (saya bisa mendapatkan akses fisik, tetapi saya lebih suka tidak).

Sunting Saya dapat membagi klien menjadi dua pengguna jika memungkinkan untuk membatasi semua lalu lintas keluar dari akun ke satu antarmuka. di atas kertas yang sepertinya mungkin lebih mudah.

Oli
sumber

Jawaban:

12

Saya akan mengatur tabel routing terpisah dan kebijakan untuk merutekan paket yang ditandai menggunakan tabel itu dan memiliki iptables / netfilter menandai paket-paket tertentu.

Buat tabel: echo 1 known >> /etc/iproute2/rt_tables

Buat aturan perutean ( ipperintahnya dari iproute2 ): ip rule add from all fwmark 1 table known

Kami membuat tabel yang disebut "diketahui" dan membuat aturan perutean yang mengatakan setiap paket dengan tanda sama dengan 1 akan dialihkan sesuai dengan tabel "diketahui". Saya hanya menyebutnya dikenal karena ini untuk daftar protokol yang dikenal - Anda dapat memberi nama apa pun yang Anda inginkan. Sekarang kita atur tabel yang dikenal untuk rute dengan cara yang benar.

ip route add default dev eth0 table known

Buat aturan iptables:

iptables -t mangle -I PREROUTING -p tcp --dport 111 -j MARK --set-mark 1
iptables -t mangle -I PREROUTING -p tcp --dport 2049 -j MARK --set-mark 1

Contoh menandai paket pada port NFS (111, 2049) dengan 1. Kami menambahkan aturan ini ke iptable 'mangle'. Ini berbeda dari tabel routing dan tidak dapat diubah; tabel mangle khusus untuk mengubah paket dengan cara apa pun selain NAT.

Sekarang, untuk merutekan semua yang lain melalui antarmuka lain, kami menambahkan rute ke tabel routing standar.

ip route add default dev eth1

Untuk benar-benar memahami hal ini, baca bagian 4 dan 11 dari LARTC howto .

Shawn J. Goff
sumber
Sebenarnya itu jauh lebih sederhana daripada yang saya takutkan. Tumpukan jaringan Linux benar-benar binatang yang indah, bukan ?! Saya telah memberikan tes cepat ini dan semuanya tampaknya berfungsi seperti yang diharapkan. Saya memantau setiap antarmuka melalui iftopdan mereka masing-masing menunjukkan jenis lalu lintas yang tepat. Terima kasih banyak.
Oli
Saya tidak tahu bagaimana iptables atau iproute2 menyimpan konfigurasinya. Apakah saya harus menjalankan aturan ini setiap boot?
Oli
@ Oli Mereka akan dihapus ketika Anda reboot. Anda dapat menyimpan dan mengembalikan aturan dengan iptables-savedan iptables-restore. Jika Anda menggunakan NetworkManager, Anda dapat mengatur skrip dispatcher untuk mengotomatiskan proses. Sayangnya, halaman NM resmi tidak memiliki dokumentasi tentang fitur tersebut, tetapi dokumentasi Ubuntu dan Linux Arch keduanya menyebutkannya.
Shawn J. Goff
5

Nah, cara " termudah " adalah dengan menginstruksikan program tunggal untuk menggunakan antarmuka tertentu (atau ip antarmuka. Misalnya:

ping -I eth1 8.8.8.8

menginstruksikan ping untuk menggunakan eth1 sebagai antarmuka sumber, sementara

wget --bind-address 10.0.0.1 http://www.google.it/

menginstruksikan wget untuk pergi melalui antarmuka yang memiliki 10.0.0.1alamat IP.

Jujur saya tidak tahu apakah itu mungkin dengan semua program yang Anda butuhkan, tetapi ini adalah awal untuk memangkas aturan yang Anda butuhkan untuk menulis iptablesdan iprouteprogram - programnya.

Sebagai permulaan, Anda harus membaca tutorial ini di beberapa koneksi internet . Bacaan yang bagus juga merupakan salah satu dari ribuan tutorial iptables, khususnya pada outbound filtering, process/ pid filteringdan port filtering.

Tuan Shunz
sumber
4

Cara yang tepat untuk melakukannya adalah dengan mengikat () ke antarmuka yang ingin Anda gunakan untuk paket keluar. Karena Anda kemudian dapat mengatur rute dengan ip routedan ip ruleperintah untuk mengontrol bagaimana paket-paket diarahkan berdasarkan antarmuka keluar mereka. Sebagai contoh saya, saya akan menganggap jaringan berikut:

  • eth0:
    • Alamat: 192.168.0.2/24
    • Gateway Default: 192.168.0.1
  • eth1:
    • Alamat: 192.168.1.2/24
    • Gateway Default: 192.168.1.1

Saya akan membuat dua tabel routing, satu untuk lalu lintas keluar untuk eth0 disebut alternatif dan satu tabel untuk eth1 disebut utama. Routing table main selalu ada dan merupakan tabel normal yang digunakan oleh perintah routedan ip route. Kebanyakan orang tidak pernah berurusan dengan meja lain. Untuk membuat tabel yang disebut alternatif, kami akan menambahkan baris berikut ke /etc/iproute2/rt_tables:

10    alternate

Tabel utama memiliki prioritas default 254. Aturan-aturan yang berlaku tabel routing dikendalikan oleh ip ruleperintah. Secara default, perintah itu akan mencetak daftar aturan yang ada yang akan terlihat seperti ini:

0:      from all lookup local 
32766:  from all lookup main 
32767:  from all lookup default 

Ini pada dasarnya mengatakan akan mencari rute dalam tabel localyang merupakan tabel khusus yang dikelola oleh kernel untuk rute lokal seperti alamat IP saya sendiri. Kemudian akan mencoba tabel utama dan tabel default. Default tabel biasanya kosong sehingga jika tidak ada kecocokan di main, tidak ada rute untuk host. Pertama, mari kita isi tabel bergantian dengan aturan untuk eth0.

sudo ip route add table alternate 192.168.0.0/24 dev eth0
sudo ip route add table alternate 192.168.1.0/24 dev eth1
sudo ip route add table alternate default via 192.168.0.1

Anda biasanya ingin alternatetabel terlihat mirip dengan maintabel. Satu-satunya perbedaan adalah ketika routing harus berbeda. Anda mungkin tidak ingin menyertakan baris kedua di atas jika Anda benar-benar ingin semua lalu lintas NFS, HTTP, dll. Pergi melalui gateway default pada eth0 bahkan jika itu ditujukan untuk jaringan di eth1. Langkah selanjutnya adalah menambahkan aturan kapan harus menggunakan tabel rute alternatif ini:

sudo ip rule add from 192.168.0.0/24 pref 10 table alternate

Aturan ini mengatakan setiap lalu lintas yang datang dari alamat pada jaringan 192.168.0 akan menggunakan alternatetabel routing bukan maintabel normal . Langkah terakhir adalah memastikan semua klien yang harus menggunakan eth0mengikatnya. Dengan wget, misalnya, atur --bind-address=192.168.0.2, untuk NFS aturclientaddr=192.168.0.2opsi pemasangan. Jika menggunakan LibWWW dengan Perl, Anda dapat mengatur opsi localaddr di LWP :: UserAgent untuk mengontrol antarmuka lokal yang diikatnya. Jika Anda memiliki klien yang tidak dapat Anda kendalikan sumber pengikatan dan kompilasi bukan opsi, Anda mungkin dapat menggunakan aturan iptables untuk mengubah alamatnya, tetapi ini lebih merupakan peretasan dan mungkin tidak berfungsi. Anda membutuhkan aturan SNAT yang diatur dalam rantai PREROUTING dari tabel nat atau tabel mangle. Anda masih membutuhkan tabel-tabel perutean yang dimodifikasi yang diberikan di atas agar ini berfungsi.

penguin359
sumber