SSH portunun sadece belirli bir IP adresine açık olduğundan nasıl emin olabilirsiniz?


42

Bu benim /etc/sysconfig/iptables:

80 apache ve 22 ssh için açık iki girişi vardır.

# 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

Bağlantı noktası 22 (SSH) için, belirli bir ip adresi dışında kimsenin bu bağlantı noktasına bağlanamayacağından emin olmak istiyorum.

örnek ip:

1.2.3.4

Lütfen ipimin değişip değişmemesi ve sunucuma SSH yapamıyorum ne hakkında herhangi bir gözetimi / kaygıyı dikkate almayın.

Yanıtlar:


47

Soruyu doğru bir şekilde alırsam, sunucunuzun yalnızca 22 numaralı bağlantı noktasındaki belirli bir IP adresinden erişilebilir olmasını istiyorsanız, bunun için Iptables'ı güncelleyebilirsiniz:

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

Bu durumda, dahili ağınız için DNS açmanız gerekirse, ssh portunu sadece YourIP’e açıyorsunuz:

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

Bu IP’ler için onları ekleyip açtıktan sonra, IP’lerin kalan kısmı için kapıyı kapatmanız gerekir.

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

(Kuralları, kural kümenizdeki doğru konumda ayarladığınızdan emin olun. iptables -A INPUTKuralları, olduğu gibi sonuna ekleyecektir INPUT.)

veya joel’in dediği gibi onun yerine bir kural ekleyebilirsin:

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

veya güvenlik duvarındaki varsayılan politikayı

iptables -P INPUT DROP

Kısaca, SO'da bu soruda belirtildiği gibi :

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

2
Ayrıca iptables, hedef almak istemeniz durumunda patlama operatörü ile inversiyonu desteklediğine dikkat etmek önemlidir DROP. Örnek:iptables -I INPUT -p tcp ! -s <permittedIP> -j DROP
Bratchley

1
Ayrıca, koşulsuz olanlara DROPgerçekten ihtiyaç duyulmaz, yalnızca güvenlik duvarındaki varsayılan ilkeyi ayarlayabilir iptables -P INPUT DROPve buna izin verebilirsiniz . Muhtemelen siz de bu şekilde yaparsanız onları bir son ek olarak yapmak istersiniz, aksi takdirde tüm trafik yakalanır DROPve asla sizin ACCEPTkuralınıza ulaşmaz .
Bratchley

1
Bu benim için işe yaramadı, çünkü -I (insert) için varsayılan kural # 1, yani DROP kural # 1 olarak eklenir ve ilk olarak değerlendirilir ve bu nedenle de hiçbir zaman ACCEPT kuralını değerlendirmeden önce tüm ssh paketlerini bırakır. Sen yürütmek zorunda iptables -I INPUT 3 -p tcp -s 0.0.0.0/0 --dport 22 -j DROPve iptables -I INPUT 3 -p udp -s 0.0.0.0/0 --dport 53 -j DROPsadece bir sonra INPUT için "2" kullanın KABUL aksi takdirde "3" insert GİRİŞ kural olarak GİRİŞ vasıtası sonra 3. (varsayarsak iki ekleme edilir KABUL.
Kevin Triplett

@ Networker kullanma -Iyeni iptables kurallarını en üste ekler. Bu nedenle, izin vermeden önce düşüşünüzü onaylamaya başlayabilirsiniz. Bunun -Ayerine kullanmanızı öneririm
BlueCacti

1
iyi kendimi dışarı kilitledim, gj
ngwdaniel 25:16 '

6

SSH anahtarlarını kullanmanızı tavsiye etmeme rağmen, size bir açıklama yapacağım.

IPtables'ı başarmaya çalıştığınız şey için kullanmak zorunda değilsiniz, birçok yol var. Bu IPtables yoludur:

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

[YOUR_HOME_IP] = Ev IP’niz (oldukça basit)

[SSH_PORT] = SSH'yi çalıştırdığınız port (varsayılan 22)

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

Bu, IP’niz dışında kimsenin SSH’ye giriş yapamamasını sağlar.

Başka bir yol var ki buna bir şey ekleyerek sshd_config.

Aşağıdakileri ekleyin:

AllowUsers root@[YOUR_HOME_IP]
PermitRootLogin without-password

Bu, rootbir şifre sormadan IP’nizden kullanıcı olarak SSH’ye giriş yapmanızı sağlar .

Lütfen bir cronjob olduğunu unutmayın

iptables -X
iptables -F

Akıllı olabilir, böylece SSH ile sunucunuzdan kilitlenmezsiniz (cronjob IPtables'ı sıfırlar, böylece tekrar erişim sağlarsınız). Hala erişiminiz varsa, cronjob'ı kaldırabilir ve IPtables'ınızı tekrar ayarlayabilirsiniz.


Cronjob, güvenlik duvarını kaldırır. Neden iptablesilk etapta ayarladınız ? Bant dışı erişimin bir şekli, genel yöntemdir. knockdbaşka bir şey.
Matt,

@mtm Evet, kilitlendiğiniz zaman cronjob IPtables kurulumunuzu sıfırlar ve böylece SSH'ye tekrar erişebilirsiniz. İnsanların IPtable'ı kullanma nedenlerinin farklı olduğunu düşünüyorum, bence etkili, basit ve esnek bir güvenlik duvarı.
William Edwards,

2
oik. Yıkama işlemini düzenli aralıklarla değil, kurulum sırasında bir kez çalıştırın. atBunu yapar.
Matt,

4
Yalnızca IP'nizi beyaz listeye almak ve daha sonra şifresiz root girişine izin vermek korkunç bir fikir gibi görünüyor.
Alex W

1
@AlexW Bir süre geçtiğini biliyorum ama yine de yorum yapmak istedim: Without-Passwordparola doğrulamaya izin verilmediği anlamına gelir, bu nedenle bunun yerine SSH anahtar doğrulamasını kullanmanız gerekir. Gerçekten de bu kimlik doğrulama yöntemi için belirsiz bir adlandırma biraz. Ancak bu root olarak giriş yapmak için bir şifreye ihtiyacınız olmadığı anlamına gelmez. Yine de, daha güvenli bir yöntem giriş yapmak için PermitRootLogin nofarklı bir sudo hesabı oluşturmak ve kullanmaktır, çünkü kök ortak bir
hedefdir

5

Diğer cevaplar, iptables -Iörneklerinde kullanıyor , ki bu da kullanmanız gereken şey değil.

iptables eşleşen ilk kuralı uygulayacaktır, bu yüzden kuralların sırası çok önemlidir. -I"insert" komutudur ve verilen bir kuralın listede bulunabileceğini belirtmek için bir index parametresiyle birlikte kullanılmalıdır. -Akuralı listenin sonuna ekleyecek olan "append" komutudur.

Bazı karışıklıklarda (belki de tümü) -Ibir index parametresi olmadan kullanmak , kuralı ilk dizine ekleyerek kuralı ilk dizine ekler. Bu senaryoda, çalıştırdığınız son komut iptables -I INPUT -s tcp 0.0.0.0/0 -j DROPo zaman iptables ACCEPT, zincirde daha sonra herhangi bir kuralınızın olup olmadığına bakılmaksızın iptables tüm trafiği bırakacaktır .

Aşağıda, yalnızca tek bir IP’den SSH’ye izin veren bir kural oluşturmanın bir örneği verilmiştir:

Kuralsız başlamak:

#> 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

Yeni bir "SSH'ye 1.2.3.4'ten izin ver" kuralı ekleyin:

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

Diğer tüm IP'lerden SSH'yi engelleyin:

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

Şimdi INPUT zinciriniz şöyle görünecek:

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

Daha sonra, ikinci bir IP'yi beyaz listeye almanız gerekirse -I, kara liste kuralından önce yerleştirmek için parametreyi kullanabilirsiniz .

#>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

Bildirim o kullanarak -I INPUT 2numaralı kural 2 gibi yeni bir kural eklemiş ve 3 numaralı BIRAKMA kuralı çarptı.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.