A. linux/unix -shell值iptables基礎知識
原文參考:
iptables防火牆可以用於創建過濾(filter)與NAT規則。所有Linux發行版都能使用iptables,因此理解如何配置 iptables將會幫助你更有效地管理Linux防火牆。如果你是第一次接觸iptables,你會覺得它很復雜,但是一旦你理解iptables的工 作原理,你會發現其實它很簡單。
首先介紹iptables的結構:iptables -> Tables -> Chains -> Rules. 簡單地講,tables由chains組成,而chains又由rules組成。如下圖所示。 [圖片上傳失敗...(image-ba5408-1536195185275)]
圖: IPTables Table, Chain, and Rule Structure
一、iptables的表與鏈
iptables具有Filter, NAT, Mangle, Raw四種內建表:
1. Filter表
Filter表示iptables的默認表,因此如果你沒有自定義表,那麼就默認使用filter表,它具有以下三種內建鏈:
2. NAT表
NAT表有三種內建鏈:
3. Mangle表
Mangle表用於指定如何處理數據包。它能改變TCP頭中的QoS位。Mangle表具有5個內建鏈:
4. Raw表
Raw表用於處理異常,它具有2個內建鏈:
5.小結
下圖展示了iptables的三個內建表:
[圖片上傳失敗...(image-753d8c-1536195185272)]
圖: IPTables 內建表
二、IPTABLES 規則(Rules)
牢記以下三點式理解iptables規則的關鍵:
目標值(Target Values)
下面是你可以在target里指定的特殊值:
如果你執行iptables –list你將看到防火牆上的可用規則。下例說明當前系統沒有定義防火牆,你可以看到,它顯示了默認的filter表,以及表內默認的input鏈, forward鏈, output鏈。
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
查看mangle表:
查看NAT表:
查看RAW表:
!注意:如果不指定 -t 選項,就只會顯示默認的 filter 表。因此,以下兩種命令形式是一個意思:
(or)
以下例子表明在filter表的input鏈, forward鏈, output鏈中存在規則:
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 RH-Firewall-1-INPUT all — 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
1 RH-Firewall-1-INPUT all – 0.0.0.0/0 0.0.0.0/0
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
Chain RH-Firewall-1-INPUT (2 references)
num target prot opt source destination
1 ACCEPT all – 0.0.0.0/0 0.0.0.0/0
2 ACCEPT icmp – 0.0.0.0/0 0.0.0.0/0 icmp type 255
3 ACCEPT esp – 0.0.0.0/0 0.0.0.0/0
4 ACCEPT ah – 0.0.0.0/0 0.0.0.0/0
5 ACCEPT udp – 0.0.0.0/0 224.0.0.251 udp dpt:5353
6 ACCEPT udp – 0.0.0.0/0 0.0.0.0/0 udp dpt:631
7 ACCEPT tcp – 0.0.0.0/0 0.0.0.0/0 tcp dpt:631
8 ACCEPT all – 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
9 ACCEPT tcp – 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
10 REJECT all – 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
以上輸出包含下列欄位:
三、清空所有iptables規則
在配置iptables之前,你通常需要用iptables –list命令或者iptables-save命令查看有無現存規則,因為有時需要刪除現有的iptables規則:
iptables –flush
或者
iptables -F
這兩條命令是等效的。但是並非執行後就萬事大吉了。你仍然需要檢查規則是不是真的清空了,因為有的linux發行版上這個命令不會清除NAT表中的規則,此時只能手動清除:
iptables -t NAT -F
四、永久生效
當你刪除、添加規則後,這些更改並不能永久生效,這些規則很有可能在系統重啟後恢復原樣。為了讓配置永久生效,根據平台的不同,具體操作也不同。下面進行簡單介紹:
1.Ubuntu
首先,保存現有的規則:
iptables-save > /etc/iptables.rules
然後新建一個bash腳本,並保存到 /etc/network/if-pre-up.d/ 目錄下:
iptables-restore < /etc/iptables.rules
這樣,每次系統重啟後iptables規則都會被自動載入。
!注意:不要嘗試在.bashrc或者.profile中執行以上命令,因為用戶通常不是root,而且這只能在登錄時載入iptables規則。
2.CentOS, RedHat
service iptables save
service iptables stop
service iptables start
查看當前規則:
cat /etc/sysconfig/iptables
五、追加iptables規則
可以使用iptables -A命令追加新規則,其中 -A 表示 Append 。因此, 新的規則將追加到鏈尾。
一般而言,最後一條規則用於丟棄(DROP)所有數據包。如果你已經有這樣的規則了,並且使用 -A 參數添加新規則,那麼就是無用功。
1.語法
iptables -A chain firewall-rule
2.描述規則的基本參數
以下這些規則參數用於描述數據包的協議、源地址、目的地址、允許經過的網路介面,以及如何處理這些數據包。這些描述是對規則的基本描述。
-p 協議(protocol)
-s 源地址(source)
-d 目的地址(destination)
-j 執行目標(jump to target)
-i 輸入介面(input interface)
-o 輸出(out interface)
3.描述規則的擴展參數
對規則有了一個基本描述之後,有時候我們還希望指定埠、TCP標志、ICMP類型等內容。
–sport 源埠(source port)針對 -p tcp 或者 -p udp
–-dport 目的埠(destination port)針對-p tcp 或者 -p udp
-–tcp-flags TCP標志 針對-p tcp
-–icmp-type ICMP類型 針對-p icmp
4.追加規則的完整實例:僅允許SSH服務
本例實現的規則將僅允許SSH數據包通過本地計算機,其他一切連接(包括ping)都將被拒絕。
iptables -F
iptables -A INPUT -i eth0 -p tcp –dport 22 -j ACCEPT
iptables -A INPUT -j DROP
六、更改默認策略
上例的例子僅對接收的數據包過濾,而對於要發送出去的數據包卻沒有任何限制。本節主要介紹如何更改鏈策略,以改變鏈的行為。
1. 默認鏈策略
/!警告 :請勿在遠程連接的伺服器、虛擬機上測試!
當我們使用-L選項驗證當前規則是發現,所有的鏈旁邊都有 policy ACCEPT 標注,這表明當前鏈的默認策略為ACCEPT:
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp – anywhere anywhere tcp dpt:ssh
DROP all – anywhere anywhere
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
這種情況下,如果沒有明確添加DROP規則,那麼默認情況下將採用ACCEPT策略進行過濾。除非:
a)為以上三個鏈單獨添加DROP規則:
iptables -A INPUT -j DROP
iptables -A OUTPUT -j DROP
iptables -A FORWARD -j DROP
b)更改默認策略:
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
糟糕!!如果你嚴格按照上一節的例子配置了iptables,並且現在使用的是SSH進行連接的,那麼會話恐怕已經被迫終止了!
為什麼呢?因為我們已經把OUTPUT鏈策略更改為DROP了。此時雖然伺服器能接收數據,但是無法發送數據:
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT tcp – anywhere anywhere tcp dpt:ssh
DROP all – anywhere anywhere
Chain FORWARD (policy DROP)
target prot opt source destination
Chain OUTPUT (policy DROP)
target prot opt source destination
七、配置應用程序規則
盡管5.4節已經介紹了如何初步限制除SSH以外的其他連接,但是那是在鏈默認策略為ACCEPT的情況下實現的,並且沒有對輸出數據包進行限 制。本節在上一節基礎上,以SSH和HTTP所使用的埠為例,教大家如何在默認鏈策略為DROP的情況下,進行防火牆設置。在這里,我們將引進一種新的 參數-m state,並檢查數據包的狀態欄位。
1.SSH
iptables -A INPUT -i eth0 -p tcp –dport 22 -m state –state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp –sport 22 -m state –state ESTABLISHED -j ACCEPT
如果伺服器也需要使用SSH連接其他遠程主機,則還需要增加以下配置:
iptables -A OUTPUT -o eth0 -p tcp –dport 22 -m state –state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp –sport 22 -m state –state ESTABLISHED -j ACCEPT
2.HTTP
HTTP的配置與SSH類似:
iptables -A INPUT -i eth0 -p tcp –dport 80 -m state –state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp –sport 80 -m state –state ESTABLISHED -j ACCEPT
3.完整的配置
iptables -F
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
iptables -A INPUT -i eth0 -p tcp –dport 22 -m state –state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp –sport 22 -m state –state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp –dport 22 -m state –state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp –sport 22 -m state –state ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp –dport 80 -m state –state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp –sport 80 -m state –state ESTABLISHED -j ACCEPT
References
[1] Linux Firewall Tutorial: IPTables Tables, Chains, Rules Fundamentals
[2] IPTables Flush: Delete / Remove All Rules On RedHat and CentOS Linux
[3] Linux IPTables: How to Add Firewall Rules (With Allow SSH Example)
[4] Linux IPTables: Incoming and Outgoing Rule Examples (SSH and HTTP)
[5] 25 Most Frequently Used Linux IPTables Rules Examples
[6] man 8 iptables
B. 如何在linux下查找iptables文件
首先你linux上要有iptables,centos7是沒有的,上面是firewalld
rpm -qa | grep iptables 有防火牆的話,iptables文件在
/etc/sysconfig/iptables這個文件
C. linux下怎麼查看有沒有IPtables
查看是否安裝IPtables:
rpm -qa|grep iptables
查看iptables是否運行:
iptables -L
如果看到是空的,則沒有運行,如果看到有內容輸出則已經有iptables的保護了。
D. linux iptables在哪
linux的iptables可以在命令行配置,也可以用圖形界面配置,不建議用配置文件配置。不同的linux的發行版本使用的圖形界面和命令都不太一樣。比如紅帽的你可以參考《linux就該這么學》第八章有講解,我感覺非常詳細了,如果是別的版本你可以在網上搜一下。如果你配置的服務不好用的話,有可能是selinux的問題,不一定是防火牆在搞鬼。你可把selinux關了,說實話一般情況下沒什麼用。
E. linux有沒有防火牆
有的,iptables,firewallD都是Linux自帶防火牆。
F. 我的linux里找不到iptables文件怎麼辦
與vmware
tools沒有關系。一般是你沒有配置過防火牆,可以使用iptables命令隨便配個防火牆規則,然後使用命令:service
iptables
save進行保存,默認就保存到/etc/sysconfig/iptables文件了。
G. Linux埠轉發(iptables)
當伺服器遷移,因為DNS未同步或某些人使用ip訪問,一些流量還是會流向老的伺服器。
使用iptables及其偽裝特性,將所有流量轉發到老的伺服器。 點擊看iptables的介紹 。
本文假設沒有運行的iptables,至少沒有針對prerouting鏈和postrouting鏈的NAT表的轉發規則。
1) 首先開啟埠轉發
# echo "1" > /proc/sys/net/ipv4/ip_forward
或sysctl net.ipv4.ip_forward=1
2) 增加埠轉發
將埠1111上的流量轉發到主機2.2.2.2 上的埠1111。
# iptables -t nat -A PREROUTING -p tcp --dport 1111 -j DNAT --to-destination 2.2.2.2:1111
然後告訴IPtables偽裝起來(masquerade)
# iptables -t nat -A POSTROUTING -j MASQUERADE
僅僅重定向一個固定網路甚至是一台主機的流量
# iptables -t nat -A PREROUTING -s 192.168.1.1 -p tcp --dport 1111 -j DNAT --to-destination 2.2.2.2:1111
僅僅重定向一個網段的流量
# iptables -t nat -A PREROUTING -s 192.168.1.0/24 -p tcp --dport 1111 -j DNAT --to-destination 2.2.2.2:1111
這就可以進行Linux埠轉發流量了。
查看轉發規則 sudo iptables -t nat -nL
1) docker bridge模式
2) 安全方面,同主機上埠指定網卡ip上的流量轉發
3) 埠轉發到另外的伺服器,見上邊案例
4) snat場景
5) dnat場景,內網訪問外網
https://www.debuntu.org/how-to-redirecting-network-traffic-to-a-new-ip-using-iptables/
H. linux中iptables防火牆怎麼設置
Linux系統內核內建了netfilter防火牆機制。Netfilter(數據包過濾機制),所謂的數據包過濾,就是分析進入主機的網路數據包,將數據包的頭部數據提取出來進行分析,以決該連接為放行或阻擋的機制。Netfilter提供了iptables這個程序來作為防火牆數據包過濾的命令。Netfilter是內建的,效率非常高。
我們可以通過iptables命令來設置netfilter的過濾機制。
iptables里有3張表:
> Filter(過濾器),進入Linux本機的數據包有關,是默認的表。
> NAT(地址轉換),與Linux本機無關,主要與Linux主機後的區域網內計算機相關。
> Mangle(破壞者),這個表格主要是與特殊的數據包的路由標志有關(通常不用涉及到這個表的修改,對這個表的修改破壞性很大,慎改之)。
每張表裡都還有多條鏈:
Filter:INPUT, OUTPUT, FORWARD
NAT:PREROUTING, POSTROUTING, OUTPUT
Mangle:PREROUTING, OUTPUT, INPUT, FORWARD
iptables命令的使用
基本格式:iptables [-t table] -CMD chain CRETIRIA -j ACTION
-t table:3張表中的其中一種filter, nat, mangle,如果沒有指定,默認是filter。
CMD:操作命令。查看、添加、替換、刪除等。
chain:鏈。指定是對表中的哪條鏈進行操作,如filter表中的INPUT鏈。
CRETIRIA:匹配模式。對要過濾的數據包進行描述
ACTION:操作。接受、拒絕、丟棄等。
查看
格式:iptables [-t table] -L [-nv]
修改
添加
格式:iptables [-t table] -A chain CRETIRIA -j ACTION
將新規則加入到表table(默認filter)的chain鏈的最後位置
插入
格式:iptables [-t table] -I chain pos CRETIRIA -j ACTION
將新規則插入到table表(默認filter)chain鏈的pos位置。原來之後的規則都往後推一位。pos的有效范圍為:1 ~ num+1
替換
格式:iptables [-t table] -R chain pos CRETIRIA -j ACTION
用新規則替換table表(默認filter)chain鏈的pos位置的規則。pos的有效范圍為:1 ~ num
刪除
格式:iptables [-t table] -D chain pos
刪除table表(默認filter)chain鏈的pos位置的規則。pos的有效范圍為:1 ~ num
包匹配(CRETIRIA)
上面沒有介紹CRETIRIA的規則,在這小節里詳細介紹。包匹配就是用於描述需要過濾的數據包包頭特殊的欄位。
指定網口:
-i :數據包所進入的那個網路介面,例如 eth0、lo等,需與INPUT鏈配合
-o: 數據包所傳出的那麼網路介面,需與OUTPUT鏈配合
指定協議:
-p:tcp, udp, icmp或all
指定IP網路:
-s:來源網路。可以是IP或網路
IP: 192.168.0.100
網路: 192.168.0.0/24 或 192.168.0.0/255.255.255.0 均可
可以在前加 ! 表示取反
-d:目標網格。同 -s
指定埠:
--sport:指定來源埠。可以是單個埠,還可以是連續的埠,例如:1024:65535。
--dport:指定目標埠。同--sport
注意:要指定了tcp或udp協議才會有效。
指定MAC地址:
-m mac --mac-source aa:bb:cc:dd:ee:ff
指定狀態:
-m state --state STATUS
STATUS可以是:
> INVALID,無效包
> ESTABLISHED,已經連接成功的連接狀態
> NEW,想要新立連接的數據包
> RELATED,這個數據包與主機發送出去的數據包有關,(最常用)
例如:只要已建立連接或與已發出請求相關的數據包就予以通過,不合法數據包就丟棄
-m state --state RELATED,ESTABLISHED
ICMP數據比對
ping操作發送的是ICMP包,如果不想被ping到,就可以拒絕。
--icmp-type TYPE
TYPE如下:
8 echo-request(請求)
0 echo-reply(響應)
注意:需要與 -p icmp 配合使用。
操作(ACTION)
DROP,丟棄
ACCEPT,接受
REJECT,拒絕
LOG,跟蹤記錄,將訪問記錄寫入 /var/log/messages
保存配置
將新設置的規則保存到文件
格式:iptables-save [-t table]
將當前的配置保存到 /etc/sysconfig/iptables
其它
格式:iptables [-t table] [-FXZ]
-F :請除所有的已制訂的規則
-X :除掉所有用戶「自定義」的chain
-Z :將所有的統計值清0
I. linux7中還用iptables嗎
你問的是centos7嗎?
centos7中iptables 默認是沒有安裝的,用的是firewall ,如果想繼續使用iptables
只需要:
systemctl stop firewalld.service && systemctl disablefirewalld.service
yum -y install iptables-services
systemctl enable iptables.service &&systemctl start iptables.service
J. LInux iptables 屏蔽設置
1.修改SSH配置文件:/etc/ssh/sshd_config #找到Port 22,這里是標識默認使用22埠,修改為:
Port 22
Port 1234
/etc/init.d/sshd restart
#這樣SSH埠將同時工作在22、1234上
查看防火牆規則
1、iptables -nvL
2、more /etc/sysconfig/iptables
2.添加防火牆規則
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 1234 -j ACCEPT
/etc/rc.d/init.d/iptables save
/etc/rc.d/init.d/iptables restart
然後使用SSH工具 測試 你所設置的埠是否能正常使用
如果能正常使用返回到第一步,刪除原來的22埠,以及修改防火牆配置文件
之所以先設置成兩個埠,測試成功後再關閉一個埠,是為了方式在修改的過程中,萬一出現掉線、斷網、誤操作等未知情況時候,還能通過另外一個埠連接上去調試以免發生連接不上的狀況。
開啟自動啟動:chkconfig iptables on
開啟不自動啟動:chkconfig iptables off
附錄:
設定預設規則,INPUT鏈默認拒絕,OUTPUT鏈默認接受,FORWARD鏈默認拒絕
iptables -F #清除預設表filter中的所有規則鏈的規則
iptables -X #清除預設表filter中使用者自定鏈中的規則
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP
iptables -L -n --line #按行數顯示防火牆規則
iptables -D INPUT 1 #刪除INPUT表第一條
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT #來源、目的為127.0.0.1都接受,這條放最後就可以了
1、安裝iptables防火牆
如果沒有安裝iptables需要先安裝,CentOS執行:
yum install iptables
Debian/Ubuntu執行:
apt-get install iptables
2、清除已有iptables規則
iptables -F
iptables -X
iptables -Z
3、開放指定的埠
#允許本地回環介面(即運行本機訪問本機)
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
# 允許已建立的或相關連的通行
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#允許所有本機向外的訪問
iptables -A OUTPUT -j ACCEPT
# 允許訪問22埠
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
#允許訪問80埠
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
#允許FTP服務的21和20埠
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp --dport 20 -j ACCEPT
#如果有其他埠的話,規則也類似,稍微修改上述語句就行
#禁止其他未允許的規則訪問
iptables -A INPUT -j REJECT (注意:如果22埠未加入允許規則,SSH鏈接會直接斷開。)
iptables -A FORWARD -j REJECT
4、屏蔽IP
#如果只是想屏蔽IP的話「3、開放指定的埠」可以直接跳過。
#屏蔽單個IP的命令是
iptables -I INPUT -s 123.45.6.7 -j DROP
#封整個段即從123.0.0.1到123.255.255.254的命令
iptables -I INPUT -s 123.0.0.0/8 -j DROP
#封IP段即從123.45.0.1到123.45.255.254的命令
iptables -I INPUT -s 124.45.0.0/16 -j DROP
#封IP段即從123.45.6.1到123.45.6.254的命令是
iptables -I INPUT -s 123.45.6.0/24 -j DROP
5、查看已添加的iptables規則
iptables -L -n
v:顯示詳細信息,包括每條規則的匹配包數量和匹配位元組數
x:在 v 的基礎上,禁止自動單位換算(K、M) vps偵探
n:只顯示IP地址和埠號,不將ip解析為域名
6、刪除已添加的iptables規則
將所有iptables以序號標記顯示,執行:
iptables -L -n --line-numbers
比如要刪除INPUT里序號為8的規則,執行:
iptables -D INPUT 8
7、iptables的開機啟動及規則保存
CentOS上可能會存在安裝好iptables後,iptables並不開機自啟動,可以執行一下:
chkconfig --level 345 iptables on
開啟自動啟動:chkconfig iptables on
開啟不自動啟動:chkconfig iptables off
將其加入開機啟動。
CentOS上可以執行:
service iptables save
/etc/rc.d/init.d/iptables save
/etc/rc.d/init.d/iptables restart
保存規則。
另外更需要注意的是Debian/Ubuntu上iptables是不會保存規則的。
需要按如下步驟進行,讓網卡關閉是保存iptables規則,啟動時載入iptables規則:
創建/etc/network/if-post-down.d/iptables 文件,添加如下內容:
#!/bin/bash
iptables-save > /etc/iptables.rules
執行:chmod +x /etc/network/if-post-down.d/iptables 添加執行許可權。
創建/etc/network/if-pre-up.d/iptables 文件,添加如下內容:
#!/bin/bash
iptables-restore < /etc/iptables.rules
執行:chmod +x /etc/network/if-pre-up.d/iptables 添加執行許可權。
關於更多的iptables的使用方法可以執行:iptables --help或網上搜索一下iptables參數的說明。
註:每次服務在停止之前會自動將現有的規則保存
在 /etc/sysconfig/iptables 這個文件中去.