iptables学习笔记
1、數據包的流向
數據包在主機上有三個流向:
a、發往本機:從本機的內核空間流向用戶空間(應用程序) ?
b、本機發出:從本機的用戶空間流向內核空間,在經過網卡流出
c、轉發:從本機的一個網卡進來,從另外一個網卡出去
2、數據鏈(內置):
iptables有5條內置鏈來對數據報文進行規則控制
PREROUTING:剛到達本機,在進行路由之前的報文
INPUT:進入到本機的報文
FORWARD:由本機轉發的報文
OUTPUT:從本機發出的報文
POSTROUTING:進行路由之后,要離開本機的報文
3、防火墻功能表
上面提到了防火墻有5條鏈可以配置規則來對數據報文進行控制,那么防火墻都有哪些功能呢?
filter:報文過濾,是否允許報文通過
nat:網絡地址轉換,用于修改源IP或者目標IP,也可以改端口
mangle:拆解報文,做出修改并重新封裝報文。
raw:關閉nat表上啟用的連接追蹤功能,基本上用不著。
上面4個功能實際上是4個表。以下是各個表包含的鏈
-
mangle表包含以下鏈
-
PREROUTING
-
INPUT
-
OUTPUT
-
POSTROUTING
-
-
總之該表不常用,幾乎不用。
-
nat表主要用于來源地與目的地的ip或port轉換,與linux本機無關主要于內網計算機有關。包含以下鏈
-
PREROUTING:在進行路由之前進行規則(DNAT/REDIRECT)
-
POSTROUTING:在進行路由判斷后執行規則(SNAT/MASQUERADE)
-
OUTPUT:與發送出去的數據包有關
-
-
關于POSTROUTING,固定ip的時候選擇SNAT,非固定IP比如撥號上網的時候選擇MASQUERADE鏈,修改目的ip地址的DNAT操作PREROUTING鏈
-
filter表主要跟linux本機有關,是默認的table,也是最重要的表。包含以下鏈
-
INPUT:主要與數據包想要進入Linux主機有關
-
OUTPUT:主要于Linux本機所要送出的數據包有關
-
FORWARD:與Linux本機沒有關系,他可以將數據包轉發到后段的計算機中,于nat這個table相關性很高
-
防火墻功能和鏈的對應關系:
注意下圖中的這些功能有優先級的關系。上面的優先級別下面高,例如在PREROUTING鏈上,
raw > mangle > nat
數據包傳輸過程中經過的鏈和表
4、報文流向和鏈的對應關系
流入本機:PREROUTING ==> INPUT
由本機流出:OUTPUT ==> POSTROUTING
轉發:PREROUTING ==> FORWARD ==> POSTROUTING
練習:如果要求拒絕192.168.1.100這臺主機訪問本機的web服務,該在哪條鏈上設置什么功能?
首先拒絕訪問本機的web服務用到的是filter功能,而只有INPUT、FORWARD、OUTPUT鏈能做過濾功能,由于是訪問本機的web服務,所以應該是在INPUT鏈上設置防火墻規則。
5、iptables命令使用
? ? ? ?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #man?iptables ???????iptables?[-t?table]?{-A|-C|-D}?chain?rule-specification ???????iptables?[-t?table]?-I?chain?[rulenum]?rule-specification ???????iptables?[-t?table]?-R?chain?rulenum?rule-specification ???????iptables?[-t?table]?-D?chain?rulenum ???????iptables?[-t?table]?-S?[chain?[rulenum]] ???????iptables?[-t?table]?{-F|-L|-Z}?[chain?[rulenum]]?[options...] ???????iptables?[-t?table]?-N?chain ???????iptables?[-t?table]?-X?[chain] ???????iptables?[-t?table]?-P?chain?target ???????iptables?[-t?table]?-E?old-chain-name?new-chain-name ???????rule-specification?=?[matches...]?[target] ???????match?=?-m?matchname?[per-match-options] ???????target?=?-j?targetname?[per-target-options] |
iptables規則格式:
? ?
| 1 | ?iptables?[-t?table]?COMMAND?chain?[-m?matchname?[per-match-options]]-j?targetname?[per-target-options] |
-t table:指定表名,包括raw、mangle、nat、filter。默認為filter表
COMMAND:??
? ?實現鏈管理:
? ? ? -N:new,自定義一條新的規則鏈
?例如:
| 1 | iptables?-N?mychain |
?創建一個自定義的,名為mychain的鏈
? ? ? ? ? ? ? ?-X:delete,刪除自定義的規則鏈,如果指定名稱,則刪除指定的,不指定名稱,刪除所有自 ? 定義的鏈
例如:
| 1 | iptables?-X |
刪除所有自定義的鏈,刪除刪除指定的自定義鏈,后面加鏈的名稱,如:
| 1 | iptables?-X?mychain |
? ? ? ? ? ? ? ? ? ? ?
? ? ? -P:Policy,設置默認策略,對filter表中的鏈而言,其默認策略有:
? ? ? ? ?ACCEPT: 接受
? ? ? ? ?DROP: ?丟棄
? ? ? ? ?REJECT: ?拒絕
? ? ? -E: ?重命名自定義鏈;引用計數不為0的自定義鏈不能夠被重命名,也不能被刪除
? ? ? ? ? ? ? ? ? ? ? ? ??
? ??規則管理:增、刪、查
? ? ? -A :append,追加一條規則,放在鏈的尾部
? ? ? -I: insert, 插入一條規則,后面通常加數字,表示插入到第幾條后面,省略是表示插入到第一條 ? ? ? ? ? ? ? ?
? ? ? -D:delete,刪除:
? ? ? ?(1):指明規則序號;如:iptables -t nat -D INPUT 2
? ? ? ?(2):指明規則本身
? ? ? -R:replace,替換指定鏈上的指定規則;
? ? ? -F:flush,清空指定的規則鏈 ?如:iptables -F INPUT
? ? ? -Z:zero,置零;
? ? ? ? ?iptables的每條規則都有兩個計數器:
? ? ? ? ? (1)匹配到的報文的個數
? ? ? ? ? (2)匹配到的所有的報文的大小之和;
? ? ? ? ? ??
? ??查看規則:
? ? ? -L:list,列出指定鏈上的所有規則
? ? ? ? ?-n:numberric, 以數字格式顯示地址和端口號
? ? ? ? ? ? -vv,-vvv:顯示詳細信息
? ? ? ? ?-x:exactly,顯示計數器結果的精確值
? ? ? ? ?--line-numbers:顯示規則的序號
chain:指定鏈名稱,包括PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING
匹配條件:
? ?基本匹配條件:無需加載任何模塊,由 iptables/netfilter自定提供
? ? [!] ?-s,--source address[/mask] :檢查報文中的源IP地址是否符合此處指定的地址或者范圍,!表 ? 示取反
? ? [!] -d,--destination address[/mask] : 檢查報文中的目標IP地址是否符合此處指定的地址或范圍 ? ? ? ?
? ? [!] -p,--protocol protocol?
? ? ? ? protocol:tcp、udp、udplite、Icmp、 Icmpv6.esp、ah、sctp、mh or 'all'
? ? ? ? {tcp| upd | icmp} ? ??
? ? [!] -i,--in-interface name:數據報文流入的接口;只能應用于數據報文流入的環節,如 ? ? ? ? ? ? ? PREROUTING 、INPUT、和FORWARD鏈
? ? [!] -o,--out-interface name: 數據報文流出的接口,只能應用于數據報文流出的環節,如
POSTROUTING、OUTPUT和FORWARD鏈
? ? ??
? ?擴展匹配條件:需要加載擴展模塊,方可生效
? ? ?隱式擴展:不需要手動加載擴展模塊,因為它們是對協議的擴展,所以但凡使用了-p指明了協議,就表示已經指明了要擴展的模塊
? ? ? tcp:
? ? ? ? [!] --source-port, --sport port[:port] : 匹配報文的源端口,可以是端口范圍
? ? ? ? [!]--destination-port,--dport port [:port] 匹配報文的目標端口
? ? ? ? [!]--tcp-flags mask comp:
? ? ? ? [!]--syn:用于匹配第一次握手,相當于"--tcp-flags SYN,ACK,FIN,RST SYN"
? ? ?
? ? ? udp:
? ? ? ? [!] --source-port, --sport port[:port] : 匹配報文的源端口,可以是端口范圍
? ? ? ? [!]--destination-port,--dport port [:port] 匹配報文的目標端口
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ? icmp:
? ? ? ? [!]--icmp-type {type[/code]|typename}
? ? ? ? ? ?echo-request: 8
? ? ? ? ? ?echo-reply: 0
? ? ?顯示擴展:必須要手動加載擴展模塊。[-m matchname [per-match-options]]
? ? ? ? #rpm -ql iptables | grep .so ?
? ? ? ? 所有小寫字母結尾的都是規則擴展模塊,大寫字母結尾的都是目標擴展模塊
? ? ? ? ? ? ? ? ? ??
? ? ? ?1、multiport擴展:以離散的方式,定義多端口匹配機制,最多支持15個端口
? ? ? ? [!] --source-ports,--sports port[,port|port:port]...:指定多個源端口
? ? ? ? [!] --destination-ports,--dports port[,port|port:port]...:指定多個目標端口??
? ? ? ? [!] --ports port[,port|port:port]...:指明多個端口,包含源端口和目標端口
?例如:開放本機(ip: 172.16.206.130)的80和22端口 ? ? ? ? ? ? ? ? ??
| 1 | ??iptables??-A?INPUT?-d?172.16.206.130?-p?tcp?-m?multiport?--dports?22,80?-j?ACCEPT |
?
? ? ? ??2、iprange擴展:指明連續的(但一般不能擴展為整個網絡的)IP地址范圍
? ? ? ? [!] --src-range from[-to]: 源IP地址
? ? ? ? [!] --dst-range from[-to]:目標IP地址
?例如:拒絕172.16.206.10--172.16.206.15的主機訪問本機的web服務的80端口 ? ??
| 1 | ?iptables?-A?INPUT?-d?172.16.206.30?-p?tcp?--dport?80?-m?iprange?--src-range?172.16.206.10-172.16.206.15?-j?DROP |
? ? ? ? ? ? ? ? ? ? ??
? ? ? ?3、string擴展: ?對報文中的應用數據做字符串模式匹配檢測;
? ? ? ? ? --algo{bm | kmp}:字符串匹配檢測算法,這兩種算法性能差不多,隨便用哪一個
? ? ? ? ? ? ?bm: ?Boyer*Moore
? ? ? ? ? ? ?kmp: ?Knuth-Pratt-Morris
? ? ? ? [!] --string parttern:要檢測的字符串模式
? ? ? ? [!]--hex-string
? ? ? ?4、time擴展:根據將報文到達的時間與指定的時間范圍進行匹配 ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? --datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]] ?:指定起始時間,包括年月日,時分秒
? ? ? ? --datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
? ? ? ? --timestart hh:mm[:ss] :每天的起始時間 ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? --timestop hh:mm[:ss]:每一天的結束時間
? ? ? ? --weekday:指明星期幾,值為 Mon, Tue, Wed, Thu, Fri, Sat, Sun, 或者1-7?
? ? ? ? --kerneltz:centOS7上才有的參數,表示使用內核上的時區,而非默認的UTC
例如:每周末的下午14:30到17:30,不允許172.16.100.0/24網段的用戶訪問本機Web服務
| 1 | ?iptables?-A?INPUT?-s?172.16.100.0/24??-d?172.16.206.30??-p?tcp?--dport?80?-m?-times?--timestart?14:30??--timestop?18:30?--weekdays?Sat,Sun?-j?DROP |
? ? ? ? ? ? ? ? ??
? ? ? ??5、connlimit擴展:根據每客戶端IP做并發連接數數量匹配:
? ? ? ? --connlimit-upto n:連接的數量小于等于n時匹配
? ? ? ? --connlimit-above n:連接的數量大于n時匹配
例如: 限制客戶端連接本地FTP服務器的連接數最大為2 (連接超過2次就拒絕)
| 1 | ?iptables?-A?INPUT?-D?172.16.206.130?-P?tcp?--dport?21?-m?connlimit?--connlimit-above?2?-j?REJECT |
? ? ? ? ? ? ? ? ? ? ?
? ? ? ??6、limit擴展:基于收發報文的速率做匹配
? ? ? ? ?令牌桶過濾器
? ? ? ? ? ? ? ? ? ? ? ? ? ??
?
處理動作:
? ? -j targetname [per-target-options]
? ? ? ? ACCEPT
? ? ? ? DROP
? ? ? ? REJECT
? ? ? ? RETURN:返回調用鏈
? ? ? ? REDIRECT : ?端口重定向
? ? ? ? LOG: ?記錄日志
? ? ? ? DNAT: ?目標地址轉換
? ? ? ? SNAT: ?原地址轉換
? ? ? ? MASQUERADE: ?地址偽裝
? ? ? ? ......
? ? ? ? 自定義鏈:
防火墻服務:
? ? ??CentOS6:
? ? ? ? service iptables {start | sop| restart | status}
? ? ? ? ? start: 讀取事先保存的規則,并應用到netfilter上
? ? ? ? ? stop:清空netfilter上的規則,以及還原默認策略等
? ? ? ? ? status:顯示生效的規則
? ? ? ? ? restart:清空netfilter上的規則,再讀取事先保存的規則,并應用到netfilter上:
??
? ? ? ? ? 默認的規則文件:/etc/sysconfig/iptables
? ? ??CentOS7:systemctl start | stop | restart | status firewalld.service
iptables命令使用練習:
查看所有鏈:
| 1 2 3 4 5 6 7 | #?iptables?-L 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 |
?
新建一條自定義的鏈:
| 1 2 3 4 5 6 7 8 9 10 | [root@localhost?conf.d]#?iptables?-N?mychain [root@localhost?conf.d]#?iptables?-L 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????????? Chain?mychain?(0?references) target?????prot?opt?source???????????????destination |
刪除所有自定義的鏈:
| 1 2 3 4 5 6 7 8 | [root@localhost?conf.d]#?iptables?-X [root@localhost?conf.d]#?iptables?-L 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 |
?
刪除指定的自定義鏈
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | [root@localhost?conf.d]#?iptables?-N?test [root@localhost?conf.d]#?iptables?-L 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????????? Chain?test?(0?references) target?????prot?opt?source???????????????destination????????? [root@localhost?conf.d]#?iptables?-X?test [root@localhost?conf.d]#?iptables?-L 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 |
禁止主機172.16.100.216 ping本機(IP 10.10.10.202)
| 1 2 3 4 5 6 7 8 | iptables??-I?INPUT?-p?icmp??-s?172.16.100.216?-d?10.10.10.202?-j?REJECT iptables?-t?filter?-L?-n?--line-numbers??-v Chain?INPUT?(policy?ACCEPT?329?packets,?24775?bytes) num???pkts?bytes?target?????prot?opt?in?????out?????source???????????????destination????????? 1????????0?????0?REJECT?????icmp?--??*??????*???????172.16.100.216???????10.10.10.202????????reject-with?icmp-port-unreachable? Chain?FORWARD?(policy?ACCEPT?0?packets,?0?bytes) num???pkts?bytes?target?????prot?opt?in?????out?????source???????????????destination |
上面的需求還可以這樣寫
| 1 | iptables?-I?INPUT?-d?172.16.206.130?-p?icmp?--icmp-type?8?-j?DROP |
這里使用了icmp的擴展協議“--icmp-type”
放行所有已建立的連接和相關連的連接
| 1 | iptables?-A?INPUT?-m?state?--state?ESTABLISHED,RELATED?-j?ACCEPT |
生產環境,阿里云主機的防火墻配置
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #?Generated?by?iptables-save?v1.4.7?on?Tue?Nov?17?20:14:09?2015 *filter :INPUT?ACCEPT?[0:0] :FORWARD?ACCEPT?[0:0] :OUTPUT?ACCEPT?[0:0] -A?INPUT?-m?state?--state?RELATED,ESTABLISHED?-j?ACCEPT? -A?INPUT?-p?icmp?-j?ACCEPT? -A?INPUT?-i?lo?-j?ACCEPT? -A?INPUT?-i?eth0?-j?ACCEPT? -A?INPUT?-s?x.x.x.x/32?-j?ACCEPT??//允許公司的公網IP的請求進來 -A?INPUT?-s?x.x.x.x/32?-p?tcp?-m?state?--state?NEW?-m?multiport?--dports?80?-j?ACCEPT??//zabbix的公網IP,用于監控 -A?INPUT?-p?tcp?-m?state?--state?NEW?-m?multiport?--dports?10051?-j?ACCEPT?//開放zabbix?server的服務端口? -A?INPUT?-j?REJECT?--reject-with?icmp-host-prohibited? -A?FORWARD?-j?REJECT?--reject-with?icmp-host-prohibited? COMMIT #?Completed?on?Tue?Nov?17?20:14:09?2015 |
iptables之源地址轉換
源地址轉換:SNAT
常用案例:企業內部客戶端訪問外網,這里把iptables server當路由使用
| 1 | iptables?-t?nat?-A?POSTROUTING?-s?192.168.0.0/24?-o?eth0?-j?SNAT?--to-source?120.56.35.132 |
| 1 | iptables?-t?nat?-A?POSTROUTING?-s?192.168.10.0/24?-o?eth0?-j?SNAT?--to-source?120.56.35.132 |
如果企業用的是ADSL撥號上網,則可以這樣寫
| 1 | iptables?-t?nat?-A?POSTROUTING?-s?192.168.100.0/24?-o?eth0?-j?MASQUERADE |
MASQUERADE也是SNAT的一種,它能自動找到合適的地址,一般外網地址不是靜態IP的情況下用它。
目標地址轉換:DNAT
目標地址轉換用于讓互聯網上的主機訪問本地內網上的某服務器上的服務,僅作用于nat表上PREROUTING和OUTPUT,同時也有端口轉換作用
例如:內網主機172.16.1.100的httpd服務監聽在8080端口,互聯網上訪問防火墻服務器1.2.3.4(代表公網IP)的80時轉換到主機172.16.1.100的8080上,
| 1 | iptables?-t?nat?-A?PREROUTING?-d?1.2.3.4?-p?tcp?--dport?80?-j?DNAT?--to-destination?172.16.1.100:8080 |
本文轉自 曾哥最愛 51CTO博客,原文鏈接:http://blog.51cto.com/zengestudy/1840392,如需轉載請自行聯系原作者
總結
以上是生活随笔為你收集整理的iptables学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Citrix VDI攻略之四:PVS安装
- 下一篇: 理解 Neutron FWaaS - 每