試驗建議:關閉CentOS 7 或 CentOS 6的防火墻 (systemctl stop firewalld ; systemctl disable firewalld 或 service iptables stop ; chkconfig iptables off)
iptables ? -vnL --line-numbers ? ?
?
iptables ? -A ? ?INPUT ?-p ? tcp ? ?--dport ? ? ?80 ? -j ? ?ACCEPT
?
?
# 在表的對應鏈上添加規則 iptables [-t
table] {-A|-C|-D} chain # ipv6 ip6tables [-t
table] {-A|-C|-D} chain # 在鏈中插入規則 iptables [-t
table] -I # 修改對應鏈的規則 iptables [-t
table] -R # 刪除對應鏈上的規則 iptables [-t
table] -D # 顯示鏈上的規則 iptables [-t
table] -S # 將鏈上的規則全部清除 iptables [-t
table] {-F|-L|-Z} [chain # 增加一條自定義鏈 iptables [-t
table] -N # 刪除一條自定義鏈 iptables [-t
table] -X # 修改鏈上的默認策略 iptables [-t
table] -P # 重命名自定義鏈 iptables [-t
table] -E # 規則的格式 rule-specification = [matches...] [target] # 匹配的格式 match = -m matchname [per-match-options] # 處理的格式 target = -j targetname [per-target-options]
- iptables命令格式(記牢,如果你在這里有點蒙的話,請不要急。稍后帶你玩一玩你就懂了)
# -t 指定功能表,SUBCOMMAND其實就是各種選項,作用在哪一條鏈上 matches表示匹配規則,target表示處理的動作 iptables
[-t table] SUBCOMMAND chain [matches...] [ -j target] 1:-t table 指定功能表 功能表有:raw , mangle , nat , filter,如果不指定,默認就是filter 2:SUBCOMMAND:指定在對應鏈上的增、刪、改、查 (1)查看規則 -L:表示列出功能表對應鏈上的所有的規則 -n:以數字格式顯示地址和端口,如果不加n選項,會反解主機名和端口對應的服務名 -v:顯示詳細格式 -x:顯示計數器的精確值,每一條規則都有兩類計數器,一類用于顯示被匹配到的報文的個數,一類用于顯示size --line-numbers:顯示鏈上的規則編號 (2)規則管理 -A :表示append 追加,默認為最后一個 -I: 表示insert插入,默認為第一個 -D:delete,刪除 1:rule specification 2: rule number -R: replace, 替換 -F:flush, 清刷鏈上的規則 -Z:zero,置0 -S:顯示指定鏈的所有的規則,以iptables-save命令的格式顯示 -A: LNPUT OUTPUT...規則鏈
-s: IP(源地址)
-d : IP(目標地址)
-j: DROP 丟棄 ACCEPT 接收 REJECT 拒絕 SNAT 基于源地址的轉換 source 制定源地址
-F:清除所有的規則鏈
增刪規則管理命令
-A:追加,在當前鏈的最后新增一個規則
-I num : 插入,把當前規則插入為第幾條。-I 3 :插入為第三條
-R num:Replays替換/修改第幾條規則格式:iptables -R 3 …………
-D num:刪除,明確指定刪除第幾條規則
?
?
iptables的每一條規則有兩類計數器 (1)由本規則匹配到的所有的packets (2)由本規則匹配到的所有的bytes (3)鏈管理 -N :新增一條自定義鏈 -X:刪除自定義的空鏈 -E:rename,重命名自定義鏈的未被引用的鏈(引用計數器為0) 例如:iptables -N uplooking 例如:iptables -E uplooking mychain 例如:iptables -P FORWARD DROP (4)默認策略管理 -P:設置默認策略 ACCEPT:接受 允許數據包通過
DROP:丟棄 丟棄數據包,不對該數據包做進一步的處理,對接收棧而言,就好像該數據包從來沒有被接收一樣
REJECT:拒絕 丟棄數據包,同時發送適當的響應報文(針對TCP連接的TCP重要數據包或針對UDP數據包的ICMP端口不可達消息)
SNAT : 基于原地址的轉換
source: 指定原地址
比如我們現在將所有的192.168.10.0網段的IP在經過的時候全部轉換192.168.100.1: iptables -t nat -A? POSTROUTING -s 192.168.10.0/24 -j SNAT --to-source 172.16.100.1(外網有效ip) 這樣,只要是來自本地網絡的試圖通過網卡訪問網絡的,都會被統統轉換成172.16.100.1這個IP. 例如:iptables -P FORWARD DROP 例如:iptables -P INPUT DROP
例如:iptables -vnL --
line-numbers 查看filter表作用的鏈 例如:iptables -t nat -
nL查看nat表對應的鏈 例如:iptables -
N uplooking 增加一個自定義鏈 例如:iptables -
E uplooking mychain 將自定義鏈 uplooking 改名為 mychain 例如:iptables -X mychain 刪除自定義鏈,注意只有是空的鏈才能刪除 例如:iptables -P FORWARD
DROP 將FARWARD鏈的默認策略改為DROP 例如:iptables -P
INPUT DROP 將INPUT的默認鏈改為DROP,這樣的話,報文無法進入內核,不能被用戶空間的服務接受,如ssh協議無法實現,遠程無法連接 - match匹配條件(實操第一部分:基本匹配)(非常重要,請務必認真聽講)
1:基本匹配:
netfilter的hooks函數自帶的匹配機制 [!] -s, --source address[/mask][,...]: 原地址匹配, ! 表示取反,表示不被匹配之意 [!] -d, --destination address[/mask][,...] :目標地址匹配,! 表示取反,表示不被匹配之意 [!] -i, --in-interface name:限制報文流入的接口匹配(入棧報文),只能由于:PREROUTING,INPUT,FORWARD [!] -o, --out-interface name:限制報文流出的接口匹配(出棧報文),只能由于:OUTPUT,POSTROUTING, FORWARD 例如:
iptables -A INPUT -s 192.168.10.223 -d 192.168.10.222 -j DROP 在INPUT鏈中添加一個規則,使得192.168.10.223的報文丟棄 例如:
iptables -A INPUT -s 192.168.10.223 -d 192.168.10.222 -j ACCEPT 將192.168.10.223的報文接受,但是如果對于一個IP的規則只能做出一個動作,如果想重新設置需要將規則清空,使用iptables -F - match匹配條件(實操第二部分:隱式擴展匹配)(非常重要,請務必認真聽講)
2:擴展匹配:擴展模塊匹配引入的匹配機制,-m matchname 隱式擴展:可以不使用-m選項專門的加載相應的模塊,但是要加-p選項,指明使用哪種協議
[!] -p {tcp|udp|icmp|icmpv6|esp|ah|sctp|mh|all}:限制協議,就不需要用-m指定加載的擴展模塊 例如:iptables -A INPUT -s
192.168.10.223 -d 192.168.10.222 -p tcp -j ACCEPT 表明如果是tcp協議的放行 ① tcp:隱含了-m tcp。 有專用選項
[!] --source-port,--sport port[:port]:匹配報文中的TCP首部的源端口,可以是端口范圍 [!] --destination-port,--dport port[:port]:匹配報文中的TCP首部的目標端口,可以是端口范圍 [!] --tcp-flags mask comp: 檢查報文中的指明mask的TCP標志位,要這些標志位中comp必須為1,了解即可 [!] --syn:相當于--tcp-flags syn,fin,ack,rst syn,匹配三次握手的第一次,了解即可 例如: --tcp-flags syn,fin,ack,rst syn:指明這四個標志位中的syn必須為
1,而其他的為0,也就是TCP的第一次握手 例如:--tcp-flags syn,fin,ack,rst syn,fin:就是四次斷開中的第一次 示例
1:指明開放tcp協議的80端口,也就是web服務 iptables -A INPUT -s
0/0 -d 192.168.10.222 -p tcp --dport 80 -j ACCEPT iptables -A OUTPUT -s
192.168.10.222 -d 0/0 -p tcp --sport 80 -j ACCEPT 示例
2:指明開放TCP的22端口,也就是ssh服務 iptables -A INPUT -s
0/0 -d 192.168.10.222 -p tcp --dport 22 -j ACCEPT iptables -A OUTPUT -s
192.168.10.222 -d 0/0 -p tcp --sport 22 -j ACCEPT ② udp:隱含了-m udp。有專用選項
[!] --source-port,--sport port[:port] :匹配報文中的udp首部的源端口,可以是端口范圍 [!] --destination-port,--dport port[:port]:匹配報文中的udp首部的目標端口,可以是端口范圍 ③ icmp:隱含指明了”-m icmp”。有專用選項
[!] --icmp-type {type[/code]|typename} type/code有兩種類型:
0/0 :echo reply 指明應答的類型 8/0:echo request 指明請求的類型 示例
1:開放別人可以ping自己 iptables -A INPUT -d
192.168.10.222 -p icmp --icmp-type 8 -j ACCEPT iptables -A OUTPUT -s
192.168.10.222 -p icmp --icmp-type 0 -j ACCEPT 示例
2:開放自己可以ping別人 iptables -A INPUT -d
192.168.10.222 -p icmp --icmp-type 0 -j ACCEPT iptables -A OUTPUT -s
192.168.10.222 -p icmp --icmp-type 8 -j ACCEPT - match匹配條件(實操第三部分:顯示擴展匹配)(非常重要,請務必認真聽講)
顯示擴展:必須使用-m加載擴展模塊
1:multiport :多端口匹配,離散的方式定義的多端口匹配,最多可以指定15個端口 [!] --source-ports,--sports port[,port|,port:port]...:指定源端口 [!] --destination-ports,--dports port[,port|,port:port]...:指定目標端口 [!] --ports port[,port|,port:port]...:可以指定源端口和目標端口 例如:同時開放
22和80端口 iptables -I INPUT -s
0/0 -d 192.168.10.222 -p tcp -m multiport --dports 22,80 -j ACCEPT iptables -I OUTPUT -s
192.168.10.222 -d 0/0 -p tcp -m multiport --sports 22,80 -j ACCEPT 2:iprange :指明一段連續的IP地址范圍,作為源地址或目標地址的匹配 [!] --src-range from[-to]:指定源地址范圍 [!] --dst-range from[-to]:指定目標地址范圍 例如:指定客戶端
ip在192.168.10.1-192.168.10.254范圍內的才能訪問telnet服務 iptables -A INPUT -d
192.168.10.222 -p tcp --dport 23 -m iprange --src-range 192.168.10.1-192.168.10.254 -j ACCEPT iptables -A OUTPUT -s
192.168.10.222 -p tcp --sport 23 -m iprange --dst-range 192.168.10.1-192.168.10.254 -j ACCEPT 3:string:對報文中的應用層數據做字符串匹配檢測 --algo {bm|kmp} [!] --string pattern :給定要檢查的字符串模式 [!] --hex-string pattern:給定要檢查的字符串模式,十六進制編碼 例如:只要頁面中包含admin的頁面都不能訪問 iptables -I OUTPUT -s
192.168.10.222 -d 0/0 -p tcp --sport 80 -m string --algo bm --string "admin" -j REJECT 4:time:收到報文的時間/日期與指定到的時間/日期做匹配 --datestart YYYY[-MM[-
DD[Thh[:mm[:ss]]]]]:起始日期時間 --datestop YYYY[-MM[-
DD[Thh[:mm[:ss]]]]]:結束日期時間 --timestart hh:mm[:
ss]:以天為單位的起始時間 --timestop hh:mm[:
ss]:以天為單位的起始時間 [!] --monthdays day[,day...]:匹配一個月中的哪天 [!] --weekdays day[,day...]:匹配一個周中的哪天 例如:指定客戶端
IP范圍和訪問時間才能訪問 iptables -I INPUT -d
192.168.10.222 -p tcp --dport 23 -m iprange --src-range 192.168.10.1-192.168.10.254 -m time --timestart 08:00:00 --timestop 018:00:00 -j ACCEPT 5:connlimit:根據每個客戶端主機做并發并發連接數量限制,就是每個客戶端最多發起的連接數量 --connlimit-upto n:連接數量小于等于n,則匹配 --connlimit-above n:連接數量大于n,則匹配 例如: iptables -A INPUT -s
0/0 -d 192.168.10.222 -p tcp --dport 23 -m connlimit --connlimit-upto 2 -j ACCEPT iptables -A OUTPUT -s
192.168.10.222 -d 0/0 -p tcp --sport 23 -m connlimit --connlimit-upto 2 -j ACCEPT 6:limit:基于令牌桶算法對報文的速率做匹配。 --limit rate[/second|/minute|/hour|/day] :限制等待的速率, 也就是接受或響應數據包的速率 --limit-burst number:第一次可以有多少個不需要等待的 例如:這里是限制每分鐘只能入棧
20個icmp的報文,并且第一次入棧允許5個不需要等待,后續的報文每次需要等待2秒 iptables -A INPUT -d
192.168.10.222 -p icmp --icmp-type 8 -m limit --limit 30/minute --limit-burst 5 -j ACCEPT iptables -A OUTPUT -s
192.168.10.222 -p icmp --icmp-type 0 -j ACCEPT 7:state:用于對報文狀態判斷 [!] --state state:匹配報文的狀態 INVALID :無法識別的連接 ESTABLISHED:連接追蹤模塊中存在記錄的連接 NEW:連接追蹤模板當中不存在的連接請求 RELATED:相關聯的連接 UNTRACKED:未追蹤的連接
例如1:允許自己ping別人 iptables -A OUTPUT -s 192.168.10.222 -p icmp --icmp-type 8 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -d 192.168.10.222 -p icmp --icmp-type 0 -m state --state ESTABLISHED -j ACCEPT ? 例如2:允許別人ping自己 iptables -A INPUT -d 192.168.10.222 -p icmp --icmp-type 8 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -s 192.168.10.222 -p icmp --icmp-type 0 -m state --state ESTABLISHED -j ACCEPT 8:對于連接追蹤還需了解的知識 已經追蹤到的并記錄下來的連接保存在 /proc/net/nf_conntrack里面 如果追蹤的記錄滿載了,就會顯示連接超時 連接追蹤功能所能夠記錄的最大連接數量保存在 (可調整)/proc/sys/net/nf_conntrack_max 這里可以通過命令調節內核中的參數 sysctl -w net.nf_conntrack_max=
300000 將最大的追蹤記錄調節到300000個 conntrack所能追蹤的連接數量的最大值取決于/proc/sys/net/nf_conntrack_max的設定,已經追蹤的連接位于/proc/net/nf_conntrack文件中,超時的連接會被刪除,當模板滿載,后續的新連接有可能會超時。解決辦法: (
1)加大nf_conntrack_max的值 (
2)降低nf_conntrack條目的超時時長 不同協議的連接追蹤時長定義在/proc/sys/net/netfilter下
- target處理動作(實操第四部分:處理動作)(非常重要,請務必認真聽講)
-j
ACTION [per-target-options] ACCETP , DROP , REJECT
RETURN :返回調用的鏈 REDIRECT:端口重定向
LOG:日志 MARK:防火墻標記 DNAT:目標地址轉換 SNAT:原地址轉換 MASQUERADE:地址偽裝
1:開放ssh、web、telnet服務 # 由于 ESTABLISHED會經常被訪問,因此寫在第一個 iptables -A INPUT -m
state --state ESTABLISHED -j ACCEPT # 特定的服務開放 iptables -A INPUT -d
192.168.10.222 -p tcp -m multiport --dports 22,80,23 -m state --state NEW -j ACCEPT iptables -A INPUT -d
192.168.10.222 -p icmp --icmp-type 8 -m state --state NEW -j ACCEPT # 所有的入棧報文,出棧全部被允許 iptables -A OUTPUT -m
state --state ESTABLISHED -j ACCEPT ?
?
?
2:開放ftp、ssh、web、telnet服務 思考:對于ftp服務來說,有兩個端口,
20、21,如果想使用RELATED關聯追蹤,應該讓內核加載nf_conntrack_ftp模塊 # 內核加載nf_conntrack_ftp模塊 modprobe nf_conntrack_ftp # 放行了ftp協議的數據連接的端口,由于端口是隨機的,所以不要給定端口號,并且指明連接追蹤是related和established iptables -A INPUT -d
192.168.10.222 -m state --state RELATED,ESTABLISHED -j ACCEPT # 特定的服務開放 iptalbes -A INPUT -d
192.168.10.222 -p tcp -m miltiport --dports 22,23,80,21 -m state --state NEW -j ACCEPT iptables -A INPUT -d
192.168.10.222 -p icmp --icmp-type 8 -m state --state NEW -j ACCEPT # 所有的入棧報文,出棧全部被允許 iptables -A OUTPUT -s
192.168.10.222 -m state --state ESTABLISHED -j ACCEPT INPUT行為總結: dport值本地 sport值外地
OUTPUT行為總結: dport值外地 sport 值本地
?
CentOS
6和CentOS 7: iptables-restore < 指定保存規則的文件路徑 CentOS
6:會自動從/etc/sysconfig/iptables重載規則 service iptables restart
(
1)把iptables命令放在腳本文件中,讓腳本文件開機自動運行 /etc/rc.d/rc
.local 中寫入執行iptables的命令的腳本 (
2)將保存的規則通過腳本命令自動開機重載 /etc/rc.d/rc
.local 中 寫入 iptables-restore < 指定保存規則的文件路徑 iptables 命令執行后的規則策略僅當前生效,若想重啟后依然保存股則則需要 " service? iptables? save" 腳本 iptables.sh
IPTABLES=/sbin/iptables
MODPROBE=/sbin/modprobe
INT_NET=192.168.10.0/24
####flush existing rules and set chain policy setting to drop(重置現有規則和鏈策略設置)
echo "[+] Flushing existing iptables rules..."
$IPTABLES -F-----------------------------(清空規則鏈)
$IPTABLES -F -t nat----------------------(清空nat表)
$IPTABLES -X-----------------------------(刪除用戶的空鏈)
$IPTABLES -p INPUT DROP------------------(關閉input端口)
$IPTABLES -p OUTPUT DROP-----------------(關閉output端口)
$IPTABLES -p FORWARD DROP----------------(關閉forward端口)
###load connection-tracking modules------(負載連接模塊)
$MODPROBE ip_conntrack-------------------(加載ip_conntrack模塊)
$MODPROBE iptables_nat-------------------(加載iptables_nat模塊)
$MODPROBE ip_conntrack_ftp---------------(加載ip_conntrack_ftp模塊)
$MODPROBE ip_nat_ftp---------------------(加載ip_nat_ftp模塊) ###ACCEPT rules
$IPTABLES -A FORWARD -p tcp -i eth1 -s $INT_NET --dport 21 --syn -m state --state NEW -j ACCEPT
$IPTABLES -A FORWARD -p tcp -i eth1 -s $INT_NET --dport 22 --syn -m state --state NEW -j ACCEPT
$IPTABLES -A FORWARD -p tcp -i eth1 -s $INT_NET --dport 25 --syn -m state --state NEW -j ACCEPT
$IPTABLES -A FORWARD -p tcp -i eth1 -s $INT_NET --dport 43 --syn -m state --state NEW -j ACCEPT
$IPTABLES -A FORWARD -p tcp --dport 80 --syn -m state --state NEW -j ACCEPT
$IPTABLES -A FORWARD -p tcp --dport 443 --syn -m state --state NEW -j ACCEPT
$IPTABLES -A FORWARD -p tcp -i eth1 -s $INT_NET --DPORT 4321 --syn -m state --state NEW -j ACCEPT
$IPTABLES -A FORWARD -p tcp -p udp --dport 53 -m state --state NEW -j ACCEPT
$IPTABLES -A FORWARD -p tcp icmp --icmp-type echo-request -j ACCEPT
允許通過防火墻發起ftp、ssh、smtp和whois連接,但這類必須是從子網接口(eth1)上的內部子網發起的,允許來自任何源地址的http、https和dns通信通過防火墻
$IPTABLES -t nat -A PREROUTING -p tcp --dport 80 -i eth0 -j DNAT --to 192.168.10.3:80
$IPTABLES -t nat -A PREROUTING -p tcp --dport 443 -i eth0 -j DNAT --to 192.168.10.3:443
$IPTABLES -t nat -A PREROUTING -p tcp --dport 53 -i eth0 -j DNAT --to 192.168.10.4:53
$IPTABLES -t nat -A POSTROUTING -是¥INT_NET -o eth0 -j MASQUERAD
內網的web服務器和DNS服務器的ip地址分別為192.168.10.3、4,用于提供NAT功能的iptables命令,3個PREROUTING規則允許外網的web服務和DNS請求被發送給合適的內網服務器,在POSTROUTING規則允許來自內部不可路由網絡并指向外部因特網的連接看起來就像他們來自IP地址71.157.X.X
轉載于:https://www.cnblogs.com/liu1026/p/7522719.html
總結
以上是生活随笔為你收集整理的iptables 工具的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。