Heim >Backend-Entwicklung >PHP-Tutorial >Linux-Firewall-Iptables-Tutorial für Anfänger
Iptables ist ein äußerst flexibles Firewall-Tool, das für Linux-Betriebssysteme entwickelt wurde. Für Linux-Freaks und Systemadministratoren ist iptables sehr nützlich. In diesem Artikel erfahren Sie, wie Sie die vielseitigste Linux-Firewall konfigurieren.
Über iptables
Iptables ist ein befehlszeilenbasiertes Firewall-Tool, das Regelketten verwendet, um Netzwerkverkehr zuzulassen/zu blockieren. Wenn versucht wird, eine Netzwerkverbindung auf Ihrem System herzustellen, sucht iptables nach passenden Regeln. Wenn es nicht gefunden wird, führt iptables die Standardaktion aus.
Bei fast allen Linux-Distributionen ist iptables vorinstalliert. Der Befehl zum Aktualisieren/Installieren von iptables in Ubuntu/Debian lautet:
sudo apt-get install iptables
Einige vorhandene grafische Schnittstellensoftware kann iptables auch ersetzen, wie z. B. Firestarter. Aber iptables ist nicht schwer zu verwenden. Seien Sie beim Konfigurieren von iptables-Regeln besonders vorsichtig, insbesondere wenn Sie sich remote beim Server anmelden. Denn ein Fehler zu diesem Zeitpunkt kann dazu führen, dass Sie die Verbindung zum Server dauerhaft verlieren und Sie müssen zum Server gehen, um ihn zu beheben.
Typen von Iptables-Regelketten
Iptables-Regelketten sind in drei Typen unterteilt: Eingabe, Weiterleitung und Ausgabe.
Eingabe – Diese Kette wird zum Filtern von Verbindungen verwendet, deren Zieladresse der lokale Computer ist. Wenn ein Benutzer beispielsweise versucht, sich über SSH bei Ihrem PC/Server anzumelden, gleicht iptables zunächst seine IP-Adresse und seinen Port mit den iptables-Eingabekettenregeln ab.
Weiterleitung – Diese Kette wird verwendet, um Verbindungen zu filtern, bei denen sowohl die Zieladresse als auch die Quelladresse nicht lokal sind. Beispielsweise muss der Großteil der von einem Router empfangenen Daten an andere Hosts weitergeleitet werden. Wenn in Ihrem System keine routerähnlichen Funktionen wie NATing aktiviert sind, müssen Sie diese Kette nicht verwenden.
Es gibt eine sichere und zuverlässige Möglichkeit, zu erkennen, ob Ihr System Weiterleitungsketten benötigt:
iptables -L -v
Das obige Bild ist korrekt Screenshot eines Servers, der seit einigen Wochen läuft. Dieser Server legt keine Einschränkungen hinsichtlich der Ein- und Ausgabe fest. Wie man sieht, haben die Eingabekette und die Ausgabekette 11 GB bzw. 17 GB Daten verarbeitet, während die Weiterleitungskette keine Daten verarbeitet hat. Dies liegt daran, dass auf diesem Server keine Router-ähnliche Weiterleitungsfunktion aktiviert ist.
Ausgabe – Diese Kette wird verwendet, um Verbindungen zu filtern, deren Quelladresse der lokale Computer ist. Wenn Sie beispielsweise versuchen, howtogeek.com anzupingen, überprüft iptables die Ausgabekette auf Regeln im Zusammenhang mit Ping und howtogeek.com und entscheidet dann, ob Ihre Verbindungsanfrage zugelassen oder abgelehnt wird.
Hinweis: Wenn Sie einen externen Host anpingen, sieht es so aus, als ob nur die Ausgabekette funktioniert. Bedenken Sie jedoch, dass die vom externen Host zurückgegebenen Daten über die Eingabekette gefiltert werden müssen. Bedenken Sie beim Konfigurieren von iptables-Regeln, dass viele Protokolle eine bidirektionale Kommunikation erfordern, sodass Sie sowohl die Eingabekette als auch die Ausgabekette konfigurieren müssen. Wenn Leute SSH konfigurieren, vergessen sie oft, es sowohl in der Eingabe- als auch in der Ausgabekette zu konfigurieren.
Standardverhalten von Ketten
Bevor Sie bestimmte Regeln konfigurieren, möchten Sie möglicherweise das Standardverhalten dieser Ketten konfigurieren. Mit anderen Worten: Was soll iptables tun, wenn es mit einer bestehenden Regel nicht übereinstimmen kann?
Sie können den folgenden Befehl ausführen, um die aktuelle Standardaktion von iptables für nicht übereinstimmende Verbindungen anzuzeigen:
iptables -L
As As Wie oben gezeigt, können wir grep verwenden, um die Ausgabeergebnisse prägnanter zu gestalten. Im Screenshot oben akzeptieren alle Ketten standardmäßig alle Verbindungen.
Normalerweise möchten Sie, dass Ihr System standardmäßig alle Netzwerkdaten empfängt. Diese Einstellung ist auch die Standardkonfiguration von iptables. Der Konfigurationsbefehl zum Empfangen von Netzwerkverbindungen lautet:
iptables --policy INPUT ACCEPT iptables --policy OUTPUT ACCEPT iptables --policy FORWARD ACCEPT
Sie können auch einige Befehle hinzufügen, um bestimmte IP-Adressen oder Portnummern zu filtern, während Sie die Standardkonfiguration verwenden. Wir stellen diese Befehle später in diesem Artikel vor.
Wenn Sie standardmäßig alle Netzwerkverbindungen verweigern und dann zusätzlich zulässige IP-Adressen oder Portnummern hinzufügen möchten, können Sie ACCEPT in der Standardkonfiguration in DROP ändern, wie in der Abbildung unten gezeigt. Dies ist äußerst nützlich für Server, die sensible Daten enthalten. Normalerweise erlauben diese Server nur den Zugriff bestimmter IP-Adressen.
iptables --policy INPUT DROP iptables --policy OUTPUT DROP iptables --policy FORWARD DROP
Konfiguration bestimmter Verbindungen
Sehen wir uns an, wie bestimmte IP-Adressen oder Ports konfiguriert werden. In diesem Artikel werden hauptsächlich die drei grundlegendsten und gebräuchlichsten Einstellungen vorgestellt.
Akzeptieren – alle Daten akzeptieren.
Drop – Daten löschen. Anwendungsszenario: Wenn Sie nicht möchten, dass die Quelladresse der Daten von der Existenz Ihres Systems erfährt (der beste Weg, damit umzugehen).
Ablehnen – lässt den Verbindungsaufbau nicht zu, gibt aber eine Fehlerantwort zurück. Anwendungsszenario: Wenn Sie nicht möchten, dass eine bestimmte IP-Adresse auf Ihr System zugreift, diese aber wissen möchten, dass Ihre Firewall ihren Zugriff blockiert.
为了直观的区分上述三种情况,我们使用一台PC来ping一台配置了iptables的Linux电脑:
允许或阻止特定的连接
在配置完基本的规则链之后,你就可以配置iptables来允许或者阻止特定的IP地址或者端口。
注意:在这些例子中,我们使用iptables -A将额外的规则添加到现存的链中。Iptables在执行匹配的时候,会从列表的顶端开始搜索。你可以使用iptables -I [chain] [number]将新的规则插入到列表的指定位置。
来自同一IP地址的连接
下面这个例子展示了如何阻止来自IP地址为10.10.10.10的所有连接。
iptables -A INPUT -s 10.10.10.10 -j DROP
来自一组IP地址的连接
下面这个例子展示了如何阻止来自子网10.10.10.0/24内的任意IP地址的连接。你可以使用子网掩码或者标准的/符号来标示一个子网:
iptables -A INPUT -s 10.10.10.0/24 -j DROP
或
iptables -A INPUT -s 10.10.10.0/255.255.255.0 -j DROP
特定端口的连接
这个例子展示了如何阻止来自10.10.10.10的SSH连接。
iptables -A INPUT -p tcp --dport ssh -s 10.10.10.10 -j DROP
你可以将“ssh”替换成其它任何协议或者端口号。上述命令中的-p tcp告诉iptables连接使用的是何种协议。
下面这个例子展示了如何阻止来自任意IP地址的SSH连接。
iptables -A INPUT -p tcp --dport ssh -j DROP
连接状态
我们之前提到过,许多协议均需要双向通信。例如,如果你打算允许SSH连接,你必须同时配置输入和输出链。但是,如果你只想允许来自外部的SSH请求,那该怎么做?
下面这个例子展示了如何允许源IP地址为10.10.10.10同时阻止目的地址为10.10.10.10的SSH连接:
iptables -A INPUT -p tcp --dport ssh -s 10.10.10.10 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -p tcp --sport 22 -d 10.10.10.10 -m state --state ESTABLISHED -j ACCEPT
保存更改
上述方法对iptables规则作出的改变是临时的。如果你想永久保存这些更改,你需要运行额外的命令(不同Linux发行版下的保存命令也不相同):
Ubuntu:
sudo /sbin/iptables-save
Red Hat / CentOS:
/sbin/service iptables save
或者
/etc/init.d/iptables save
其它命令
列出iptables的当前配置:
iptables -L
使用-v选项将显示数据包和字节信息;使用-n选项将以数字形式列出信息,即不将IP地址解析为域名。
换句话讲,主机名,协议和网络都以数字的形式列出。
清除当前所有的配置规则:
iptables -F
原文 The Beginner’s Guide to iptables, the Linux Firewall