IPTables, gelen SSH bağlantılarına izin verme kuralı


11

Bu komut dosyasının amacı localhost <-> localhost ve gelen SSH trafiği dışında yalnızca VPN üzerinden trafiğe izin vermektir. Ama komut dosyasını SSH üzerinden çalıştırdığımda bağlantı kesildi ve vm'yi yeniden başlatmak zorunda kaldım. Senaryomda sorun nedir?

#!/bin/bash
iptables -F

#Allow over VPN
iptables -A INPUT -i tun+ -j ACCEPT
iptables -A OUTPUT -o tun+ -j ACCEPT

#Localhost
iptables -A INPUT -s 127.0.0.1/8 -j ACCEPT
iptables -A OUTPUT -d 127.0.0.1/8 -j ACCEPT

#VPN
iptables -A INPUT -s 123.123.123.123 -j ACCEPT
iptables -A OUTPUT -d 123.123.123.123 -j ACCEPT

#SSH
iptables -A INPUT -p tcp --dport ssh -j ACCEPT

#Default Deny
iptables -A INPUT -j DROP
iptables -A OUTPUT -j DROP

Yanıtlar:


10

Dışarı çıkan herhangi bir paket için çıkış zinciri sorumludur .

Betiğiniz yalnızca giden paketlerin 123.123.123.123 adresindeki tünel arabirimine, localhost'a ve uzak ana makineye izin verir.

Sunucuya, SSH arka plan programının yukarıdakilerden biri dışında bir hedefe paket göndermesini gerektiren bir şekilde bağlanıyorsanız, trafiğin dışarı çıkmasına izin verilmez.

SSH arka plan programınızdan SSH istemcisine giden paketlere izin vermek için aşağıdaki kuralı eklemeniz gerekir:

iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT

Yalnızca tek bir konumdan bağlanıyorsanız, yukarıdaki kurala hedef IP ölçütleri eklemek de isteyebilirsiniz. Bu kuralın çıktı zinciri için nihai 'başka bir şey DROP' kuralından önce gelmesi gerekir.


+1 Bu işe yarayacak ve yerleşik, ilgili bir kuralı kullanmaktan daha spesifik olacaktır (bağlama bağlı olarak az çok yararlıdır).
goldilocks

Hem harika cevaplar, çok şey öğrendim! @SkyDan cevabını test ettim ve iyi çalışıyor!
Steven

Nitpick: yönlendirilen paketlerden çıkış zinciri sorumlu değildir .
Björn Lindqvist

13

Sizin #SSHkural ssh değil mi iletişimin tek yönlü biçimidir ima eder. Veriler ileri ve geri gönderiliyor .

İstemci tarafındaki bağlantı noktası numarasını önceden bilmediğinizden, bununla başa çıkmanın normal yolu, kurulan bir bağlantıyla "kurulmuş" veya "ilgili" olarak kabul edilen bağlantılara izin vermektir . Bunu yapmak için ihtiyacınız olan:

-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

DROPKurallarınızdan önce (ve tercihen en üstte, kurallar sırayla işlendiğinden ve bu ikisi çoğu paket için geçerli olacağından).

Burada TCP bağlantısının nasıl KURULDUĞU ile ilgili bir açıklama var ; aslında, sunucunun #SSH INPUTkuralınızın izin verdiği pakete cevap vermesi bunu yapar.


1
Bu işe yaramayacak. Kurulmuş, belirli bir TCP bağlantısı için her iki yönde paketler görüldüğü anlamına gelir . Yalnızca bu kuralı eklerseniz, ilk giden paket yine de engellenir.
hellodanylo

2
@SkyDan İşte bunun için bir referans . Diyagramda, sunucu açılış syn'ini aldıktan sonra istemciye bir syn / ack gönderdiğinde, bağlantının kurulacağı anlamına gelir , yani iptables bu paketin şu cevap paketine izin vermesine izin verir: Dönüş paketini (SYN / ACK) gördükten sonra, bağlantı KURULDU olarak kabul edilir. " -> tekrar: iptables , sunucunun göndermek istediği dönüş paketini görür , bağlantıyı kurulmuş olarak ayarlar ve yanıtı sağlar.
goldilocks

1
Tamam, neden işe yaradığını görüyorum. Bu biraz belirsiz, çünkü iptables adam sadece her iki yönde paketleri görmek hakkında konuşuyor, TCP el sıkışma paketleri hakkında bir kelime değil, bir istisna. Referans için teşekkürler!
hellodanylo

2
@SkyDan Aslında, mantık sadece tcp için geçerli değildir - -p tcpbu anlamda herhangi bir fark yaratmak konusunda yanılmışım ve bu sayfadaki UDP'nin sonraki açıklamasına bakıyorum (aynıdır). Buradaki nokta, sunucunun iptables'ın izin verip vermeyeceğini bilmeden yanıt vermesidir ve iptables yerel sistemdeki sunucudan bu yanıtı aldığında , artık her iki yönde de trafik görmüştür (istemci henüz olmasa da), bağlantı kurulur ve cevap verir. Buradaki "tekniklik", güvenlik duvarının iki tarafın ortasında olmasına bağlıdır.
goldilocks

1
Orada haklısın. Birisi muhtemelen bu bilgileri iptables adamına eklemelidir.
hellodanylo
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.