iptables命令的詳解
netfilter:linux內核中的防火墻的框架,Feamework,防火墻功能實現的主體;
iptables:專門為netfilter編寫的數據報文的匹配規則的用戶空間的應用程序工具;
在使用iptables防火墻的時候,我們建議將Centos 7 中的 firewalld 關閉,並停止運行;
[root@ljy ~]# systemctl stop firewalld.service [root@ljy ~]# systemctl disable firewalld.service
並把核心轉發功能開啟,這關系到我們轉發功能;
[root@ljy ~]# echo 1 > /proc/sys/net/ipv4/ip_forward [root@ljy ~]# cat /proc/sys/net/ipv4/ip_forward 1
把 SELinux 設成 premissive 模式;
[root@ljy ~]# setenforce 0 [root@ljy ~]# getenforce Permissive
netfilter的邏輯結構:
chain:
INPUT
OUOTPUT
FORWARD
PREROUTING
POSTROUTING
table:
filter:過濾器,包過濾防火墻功能;
包含:INPUT、OUOTPUT、FORWARD三條鏈
nat:用於修改報文的源地址和/或目的地址,而且還可以修改端口號;
地址轉換
地址偽裝
包含:PREROUTING、POSTROUTING、OUTPUT、INPUT(1.4+版本中新增加)
mangle:拆解報文並對報文格式進行修改,然後在重新封裝報文;
流量控制
數據標簽
包含:PREROUTING、POSTROUTING、OUTPUT、INPUT、FORWARD五條鏈;
raw:關閉nat表上啟動的連接追蹤機制;
包含:PREROUTING、OUTPUT兩條鏈;
各個表中相同規則鏈上的規則生效優先級次序(從高到低);
raw --> mangle --> nat --> filter
定義規則時的註意事項:
1.規則的匹配順序是由上至下按照書寫順序進行匹配;
1) 同一類規則,匹配範圍最小的應該寫在最上面;
2) 非同一類的規則,匹配頻率越高的應該寫在上面;
3) 建議盡量不修改鏈的默認策略為組織所有數據,如果想要設置組織所有數據的規則,在鏈的最後一條設置阻止所有數據的規則即可;
iptables規則編寫的通用格式:
iptables [-t table] COMMAND CHAIN [-m matchname] [per-match-options] -j targetname [per-target-options]
-t table:指定選擇執行那個表的功能,可以選擇的表包括:raw,mangle,nat及filter,如果省略此選項,則表示使用默認表——filter表;
-m matchname:通常是配置顯示擴展的匹配條件時,必須書寫;如果省略則表示要配置基本匹配條件或隱式擴展匹配條件;
-j targetname:指定所有匹配條件的數據包的處理動作;
COMMAND:
鏈的操作命令:
-P, --policy chain target
用於定義指定鏈的默認策略;通常有兩種動作選擇,即:ACCEPT和DROP;
-N, --new-chain chain
創建一條新的自定義的規則鏈;新建的鏈上的規則必須要被內鍵鏈上的規則調用才能生效;
-X, --delete-chain [chain]
刪除被內鍵鏈調用次數為0的自定義鏈;
-E -rename-chain
重定義被內鍵鏈調用次數為0的自定義鏈;
-F -flush
清除所有指定鏈(表中所有鏈)上的規則;
規則的操作命令:
-A -append chain rule-specification:
在指定的鏈的末尾追加一條規則;
-D, --delete chain rule-specification
-D, --delete chain rulenum
從指定的鏈上刪除一條規則,可以指明具體規則,也可以指明規則在鏈上的編號;
-I, --insert chain [rulenum] rule-specification:
在指定的鏈上插入一條規則,默認是將新規則插入至鏈的第一條規則,也可以指定規則編號,使得插入的規則稱為指定鏈上的第rulenum條規則;
-R, --replace chain rulenum rule-specification:
用命令行中的規則替換指令鏈上的第rulenum條規則,並不是修改規則張總某個具體條件,而是用完全替換整條規則;
-L, --list [chain]:
列表顯示指定表指定鏈(所有鏈)上的所有規則;
可以使用的其他常用選項:
-v, --verbose:顯示更詳細的信息,還有-vv;
-n, --numeric:將規則中的所有信息都進行數字化顯示;包括主機名和端口號等信息;
-x, --exact:精確的顯示計數器的結果;
每個規則都有兩個計數器:
1.規則所匹配的報文的個數;
2.規則所匹配的報文的字節總數;
--line-numbers:顯示指定鏈上各個規則的編號;
其他的命令:
-Z, --zero [chain [rulenum]]
將指定鏈的規則計數器置0;
常用的TARGETS:
LOG:對於匹配的數據報文的的流動情況進行日誌記錄,並不會影響數據報文本身的傳輸;
MARK:對於匹配的數據報文進行防火墻標記的設置;
MASQUERADE: 源地址偽裝,一種特殊情況的IP地址轉換;
REDIRECT:目標IP地址和端口的重定向;
REJECT:阻止數據報文傳輸並向數據報文的源頭返回消息;
SNAT:源IP地址轉換;
DNAT:目標IP地址轉換;
ACCEPT:對於匹配的數據報文進行放行;
DROP:對於匹配的數據報文進行阻止;
RETURN:在規則鏈之間跳轉;
匹配條件:
默認情況下,同一條命令中的不同條件之間存在邏輯"與"的關系;
!: 對於匹配的結果取反,有除了...之外的意思;
基本匹配條件:
[!] -s, --source address[/mask][,...]
檢測數據報文中的源IP地址的匹配範圍;可以是單個IP地址,也可以是子網,主網,超網等IP地址設定:0.0.0.0/0表示整個ip地址棧中所有的ip地址;如果省略該條件,意味著將匹配所有的源IP地址;
[!] -d, --destination address[/mask][,...]
檢測數據報文中的目的IP地址的匹配範圍;可以是單個IP地址,也可以是子網,主網,超網等IP地址設定:0.0.0.0/0表示整個ip地址棧中所有的ip地址;如果省略該條件,意味著將匹配所有的目的IP地址;
[!] -i, --in-interface name
檢查數據報文入站的接口是否能夠被此條件所匹配;
[!] -o, --out-interface name
檢查數據報文出站的接口是否能夠被此條件所匹配;
擴展匹配條件:
隱式擴展匹配條件:
[!] -p, --protocol protocol
[!] -p, [-m matchname] --protocol protocol
檢查數據報文某指定的協議的封裝首部中是否有符合條件的特性或字段;
可以在此處指定的協議包括:
tcp, udp, udplite, icmp, icmpv6, esp, ah, sctp, mh, all
tcp協議:
[!] --source-port,--sport port[:port]
[!] --destination-port,--dport port[:port]
用於指定源端口和/或目標端口的匹配條件;每次只能指定一個端口或一組連續的端口,而不能指定離散端口;
[!] --tcp-flags mask comp
用於指定在tcp協議首部中各標誌位的匹配條件;
URG, SYN, RST, PSH, FIN, ACK, ALL, NONE
mask:設定要檢測的標誌位的列表,可以使用","進行分隔;
comp:必須被置"1"的標誌位列表,剩余的在mask列表中的標誌位必須置"0";
[!] --syn
相當於:--tcp-flags SYN,RST,ACK,FIN SYN
udp協議(udp模塊):
[!] --source-port,--sport port[:port]
[!] --destination-port,--dport port[:port]
用於指定源端口和/或目標端口的匹配條件;每次只能指定一個端口或一組連續的端口,而不能指定離散端口;
icmp協議(icmp模塊)
[!] --icmp-type {type[/code]|typename}
常用的icmp-type:
echo-request: 代碼為8;
echo-reply: 代碼為0;
顯式擴展匹配條件:
1.multiport擴展:
一次性的寫入多個離散端口或多組連續端口,最大的上限15組端口,每一個段範圍占用兩個端口;
可以支持的協議:tcp, udp, udplite, dccp, sctp
相關選項:
[!] --source-ports,--sports port[,port|,port:port]...
[!] --destination-ports,--dports port[,port|,port:port]...
[!] --ports port[,port|,port:port]...
--dports 22 ,80,3306 -j ACCEPT
示例:
~]# iptables -I FORWARD -s 192.168.100.100 -d 172.16.69.2 -p tcp -m multiport --dports 22,80,3306 -j ACCEPT
~]# iptables -I FORWARD -d 192.168.100.100 -s 172.16.69.2 -p tcp -m multiport --sports 22,80,3306 -j ACCEPT
2.iprange擴展:
以連續的任意數量的IP地址訪問作為匹配條件:
相關選項:
[!] --src-range from[-to]
[!] --dst-range from[-to]
-m iprange --src-range 172.16.1.100-172.16.1.200
示例:
~]# iptables -I FORWARD -m iprange --src-range 192.168.100.1-192.168.100.100 -d 172.16.69.2 -p tcp -m multiport --dports 22,80,3306 -j ACCEPT
~]# iptables -I FORWARD -m iprange --dst-range 192.168.100.1-192.168.100.100 -s 172.16.69.2 -p tcp -m multiport --sports 22,80,3306 -j ACCEPT
3.string擴展:
對數據報文中的應用層數據做字符串匹配檢測;
相關選項:
--algo {bm|kmp}
--string "STRING"
示例:
~]# iptables -I FORWARD -s 172.16.69.2 -m string --algo bm --string "dafa" -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...]
定義每個月中的各個天,1-31
[!] --weekdays day[,day...]
定義每個星期的星期幾,1-7
示例:
~]# iptables -I FORWARD -m time --timestart 08:00:00 --timestop 17:59:59 ! --weekdays 6,7 -o eno16777736 -j REJECT
5.stat擴展 modprobe nf_conntrack_ftp內核模塊;
連接狀態檢測的模塊;基於連接追蹤機制實現;
conntrack
iptables對連接狀態的定義:
INVALID, ESTABLISHED, NEW, RELATED or UNTRACKED;
INVALID:無法識別的連接狀態,無效的通信狀態;SYN,FIN
ESTABLISHED:已經建立連接的狀態;連接態;
NEW:尚未建立連接的狀態;
RELATED:與其他已經建立的連接有相互關聯的連接狀態;關聯態或衍生態;
UNTRACKED:未追蹤的狀態;
內核中用於保存連季節追蹤狀態數據的位置:/proc/net/nf_conntrack
能夠被追蹤到的最大的連接數:/proc/sys/net/nf_conntrack_max
註意:此處記錄的最大連接數的數值,建議必要時可以調整其大小到足夠大;
為了能夠盡可能的高效利用內存資源,緩存的連接追蹤的狀態不能無限期保存,因此設置了相應的超時時間;
/proc/sys/net/netfilter/nf_conntrack*timeout*
利用連接追蹤設置FTP服務器的訪問控制:
~]# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
~]# iptables -A INPUT -d 172.16.69.2 -p tcp -m multiport --dports 21,22,80,3306 -m state --state NEW -j ACCEPT
~]# iptables -A INPUT -j DROP
註意:需要裝載nf_conntrack_ftp內核模塊;
~]# modprobe nf_conntrack_ftp
設置nf_conntrack_ftp模塊的自動裝載;
/etc/sysconfig/iptables-config
IPTABLES_MODULES="nf_conntrack_ftp"
利用連接追蹤可以設置OUTPUT鏈上的通用規則;
~]# iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
~]# iptables -A OUTPUT -j DROP
6.mac擴展
實現mac地址的擴展進行限制;PREROUTING, INTPUT, FORWARD鏈;
[!] --mac-source address
匹配Mac地址,其形式必須是:XX:XX:XX:XX:XX:XX
7.connlimit擴展:
根據每個客戶端IP地址做並發連接數的匹配檢測;
相關選項:
[!] --connlimit-upto n
當客戶端當前的並發連接數小於或等於n時,可以匹配此條件;此條件通常和ACCEPT動作配合使用;
[!] --connlimit-above n
當客戶端當前的並發連接數大於n時,可以匹配此條件;此條件通常和DROP或REJECT動作配合使用;
8.limit擴展:
基於服務器端收發數據報文的速率來進行匹配檢測;
--limit rate[/second|/minute|/hour|/day]
服務器端最大單位時間內能夠接收的報文速率;
--limit-burst number
初始時所能接收的數據報文的最大數量;
示例:
~]# iptables -I INPUT 1 -p icmp --icmp-type 8 -m limit --limit 15/minute --limit-burst 8 -j ACCEPT
nat表:
功能:
1.NAT,Network Address Translation,
1) SNAT: Source-Address Nat
通常用於讓局域網中使用私有ipv4地址的主機能夠訪問外部網絡或互聯網;
一般在路由選擇之後完成原地址自的網絡地址轉換,因此,與iptables而言,此類規則應配置在POSTROUTTING鏈上;
a.靜態地址轉換:一對一地址轉換;
b.地址偽裝:多對一地址值轉換;
2) DNAT:Destination-Address Nat
通常用於讓外部網絡或互聯網中的主機能夠訪問局域網中使用私有ipv4地址的服務器上的網絡服務;
一般在路由選擇之前就需要完成目標地址的網絡地址轉換,因此,於iptables而言,此類規則應配置在PREROUTING鏈上;
2.NAPT:Network Address and Port Translation,網絡地址端口轉換;
網絡地址轉換 + 地址映射
SNAT:
This is the correct behavior when the next dialup is unlikely to have the same interface address (and hence any established connections are lost anyway).
--to-ports port[-port]
註意:在REHL或Centos系發信號版Linux中,SNAT所指定的ipaddr必須是當前主機上配置並生效的ip地址;
示例:
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 172.16.1.74
~]# iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -j MASQUERADE
//源地址偽裝技術,無需指定具體的內部全局地址,自動決定本地可用的IP地址作為內部全局地址,進行源地址轉換
DNAT:
This target is only valid in the nat table, in the PREROUTING and OUTPUT chains, and user-defined chains which are only called from those chains.
--to-destination [ipaddr[-ipaddr]][:port[-port]]
示例:
~]# iptables -t nat -A PREROUTING -d 192.168.100.1 -p tcp --dport 80 -j DNAT --to-destination 172.16.69.2:8000
與之相同功能的操作:
1.在路由器上設置NAT轉換的防火墻規則:
~]# iptables -t nat -R PREROUTING 1 -d 192.168.100.1 -j DNAT --to-destination 172.16.69.2
2.在目標服務器上做端口重定向:需要使用REDIRECT target
~]# iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8000
iptables命令的詳解