Dalam skrip iptables saya, saya telah bereksperimen dengan menulis aturan sebanyak mungkin. Saya membatasi pengguna mana yang diizinkan untuk menggunakan layanan mana, sebagian untuk keamanan dan sebagian sebagai latihan pembelajaran.
Menggunakan iptables v1.4.16.2 pada Debian 6.0.6 yang menjalankan kernel 3.6.2.
Namun saya telah menemukan masalah yang belum saya mengerti ...
port keluar untuk semua pengguna
Ini berfungsi dengan baik. Saya tidak memiliki aturan pelacakan keadaan umum.
## Port keluar 81 $ IPTABLES-OUTPUT -p tcp --dport 81 -m conntrack --ctstate NEW, ESTABLISHED -j ACCEPT $ IPTABLES -A INPUT -p tcp --sport 81 -s $ MYIP -m conntrack --ctstate ESTABLISHED -j ACCEPT
port keluar dengan pencocokan pengguna
## port keluar 80 untuk akun pengguna $ IPTABLES - OUTPUT - pemilik pencocokan - pemilik cairan penggunaaccount -p tcp --port 80 -m conntrack --ctstate NEW, ESTABLISHED --sport 1024: 65535 -j ACCEPT $ IPTABLES -A INPUT -p tcp --sport 80 --dport 1024: 65535 -d $ MYIP -m conntrack --ctstate ESTABLISHED -j ACCEPT
Ini memungkinkan port 80 hanya untuk akun "useraccount", tetapi aturan seperti ini untuk lalu lintas TCP memiliki masalah.
## Log keluar + aturan blok default $ IPTABLES - OUTPUT -j LOG --log-awalan "BAD OUTGOING" --log-ip-options --log-tcp-options --log-uid $ IPTABLES-OUTPUT -J DROP
Masalah
Di atas berfungsi, "useraccount" pengguna bisa mendapatkan file dengan sangat baik. Tidak ada pengguna lain di sistem yang dapat membuat koneksi keluar ke port 80.
useraccount @ host: $ wget http://cachefly.cachefly.net/10mb.test
Tetapi wget di atas membuat x7 menjatuhkan entri di syslog saya:
18 Okt 02:00:35 xxxx kernel: BAD OUTGOING IN = OUT = eth0 SRC = xx.xx.xx.xx DST = 205.234.175.175 LEN = 40 TOS = 0x00 PREC = 0x00 TTL = 64 ID = 12170 DF PROTO = TCP SPT = 37792 DPT = 80 SEQ = 164520678 ACK = 3997126942 WINDOW = 979 RES = 0x00 ACK URGP = 0
Saya tidak mendapatkan tetes ini untuk aturan yang sama dengan lalu lintas UDP. Saya sudah memiliki aturan yang membatasi pengguna mana yang dapat membuat permintaan DNS.
Paket ACK keluar yang keluar sepertinya berasal dari akun root (URGP = 0) yang saya tidak mengerti. Bahkan ketika saya menukar akun pengguna dengan root.
Saya percaya bahwa paket ACK dikategorikan sebagai baru karena conntrack mulai melacak koneksi setelah langkah ke-3 dari jabat tangan 3 arah, tetapi mengapa dropnya?
Bisakah tetes ini diabaikan dengan aman?
Edit
Jadi saya sering melihat aturan seperti ini, yang berfungsi dengan baik untuk saya:
$ IPTABLES-OUTPUT -s $ MYIP -p tcp -m tcp --dport 80 -m state --state NEW, ESTABLISHED -j ACCEPT $ IPTABLES -A INPUT -p tcp -m tcp --sport 80 -d $ MYIP -m state --state ESTABLISHED -j ACCEPT
Saya bertukar "-m state --state" untuk "-m conntrack --ctstate" karena pertandingan negara tampaknya sudah usang.
Apakah praktik terbaik untuk memiliki aturan pelacakan keadaan umum? Apakah aturan di atas dianggap tidak benar?
Untuk kontrol yang ketat atas koneksi pengguna keluar apakah ini akan lebih baik?
$ IPTABLES -A INPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT $ IPTABLES-OUTPUT -m conntrack --ststate ESTABLISHED -j ACCEPT $ IPTABLES - OUTPUT -p tcp --dport 80 -s $ SERVER_IP_TUNNEL -m conntrack --ctstate NEW -m owner --uid-owner useraccount -j ACCEPT $ IPTABLES - OUTPUT -p tcp --dport 80 -s $ SERVER_IP_TUNNEL -m conntrack --ctstate BARU -m pemilik - cairan-pemilik otheraccount -j MENERIMA