aturan iptables untuk mengizinkan lalu lintas HTTP ke satu domain saja

20

Saya perlu mengkonfigurasi mesin saya untuk mengizinkan lalu lintas HTTP ke / dari serverfault.com saja. Semua situs web lain, port layanan tidak dapat diakses. Saya datang dengan aturan iptables ini:

#drop everything
iptables -P INPUT DROP
iptables -P OUTPUT DROP

#Now, allow connection to website serverfault.com on port 80
iptables -A OUTPUT -p tcp -d serverfault.com --dport 80 -j ACCEPT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

#allow loopback
iptables -I INPUT 1 -i lo -j ACCEPT

Itu tidak bekerja dengan baik:

  • Setelah saya meninggalkan semuanya, dan lanjutkan ke aturan 3:

    iptables -P OUTPUT -p tcp -d serverfault.com --port 80 -j MENERIMA

Saya mendapatkan kesalahan ini:

iptables v1.4.4: host/network `serverfault.com' not found
Try `iptables -h' or 'iptables --help' for more information.

Apakah Anda pikir ini terkait dengan DNS? Haruskah saya mengizinkannya juga? Atau haruskah saya memasukkan alamat IP ke aturan? Apakah Anda pikir apa yang saya coba lakukan dapat dicapai dengan aturan yang lebih sederhana? Bagaimana?

Saya sangat menghargai bantuan atau petunjuk tentang ini. Terima kasih banyak!

Zenet
sumber
2
Jangan lupa sstatic.net dan lainnya. serverfault.com tidak sepenuhnya berasal dari serverfault.com
Zoredache
Bisakah Anda menjalankan proxy di sistem lain? Ini adalah solusi terbaik / termudah: serverfault.com/questions/215134
mattdm

Jawaban:

29

Dengan aturan IPTables, masalah pemesanan. Aturan ditambahkan, dan diterapkan, secara berurutan. Selain itu, ketika menambahkan aturan secara manual, peraturan itu segera diterapkan. Jadi, dalam contoh Anda, paket apa pun yang melalui rantai INPUT dan OUTPUT mulai turun segera setelah kebijakan default ditetapkan. Ini juga, kebetulan, mengapa Anda menerima pesan kesalahan yang Anda lakukan. Apa yang terjadi adalah ini:

  1. Kebijakan DROP default diterapkan
  2. IPTables menerima nama host sebagai tujuan
  3. IPTables mencoba pencarian DNS di 'serverfault.com'
  4. Pencarian DNS diblokir oleh tindakan DROP

Sementara opsi sumber / tujuan akan menerima nama host, itu sangat tidak dianjurkan. Mengutip halaman manual,

Nama host akan diselesaikan hanya sekali, sebelum aturan dikirimkan ke kernel. Harap perhatikan bahwa menentukan nama apa pun untuk diselesaikan dengan kueri jarak jauh seperti DNS adalah ide yang sangat buruk.

Slillibri mengenai paku di kepala yang jawabannya, Anda melewatkan aturan DNS ACCEPT. Dalam kasus Anda itu tidak masalah, tetapi umumnya saya akan menetapkan kebijakan default nanti pada proses. Hal terakhir yang Anda inginkan adalah bekerja dari jarak jauh dan mengizinkan SSH setelah mengaktifkan default deny.

Juga, tergantung pada distribusi Anda, Anda harus dapat menyimpan aturan firewall Anda sehingga mereka akan diterapkan secara otomatis pada waktu mulai.

Mengetahui semua itu, dan mengatur ulang skrip Anda, berikut adalah apa yang akan saya rekomendasikan.

# Allow loopback
iptables -I INPUT 1 -i lo -j ACCEPT

# Allow DNS
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT

# Now, allow connection to website serverfault.com on port 80
iptables -A OUTPUT -p tcp -d serverfault.com --dport 80 -j ACCEPT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# Drop everything
iptables -P INPUT DROP
iptables -P OUTPUT DROP
Scott Pack
sumber
3
Cantik, jawaban yang dibuat dengan baik.
JakeRobinson
1
Saya menghargainya, meskipun Anda juga pasti telah melewatkan kesalahan saya. Ups.
Scott Pack
3
Sebenarnya, Anda bisa meletakkan iptables -Ppernyataan Anda di mana saja di skrip Anda, karena kebijakan berantai hanya diterapkan ketika paket "jatuh" di ujung rantai. Saya biasanya meletakkan pernyataan kebijakan (biasanya DROPkebijakan) di bagian atas skrip iptables saya.
Steven Monday
1
@ Seven: Anda benar sekali. OP tampaknya mengetiknya secara interaktif. Mari kita berpura-pura terhubung ke host Anda melalui SSH dan aturan pertama Anda adalah untuk DROP kebijakan. Koneksi SSH Anda akan terputus sebelum Anda bisa mengetikkan aturan lain. Ini adalah masalah waktu yang sama, jika manifestasi yang berbeda, dari yang dia temui.
Scott Pack
Terima kasih. Sedang mencoba ini. Tetapi tidak berhasil tanpa menambahkan sudo iptables -I OUTPUT 1 -o lo -j ACCEPT. Bukankah itu harus ditambahkan?
Kiran
7

Menambahkan

iptables -A OUPUT -p udp --dport 53 -j ACCEPT

untuk mengizinkan pencarian DNS.

slillibri
sumber
5

Persyaratan semacam ini mungkin lebih baik ditangani dengan proxy web dan / atau filter. Dansgaurdian dapat dikonfigurasi untuk melakukan ini. Anda harus menggunakan aturan NAT untuk memaksa lalu lintas Anda melalui filter.

Menggunakan iptables untuk memfilter akan memungkinkan situs apa pun tersedia dari alamat IP yang relevan. Ini biasanya sebagian kecil dari keseluruhan web.

BillThor
sumber
1
Sepenuhnya setuju dengan ini. iptablesmungkin alat yang salah untuk digunakan di sini, karena tidak menangani dengan baik dengan nama DNS. Proxy web dengan pengaturan filter yang sesuai jauh lebih cocok.
Steven Monday
2

Saya khawatir iptables tidak berfungsi pada level ini, ia hanya peduli dengan alamat ip, bukan nama host. Jika Anda ingin memblokir akses ke host virtual nama lain di ip yang sama, Anda harus melihat cara memasukkan file .htaccess.

Niall Donegan
sumber
Masalahnya adalah, ketika saya mencoba aturan 3 tanpa "menjatuhkan semuanya" itu berfungsi dengan baik dengan iptables!
Zenet
2
hmm, saya salah membaca pertanyaan. Benar, apa yang terjadi di latar belakang adalah bahwa iptables akan menyelesaikan serverfault.com ke 64.34.119.12 (lihat jawaban dari slillibri untuk memahami mengapa penyelesaian tidak bekerja). Namun, karena iptables tidak memahami nama host, dan hanya memperbolehkan ip, Anda akan dapat terhubung ke situs web mana pun pada ip itu, jika ia memiliki beberapa situs.
Niall Donegan
2
@Mungkin, itu bisa berfungsi dengan baik, karena aturan ditambahkan, tetapi jika IP serverfault.com berubah, lalu lintas tidak akan diizinkan. Mengizinkan situs seperti google.com yang memiliki ratusan alamat yang sering diubah tidak akan berfungsi sama sekali.
Zoredache
1

Anda perlu mengkonfigurasi ini di server web Anda. iptables adalah filter paket. Transaksi HTTP mengirim nama situs (yaitu stackoverflow) sebagai bagian dari payload TCP (yaitu bukan sebagai bagian dari header TCP yang mudah dibaca oleh iptables).

Mengingat itu, dan fakta bahwa transaksi HTTP hampir pasti akan tersebar di beberapa paket (yaitu Anda tidak bisa hanya mencocokkan string di header HTTP), ini jauh lebih baik ditangani oleh konfigurasi server web Anda atau oleh proxy di depan itu.

Akan berguna untuk mengetahui alasan di balik ini, ada beberapa alternatif lain:

  1. Redirect ke URL yang benar jika mereka memasukkan URL yang salah (mis. Redirect ke stackoverflow.com jika mereka memasukkan www.stackoverflow.com)
  2. Beri tahu server web Anda untuk tidak melayani host selain stackoverflow.com
  3. Tempatkan situs pada IP terpisah yang tidak ada penyelesaiannya dan hanya minta server web Anda untuk mendengarkannya.
Philip Reynolds
sumber
Hai Phil, saya tidak yakin saya mengerti apa server web? Saya tidak punya server web. Saya melakukan konfigurasi ini di komputer saya.
Zenet