iptables 是一種在Linux操作系統上廣泛使用的命令行工具,用于設置、維護和檢查IPv4數據包過濾規則。這些規則由內核的netfilter框架執行,可用于控制進出網絡接口的流量。iptables 在網絡安全管理中扮演著重要的角色,特別是在配置防火墻、NAT(網絡地址轉換)和其他類型的IP數據包過濾中。
|
|
參數 | 作用 |
-P | 設置默認策略:iptables -P INPUT (DROP |
-F | 清空規則鏈 |
-L | 查看規則鏈 |
-A | 在規則鏈的末尾加入新規則 |
-I | num 在規則鏈的頭部加入新規則 |
-D | num 刪除某一條規則 |
-s | 匹配來源地址IP/MASK,加嘆號”!”表示除這個IP外。 |
-d | 匹配目標地址 |
-i | 網卡名稱 匹配從這塊網卡流入的數據 |
-o | 網卡名稱 匹配從這塊網卡流出的數據 |
-p | 匹配協議,如tcp,udp,icmp |
–dport num | 匹配目標端口號 |
–sport num | 匹配來源端口號 |
|
規則鏈名包括(也被稱為五個鉤子函數(hook functions)):
防火墻策略一般分為兩種,一種叫通策略,一種叫堵策略,通策略,默認門是關著的,必須要定義誰能進。堵策略則是,大門是洞開的,但是你必須有身份認證,否則不能進。所以我們要定義,讓進來的進來,讓出去的出去,所以通,是要全通,而堵,則是要選擇。當我們定義的策略的時候,要分別定義多條功能,其中:定義數據包中允許或者不允許的策略,filter過濾的功能,而定義地址轉換的功能的則是nat選項。為了讓這些功能交替工作,我們制定出了“表”這個定義,來定義、區分各種不同的工作功能和處理方式。
我們現在用的比較多個功能有3個:
我們修改報文原數據就是來修改TTL的。能夠實現將數據包的元數據拆開,在里面做標記/修改內容的。而防火墻標記,其實就是靠mangle來實現的。
小擴展:
iptables/netfilter(這款軟件)是工作在用戶空間的,它可以讓規則進行生效的,本身不是一種服務,而且規則是立即生效的。而我們iptables現在被做成了一個服務,可以進行啟動,停止的。啟動,則將規則直接生效,停止,則將規則撤銷。
iptables還支持自己定義鏈。但是自己定義的鏈,必須是跟某種特定的鏈關聯起來的。在一個關卡設定,指定當有數據的時候專門去找某個特定的鏈來處理,當那個鏈處理完之后,再返回。接著在特定的鏈中繼續檢查。
注意:規則的次序非常關鍵,誰的規則越嚴格,應該放的越靠前,而檢查規則的時候,是按照從上往下的方式進行檢查的。
表名包括:
動作包括:
|
|
|
|
|
|
|
iptables -L [-t 表名] [鏈名]
|
|
|
將所有iptables以序號標記顯示,執行:
|
比如要刪除INPUT里序號為8的規則,執行:
|
|
|
只對 OUTPUT,FORWARD,POSTROUTING 三個鏈起作用。
|
|
公網210.14.67.7讓內網192.168.188.0/24上網
|
本機的 2222 端口映射到內網 虛擬機的22 端口
|
比如,我們要過濾所有TCP連接中的字符串test,一旦出現它我們就終止這個連接,我們可以這么做:
|
|
|
用iptables搭建一套強大的安全防護盾 http://www.imooc.com/learn/389
iptables: linux 下應用層防火墻工具
iptables 5鏈: 對應 Hook point netfilter: linux 操作系統核心層內部的一個數據包處理模塊 Hook point: 數據包在 netfilter 中的掛載點; PRE_ROUTING / INPUT / OUTPUT / FORWARD / POST_ROUTING
filter: 訪問控制 / 規則匹配 nat: 地址轉發 mangle / raw
數據訪問控制: ACCEPT / DROP / REJECT 數據包改寫(nat -> 地址轉換): snat / dnat 信息記錄: log
開放 tcp 10-22/80 端口 開放 icmp 其他未被允許的端口禁止訪問
存在的問題: 本機無法訪問本機; 本機無法訪問其他主機
ftp: 默認被動模式(服務器產生隨機端口告訴客戶端, 客戶端主動連接這個端口拉取數據) vsftpd: 使 ftp 支持主動模式(客戶端產生隨機端口通知服務器, 服務器主動連接這個端口發送數據)
允許外網訪問: web http -> 80/tcp; https -> 443/tcp mail smtp -> 25/tcp; smtps -> 465/tcp pop3 -> 110/tcp; pop3s -> 995/tcp imap -> 143/tcp
內部使用: file nfs -> 123/udp samba -> 137/138/139/445/tcp ftp -> 20/21/tcp remote ssh -> 22/tcp sql mysql -> 3306/tcp oracle -> 1521/tcp
nat 轉發
防CC攻擊
|
【Linux防火墻】iptables簡介及上手使用-CSDN博客
【星猿雜談】:在這里我們共同探索科技新趨勢,分享打動人心的影視作品,從人工智能到經典電影,我們追求技術的進步,同時珍視故事的力量。歡迎關注我們,在科技與影視的精彩世界中一起遨游,發現更多未知!#探索與發現#
考慮一種網絡拓撲應用情景,一個內部局域網中有多臺服務器提供不同的服務,如web服務、FTP服務、ssh、telnet等,通過服務器(或網關、防火墻)連接外部網絡,如果外部網絡上的主機需要訪問這些服務器,則需要在網關上實現轉發。
再轉述成另一種應用場合,多臺設備連接到一臺服務器,服務器有2個網卡,分別連接內外網。外網無法直接訪問設備上的數據、服務。在服務器上實現轉發后,則可達到目的。
網絡拓撲如下:
比如,可以通過服務器的8081端口訪問1號設備的web服務,8082端口訪問2號設備web,這樣可以在外部網絡對內網設備進行參數配置、調整。類似地,通過2321訪問1號設備的telnet服務,2322訪問2號設備telnet,以方便登陸設備系統,進行設備狀態監控,日志處理,等等。
本文將直接引用此網絡拓撲圖中的名稱及IP地址。實際使用配置根據實際情況修改。另外說明一下,不必拘泥于本文給出的名稱。像拓撲圖中的“設備”,可以使用一臺安裝linux的服務器替換。其它的類似。
一、原理
在Linux系統使用iptables實現防火墻、數據轉發等功能。iptables有不同的表(tables),每個tables有不同的鏈(chain),每條chain有一個或多個規則(rule)。本文利用NAT(network address translation,網絡地址轉換)表來實現數據包的轉發。iptables命令要用-t來指定表,如果沒有指明,則使用系統缺省的表“filter”。所以使用NAT的時候,就要用“-t nat”選項了。
NAT表有三條缺省的鏈,它們分別是PREROUTING、POSTROUTING和OUTPUT。
先給出NAT結構,如下圖:
PREROUTING:在數據包傳入時,就進到PREROUTIING鏈。該鏈執行的是修改數據包內的目的IP地址,即DNAT(變更目的IP地址)。PREROUTING只能進行DNAT。因為進行了DNAT,才能在路由表中做判斷,決定送到本地或其它網口。
POSTROUTING:相對的,在POSTROUTING鏈后,就傳出數據包,該鏈是整個NAT結構的最末端。執行的是修改數據包的源IP地址,即SNAT。POSTROUTING只能進行SNAT。
OUTPUT:定義對本地產生的數據包的目的NAT規則。
每個數據包都會依次經過三個不同的機制,首先是PREROUTING(DNAT),再到路由表,最后到POSTROUTING(SNAT)。下面給出數據包流方向:
文中的網絡拓撲圖所示的數據包,是從eth0入,eth1出。但是,無論從eth0到eth1,還是從eth1到eth0,均遵守上述的原理。就是說,SNAT和DNAT并沒有規定只能在某一個網口(某一側)。
順便給出netfilter的完整結構圖:
二、實現
出于安全考慮,Linux系統默認是禁止數據包轉發的。所謂轉發即當主機擁有多于一塊的網卡時,其中一塊收到數據包,根據數據包的目的ip地址將包發往本機另一網卡,該網卡根據路由表繼續發送數據包。這通常就是路由器所要實現的功能。
配置Linux系統的ip轉發功能,首先保證硬件連通,然后打開系統的轉發功能
cat /proc/sys/net/ipv4/ip_forward,該文件內容為0,表示禁止數據包轉發,1表示允許,將其修改為1。可使用命令echo "1" > /proc/sys/net/ipv4/ip_forward 修改文件內容,重啟網絡服務或主機后效果不再。若要其自動執行,可將命令echo "1" > /proc/sys/net/ipv4/ip_forward 寫入腳本/etc/rc.d/rc.local 或者在/etc/sysconfig/network腳本中添加 FORWARD_IPV4="YES"
但在我的系統中沒有這兩個文件,因此可以修改/etc/sysctl.conf文件,將net.ipv4.ip_forward=1的注釋取消即可
根據拓撲圖,一一實現不同IP、不同端口的映射,如下命令為一種示例形式:
# 第一臺設備的telnet服務
iptables -t nat -A PREROUTING -i eth0 -d 172.18.44.44 -p tcp --dport 2321 -j DNAT --to 100.100.100.101:23
iptables -t nat -A POSTROUTING -o eth1 -d 100.100.100.101 -p tcp --dport 23 -j SNAT --to 100.100.100.44
# 第二臺設備的telnet服務
iptables -t nat -A PREROUTING -i eth0 -d 172.18.44.44 -p tcp --dport 2322 -j DNAT --to 100.100.100.102:23
iptables -t nat -A POSTROUTING -o eth1 -d 100.100.100.102 -p tcp --dport 23 -j SNAT --to 100.100.100.44
# 第一臺設備的web服務
iptables -t nat -A PREROUTING -i eth0 -d 172.18.44.44 -p tcp --dport 8081 -j DNAT --to 100.100.100.101:80
iptables -t nat -A POSTROUTING -o eth1 -d 100.100.100.101 -p tcp --dport 80 -j SNAT --to 100.100.100.44
# 第二臺設備的web服務
iptables -t nat -A PREROUTING -i eth0 -d 172.18.44.44 -p tcp --dport 8082 -j DNAT --to 100.100.100.102:80
iptables -t nat -A POSTROUTING -o eth1 -d 100.100.100.102 -p tcp --dport 80 -j SNAT --to 100.100.100.44
以第一臺設備轉發命令為例,用白話解釋一下。
第一條是PREROUTING鏈,只能進行DNAT,該命令對從eth0進入且目的IP為172.18.44.44(注:可以用-s指明數據包來源地址,但這時無法知道來源IP是多少,雖然可以用網段的做法,但用-d則指定必須一定唯一的是本機的eth0地址,相對好一點),端口號為2321的數據包進行目的地址更改,更改為100.100.100.101,端口為23,亦即此包的目的地為第一臺設備的telnet服務。
第二條是POSTROUTING鏈,只能進行SNAT,即對先前已經DNAT過的數據包修改源IP地址。這樣,這個數據包達到第一臺設備時,源IP地址、目的IP地址,均為100.100.100.0/24網段了。
上述命令的SNAT有些冗余,可以做簡化,命令如下:
# 第一臺設備的telnet、web服務
iptables -t nat -A PREROUTING -i eth0 -d 172.18.44.44 -p tcp --dport 2321 -j DNAT --to 100.100.100.101:23
iptables -t nat -A PREROUTING -i eth0 -d 172.18.44.44 -p tcp --dport 8081 -j DNAT --to 100.100.100.101:80
# 第二臺設備的telnet、web服務
iptables -t nat -A PREROUTING -i eth0 -d 172.18.44.44 -p tcp --dport 2322 -j DNAT --to 100.100.100.102:23
iptables -t nat -A PREROUTING -i eth0 -d 172.18.44.44 -p tcp --dport 8082 -j DNAT --to 100.100.100.102:80
# 源IP地址SNAT
iptables -t nat -A POSTROUTING -o eth1 -d 100.100.100.0/24 -j SNAT --to 100.100.100.44
實際中使用的命令可能還有變化(簡化),本文不再展示。
三、測試
為了保證文中所述的正確性,本節列出操作結果,以及實驗過程的信息。服務器(網關)上的路由表如下:
root@latelee:test# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
100.100.100.0 * 255.255.255.0 U 0 0 0 eth1
172.18.0.0 * 255.255.0.0 U 0 0 0 eth0
可以看到服務器上有2個網卡,網段都不相同。iptables的NAT表如下:
root@latelee:~# iptables -L -t nat
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DNAT tcp -- anywhere 172.18.44.44 tcp dpt:2324 to:100.100.100.101:23
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
SNAT all -- anywhere 100.100.100.0/24 to:100.100.100.44
可以看到,PREROUTING和POSTROUTING各有一條規則,這些規則由上文命令所產生。對應的,在第一號設備上查看路由信息,如下:
root@latelee:~# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
100.100.100.0 * 255.255.255.0 U 0 0 0 eth0
172.18.0.0 * 255.255.0.0 U 0 0 0 eth1
default 100.100.100.44 0.0.0.0 UG 0 0 0 eth0
可以看到這臺設備有2個網卡,默認網關為服務器的IP地址。但是,其中一個網卡eth1竟然和PC所在網段相同!如果沒有進行源IP地址修改(偽裝),會匹配到eth1這個網口,無法匹配eth0。
在外網的PC上對設備進行telnet,設備抓包信息如下:
IP 100.100.100.44.32253 > 100.100.100.101.2323: Flags [P.], seq 1:4, ack 16, win 256, length 3
IP 100.100.100.101.2323 > 100.100.100.44.32253: Flags [P.], seq 16:19, ack 4, win 2190, length 3
IP 100.100.100.44.32253 > 100.100.100.101.2323: Flags [P.], seq 4:25, ack 19, win 256, length 21
IP 100.100.100.101.2323 > 100.100.100.44.32253: Flags [P.], seq 19:34, ack 25, win 2190, length 15
可見,所有包的IP段都相同。在服務器上對內網eth1進行抓包,由于進行了DNAT和SNAT,此網卡數據包IP地址還是100.100.100.0/24網段,如下:
IP 100.100.100.44.32253 > 100.100.100.101.telnet: Flags [.], ack 1, win 256, length 0
IP 100.100.100.101.telnet > 100.100.100.44.32253: Flags [P.], seq 1:16, ack 1, win 2190, length 15
IP 100.100.100.44.32253 > 100.100.100.101.telnet: Flags [P.], seq 1:4, ack 16, win 256, length 3
IP 100.100.100.101.telnet > 100.100.100.44.32253: Flags [P.], seq 16:19, ack 4, win 2190, length 3
但是,在服務器eth0抓包,將會是172.18.0.0/16的網段數據包:
IP 172.18.44.142.32253 > 172.18.44.44.2324: Flags [P.], seq 18:20, ack 154, win 255, length 2
IP 172.18.44.44.2324 > 172.18.44.142.32253: Flags [P.], seq 154:156, ack 20, win 2190, length 2
IP 172.18.44.44.2324 > 172.18.44.142.32253: Flags [F.], seq 156, ack 20, win 2190, length 0
IP 172.18.44.142.32253 > 172.18.44.44.2324: Flags [.], ack 157, win 255, length 0
IP 172.18.44.142.32253 > 172.18.44.44.2324: Flags [F.], seq 20, ack 157, win 255, length 0
IP 172.18.44.44.2324 > 172.18.44.142.32253: Flags [.], ack 21, win 2190, length 0
從抓包分析,本文所用命令已經能正確進行DNAT和SNAT了。
四、其它
建議在使用iptabls指令時,使用root用戶進行操作,否則容易失敗
保存iptables配置方法:
iptables-save > /etc/iptables.up.rules
配置iptables開機加載
iptables-save > /etc/iptables.up.rules
echo -e '#!/bin/bash\n/sbin/iptables-restore < /etc/iptables.up.rules' > /etc/network/if-pre-up.d/iptables
chmod +x /etc/network/if-pre-up.d/iptables
本地測試指令
iptables -t nat -A PREROUTING -i wlan0 -d 192.168.11.100 -p tcp --dport 8081 -j DNAT --to 192.168.10.101:80
iptables -t nat -A POSTROUTING -o eth0 -d 192.168.10.101 -p tcp --dport 80 -j SNAT --to 192.168.10.52
https://www.linuxprobe.com/iptables-shijian.html