Bagaimana cara memastikan port SSH hanya terbuka untuk alamat IP tertentu?

42

Ini milik saya /etc/sysconfig/iptables:

Ini memiliki dua port buka 80 apache dan 22 untuk ssh.

# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

Untuk port 22 (SSH) saya ingin memastikan tidak ada yang dapat terhubung ke port ini kecuali untuk alamat ip tertentu.

contoh ip:

1.2.3.4

Harap abaikan pengawasan / kekhawatiran tentang bagaimana jika ip saya berubah dan saya tidak bisa SSH ke server saya lagi.

Komunitas
sumber

Jawaban:

47

jika saya mendapatkan pertanyaan dengan cara yang benar, Anda ingin server Anda hanya dapat dijangkau dari alamat IP tertentu pada port 22, Anda dapat memperbarui Iptables untuk ini:

iptables -A INPUT -p tcp -s YourIP --dport 22 -j ACCEPT

Dalam hal ini, Anda membuka port ssh hanya untuk YourIP, jika Anda perlu membuka DNS untuk jaringan internal Anda:

iptables -A INPUT -p udp -s YourIP --dport 53 -j ACCEPT
iptables -A INPUT -p tcp -s YourIP --dport 53 -j ACCEPT

Setelah Anda menambahkan dan membuka untuk IP tersebut, Anda harus menutup pintu untuk IP lainnya

iptables -A INPUT -p tcp -s 0.0.0.0/0 --dport 22 -j DROP
iptables -A INPUT -p udp -s 0.0.0.0/0 --dport 53 -j DROP
iptables -A INPUT -p tcp -s 0.0.0.0/0 --dport 53 -j DROP

(Pastikan untuk mengatur aturan di posisi yang benar di aturan Anda. iptables -A INPUTAkan menambahkan aturan di akhir INPUTseperti saat ini.)

atau seperti kata joel Anda bisa menambahkan satu aturan saja:

iptables -A INPUT -p tcp ! -s <permittedIP> -j DROP

atau Anda bisa mengatur kebijakan default pada firewall dengan

iptables -P INPUT DROP

Secara singkat, seperti yang disajikan dalam pertanyaan ini di SO :

iptables -A INPUT -p tcp --dport 22 -s YourIP -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP
Networker
sumber
2
Perlu juga dicatat bahwa iptablesmendukung inversi dengan operator letusan jika Anda ingin melakukan yang ditargetkan DROP. Contoh:iptables -I INPUT -p tcp ! -s <permittedIP> -j DROP
Bratchley
1
Selain itu, tanpa syarat DROPtidak terlalu diperlukan, Anda cukup mengatur kebijakan default pada firewall dengan iptables -P INPUT DROPdan membiarkannya pergi begitu saja. Anda mungkin juga ingin melakukannya sebagai penambahan jika melakukannya dengan cara ini jika tidak semua lalu lintas akan tertangkap oleh DROPdan tidak pernah mencapai ACCEPTaturan Anda .
Bratchley
1
Ini tidak berfungsi untuk saya karena default untuk -I (masukkan) adalah menyisipkan sebagai aturan # 1, jadi DROP dimasukkan sebagai aturan # 1 dan dievaluasi terlebih dahulu dan karena itu menjatuhkan semua paket ssh, tidak pernah mengevaluasi aturan ACCEPT. Anda harus menjalankan iptables -I INPUT 3 -p tcp -s 0.0.0.0/0 --dport 22 -j DROPdan iptables -I INPUT 3 -p udp -s 0.0.0.0/0 --dport 53 -j DROP"3" setelah INPUT berarti menyisipkan sebagai aturan INPUT # 3 (dengan asumsi Anda memasukkan dua ACCEPTS, jika tidak hanya satu ACCEPT maka gunakan "2" untuk INPUT.
Kevin Triplett
@Networker Using -Iakan memasukkan aturan iptables baru di bagian atas. Dengan demikian, Anda mungkin akan memberikan drop sebelum Anda mengizinkan. Saya sarankan menggunakan -Abukannya
BlueCacti
1
baik saya mengunci diri, gj
ngwdaniel
6

Meskipun saya sarankan menggunakan kunci SSH, saya akan memberi Anda penjelasan.

Anda tidak harus menggunakan tabel IP untuk apa yang ingin Anda capai, ada beberapa cara. Ini adalah cara IPtables:

iptables -I INPUT -s [YOUR_HOME_IP] -p tcp -m tcp --dport [SSH_PORT] -j ACCEPT

[YOUR_HOME_IP] = IP rumah Anda (cukup mudah)

[SSH_PORT] = Port tempat Anda menjalankan SSH (secara default 22)

iptables -I INPUT -p tcp -m tcp --dport [SSH_PORT] -j REJECT

Ini memastikan tidak seorang pun kecuali IP Anda dapat masuk ke SSH.

Ada cara lain, yaitu dengan menambahkan sesuatu ke sshd_config.

Tambahkan yang berikut ini:

AllowUsers root@[YOUR_HOME_IP]
PermitRootLogin without-password

Ini memungkinkan Anda untuk masuk ke SSH sebagai rootpengguna dari IP Anda tanpa meminta kata sandi.

Perlu diingat bahwa cronjob dengan

iptables -X
iptables -F

mungkin cerdas sehingga Anda tidak terkunci dari server Anda dengan SSH (cronjob akan mengatur ulang IPtables sehingga Anda akan mendapatkan akses lagi). Jika Anda masih memiliki akses, Anda dapat menghapus cronjob dan mengatur IPtables Anda lagi.

William Edwards
sumber
Cronjob hanya akan menghapus firewall. Mengapa mengaturnya iptables? Beberapa bentuk akses keluar dari band adalah metode yang biasa digunakan. knockdadalah yang lain.
Matt
@ mtm Ya, ketika Anda dikunci cronjob akan mengatur ulang pengaturan IPtables Anda sehingga Anda akan dapat mengakses SSH lagi. Alasan mengapa orang menggunakan IPtables berbeda, menurut saya adalah firewall yang efektif, sederhana, dan fleksibel.
William Edwards
2
oic. Maksud Anda menjalankan flush sekali pada waktu pengaturan, tidak dijadwalkan secara teratur. atapakah itu.
Matt
4
Membuat daftar putih hanya IP Anda dan kemudian mengizinkan login root tanpa kata sandi sepertinya ide yang buruk.
Alex W
1
@AlexW Saya tahu ini sudah lama tetapi saya masih ingin berkomentar: Without-Passwordberarti otentikasi kata sandi tidak diperbolehkan, jadi Anda harus menggunakan otentikasi kunci SSH. Memang sedikit penamaan yang tidak jelas untuk metode otentikasi ini. Tetapi ini tidak berarti bahwa Anda tidak perlu kata sandi untuk login sebagai root. Namun demikian, metode yang lebih aman adalah mengatur PermitRootLogin nodan menggunakan akun sudo yang berbeda untuk login, karena root adalah target umum
BlueCacti
5

Jawaban lain digunakan iptables -Idalam contoh mereka, yang seringkali bukan yang seharusnya Anda gunakan.

iptables akan menjalankan aturan pertama yang cocok, sehingga urutan aturan sangat penting. -Iadalah perintah "masukkan", dan harus digunakan dengan parameter indeks untuk menentukan di mana dalam daftar aturan yang diberikan berada. -Aadalah perintah "append", yang akan menambahkan aturan ke akhir daftar.

Dalam beberapa distrobutions (mungkin semua) menggunakan -Itanpa parameter indeks akan menambahkan aturan ke indeks satu, menjadikannya aturan pertama yang diperiksa. Dalam skenario ini jika perintah terakhir yang Anda jalankan adalah iptables -I INPUT -s tcp 0.0.0.0/0 -j DROPiptables akan menjatuhkan semua lalu lintas, terlepas dari apakah Anda memiliki ACCEPTaturan atau tidak nanti dalam rantai.

Berikut contoh pengaturan aturan yang hanya mengizinkan SSH dari satu IP:

Mulai tanpa aturan:

#> iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Tambahkan aturan "izinkan SSH baru dari 1.2.3.4":

#>iptables -A INPUT -p tcp -s 1.2.3.4 --dport 22 -j ACCEPT

Blokir SSH dari semua IP lain:

#>iptables -A INPUT -p tcp -s 0.0.0.0/0 --dport 22 -j DROP

Sekarang rantai INPUT Anda akan terlihat seperti:

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     tcp  --  1.2.3.4              0.0.0.0/0            tcp dpt:22
DROP       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22

Kemudian, jika Anda perlu memasukkan daftar putih IP kedua Anda dapat menggunakan -Iparameter untuk menempatkannya sebelum aturan daftar hitam.

#>iptables -I INPUT 2 -p tcp -s 4.3.2.1 --dport 22 -j ACCEPT

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     tcp  --  1.2.3.4              0.0.0.0/0            tcp dpt:22
ACCEPT     tcp  --  4.3.2.1              0.0.0.0/0            tcp dpt:22
DROP       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22

Perhatikan bahwa menggunakan -I INPUT 2menambahkan aturan baru sebagai aturan nomor 2 dan menabrak aturan DROP ke nomor 3.

STW
sumber