iptables簡稱為包過濾型防火墻一般分為2種: 1,主機防火墻:主機防火墻是用來防止本主機內的應用服務被攻擊所需要保護的防火墻 2,網絡防火墻:做為想路由功能的防火墻凡是進過此服務器的數據包都要進行規則匹配 iptables的架構由功能和鏈組成 功能: filter:過濾,防火墻; nat:地址轉換nerwork address translation mangle:拆解報文,做出修改,封裝報文 raw:關閉nat表示啟用的連接追蹤功能(此功能非常消耗CPU) 每一種功能都會內置幾種鏈: PREROUTING-->路由前 INPUT-->輸入一段 FORWARD-->由本機轉發 OUTPUT-->本機內部發出 POSTROUTING-->在第二次路由決策 在iptables上每一種功能的實現機制都是基于上訴的幾種鏈接: 流入:PREROUTING-->INPUT 流出:OUTPUT-->POSTROUTING 轉發:PEROUTING-->FORWARD-->POSTROUTING 在功能上每一種功能都會內置幾種連接 filter(過濾):INPUT,FORWARD,OUTPUT nat(地址轉換):PERROUTING(DNAT),OUTPUT,POSTROUTING(SNAT) mangle(拆解報文,做出修改,封裝報文):PEROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING raw(關閉nat表示啟用的連接追蹤功能):PREROUTING,OUTPUT 功能優先級:raw>mangle>nat>filter 規則: 組成部分:報文的匹配條件,匹配到之后處理動作 匹配條件:根據協議報文特征指定匹配條件 基本匹配條件 擴展匹配條件 處理動作: 內建處理機制 自定義處理機制 iptables:規則管理工具 添加,修改,刪除,顯示等 iptables命令:查看linux上man配置手冊里面會有詳細的解釋 iptables -t (按照自己的修改查看自己需要找的幾個表默認為filter) 例如: [root@localhost ~]# iptables -t mangle -L -n Chain PREROUTING (policy ACCEPT) target prot opt source destination 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 POSTROUTING (policy ACCEPT) target prot opt source destination 上訴為查看iptables中mangle規則 iptables命令分為2種鏈管理,規則管理 鏈管理: -F:flush,清空規則鏈,省略鏈表示清空指定表上所有的鏈; -N:new,創建新的自定義規則鏈; [root@localhost ~]# iptables -t filter -N IN_public [root@localhost ~]# iptables -L -n 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 IN_public (0 references) target prot opt source destination -X:drop,刪除用戶自定義的規則鏈,必須是空鏈 [root@localhost ~]# iptables -X IN_public [root@localhost ~]# iptables -L -n 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 -Z:zero,置零:置零規則計數器; -P:policy,為指定鏈設置默認處理策略;對filter表中的鏈而言,默認策略通常有accept(放行),drop(丟棄),reject(拒絕) [root@localhost init.d]# iptables -P FORWARD DROP [root@localhost init.d]# iptables -L -n Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy DROP) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination -E:rename:重命名自定義鏈:引用計數器不為0的自定義鏈無法改名,也無法刪除; [root@localhost ~]# iptables -E IN_public hello [root@localhost ~]# iptables -L -n 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 hello (0 references) target prot opt source destination 規則管理: -A:append,將新規則追加于指定鏈的尾部; -I:insert,將新規則插入至指定鏈的指定位置; -D:delete,刪除指定鏈上的指定規則; 有兩種指定方式: (1)指定匹配條件; (2)指定規則編號; -R:replace,替換指定鏈上的指定規則: 查看: -L:list,列出指定鏈上的所有規則; -n:numberic,以數字格式顯示地址和端口號; -v:verbose,顯示詳細信息 --line-numbers:顯示規則編號; -x:exactly,顯示計數器計數結果的精確值; 匹配條件: 基本匹配: [!]-s,--src,--source IP|Netaddr:檢查報文中源IP地址是否符合此處的指明的地址范圍; [!]-d,--dst,--destination IP|Netaddr檢查報文中源IP地址是否符合此處指定的地址范圍; [!]-p,--protocol{tcp,udp,icmp}:檢查報文中的協議,即ip首部中的protocols所標識的協議 -i,--ininterface IFACE:數據報文的流入接口:僅能用于PREROUTING, INPUT及FORWARD鏈上; -o, --out-interface IFACE:數據報文的流出接口;僅能用于FORWARD, OUTPUT及POSTROUTING鏈上; 目標: -j TARGET:jum至指定的TARGET ACCEPT:接受 DROP:丟棄 REJECT:拒絕 RETURN:返回調用鏈 REDIRECT:端口重定向 LOG:記錄日志 MARK:做防火墻標記 DNAT:目標地址轉換 SNAT:源地址轉換 MASQUERADE:地址偽裝 自定義鏈:由自定義鏈上的規則進行匹配檢查 例如:放行本機TCP協議 [root@localhost ~]# iptables -t filter -A INPUT -d 172.16.0.46 -p tcp -j ACCEPT [root@localhost ~]# iptables -L -n Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT tcp -- 0.0.0.0/0 172.16.0.46 Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination [root@localhost ~]# iptables -t filter -A OUTPUT -s 172.16.0.46 -p tcp -j ACCEPT [root@localhost ~]# iptables -L -n -v Chain INPUT (policy ACCEPT 6 packets, 468 bytes) pkts bytes target prot opt in out source destination 203 14998 ACCEPT tcp -- * * 0.0.0.0/0 172.16.0.46 Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 30 3168 ACCEPT tcp -- * * 172.16.0.46 0.0.0.0/0 如果我將INPUT和OUTPUT關閉之后任然可以進行訪問 [root@localhost ~]# iptables -P INPUT DROP [root@localhost ~]# iptables -P OUTPUT DROP [root@localhost ~]# iptables -P FORWARD DROP [root@localhost ~]# iptables -L -n Chain INPUT (policy DROP) target prot opt source destination ACCEPT tcp -- 0.0.0.0/0 172.16.0.46 Chain FORWARD (policy DROP) target prot opt source destination Chain OUTPUT (policy DROP) target prot opt source destination ACCEPT tcp -- 172.16.0.46 0.0.0.0/0 擴展匹配:-m指明擴展匹配(指明擴展名)--spec_options 例如:-m tcp --dport 22 隱式擴展:對-p protocol指明的協議進行擴展,可省略-m選項; -p tcp --dport PORT[-PORT]:目標端口,可以是單個端口或連續多個端口 --sport PORT[-PORT]: --tcp-flages: -p udp -p icmp --icmp-type 例如本地可以ping通任意地址,而其他主機無法ping通 ]# iptables -A INPUT -d 172.16.0.46 -p icmp --icmp-type 0 -j ACCEPT ]# iptables -A OUTPUT -s 172.16.0.46 -p icmp --icmp-type 8 -j ACCEPT ?。。。。?!這里需要提醒一下在放行http80端口的時候如果php的安裝是基于fpm模式編譯安裝的話需要對本地的9000端口做雙向的認證否則http無法調用php的fpm功能: root@localhost etc]# iptables -L -n Chain INPUT (policy DROP) target prot opt source destination ACCEPT tcp -- 0.0.0.0/0 172.16.0.46 tcp dpt:22 ACCEPT tcp -- 0.0.0.0/0 172.16.0.46 tcp dpt:80 ACCEPT icmp -- 0.0.0.0/0 172.16.0.46 icmp type 0 ACCEPT tcp -- 127.0.0.1 0.0.0.0/0 tcp spt:9000 ACCEPT tcp -- 0.0.0.0/0 127.0.0.1 tcp dpt:9000 Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy DROP) target prot opt source destination ACCEPT tcp -- 172.16.0.46 0.0.0.0/0 tcp spt:22 ACCEPT tcp -- 172.16.0.46 0.0.0.0/0 tcp spt:80 ACCEPT icmp -- 172.16.0.46 0.0.0.0/0 icmp type 8 ACCEPT tcp -- 127.0.0.1 0.0.0.0/0 tcp spt:9000 ACCEPT tcp -- 0.0.0.0/0 127.0.0.1 tcp dpt:9000 顯示擴展:必須使用-m選項指定使用的擴展 CentOS 6: man iptables CentOS 7: man iptables-extensions 1,multiport擴展 以離散方式定義多端口匹配:最多匹配15個端口; ]# iptables -I INPUT -d 172.16.0.46 -p tcp -m multiport --dport 22,80 -j ACCEPT ]# iptables -I OUTPUT -s 172.16.0.46 -p tcp -m multiport --sport 22,80 -j ACCEPT 2,iprange擴展 指明連續的(但一般是不能擴展為整個網絡)ip地址范圍有效: [!] --src-range from[-to]:指明連續的源IP地址范圍; [!] --dst-range from[-to]:指明連續的目標IP地址范圍; ~]# iptables -I INPUT -d 172.16.100.9 -p tcp -m multiport --dports 22:23,80 -m iprange --src-range 172.16.100.1-172.16.100.120 -j ACCEPT ~]# iptables -I OUTPUT -s 172.16.100.9 -p tcp -m multiport --sports 22:23,80 -m iprange --dst-range 172.16.100.1-172.16.100.120 -j ACCEPT 3,string擴展 檢查報文中出現的字符串; ~]# iptables -I OUTPUT -m string --algo bm --string 'movie' -j REJECT 4、time擴展 根據報文到達的時間與指定的時間范圍進行匹配; --datestart --datestop --timestart --timestop --monthdays --weekdays 5,state擴展 根據連接追蹤機制檢查連接間的狀態 調整連接追蹤功能所能夠容納的最大連接數量: /proc/sys/net/nf_conntrack_max 已經追蹤到并記錄下的連接: /proc/net/nf_conntrack 不同協議或連接類型追的時長: /proc/sys/net/netfilter/ 可追蹤的連接狀態: NEW:新發出的請求;連接追蹤模板中不存此連接相關的信息條目,因此,將其識別為第一次發出的請求; ESTABLISHED:NEW狀態之后,連接追蹤模板中為其建立的條目失效之前期間內所進行的通信的狀態; RELATED:相關的連接;如ftp協議的命令連接與數據連接之間的關系; INVALIED:無法識別的連接; iptables放行被動模式下的ftp服務: (1)裝載ftp追蹤時專用的模塊在 [root@localhost netfilter]# pwd /lib/modules/2.6.32-358.el6.x86_64/kernel/net/netfilter (1) 裝載ftp追蹤時的專用的模塊: # modprobe nf_conntrack_ftp (2) 放行請求報文: 命令連接:NEW, ESTABLISHED 數據連接:RELATED, ESTABLISHED # iptables -A INPUT -d LocalIP -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT # iptables -A INPUT -d LocalIP -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT (3) 放行響應報文: ESTABLISEHD # iptables -A OUTPUT -s LocalIP -p tcp -m state --state ESTABLISHED -j ACCEPT iptables的nat的功能 如需要開啟linux上的路由功能做為路由器需要開啟linux的核心轉發功能 [root@ns1 ~]# sysctl -w net.ipv4.ip_forward=1 net.ipv4.ip_forward = 1 [root@ns1 ~]# cat /proc/sys/net/ipv4/ip_forward 1 iptables: nat:網絡地址轉換,網絡層以及傳輸層實現 proxy:代理,應用層實現 nat: SNAT:至修改請求報文的源地址; DNAT:至修改請求報文的目標地址; MASQUERADE:基于撥號的模式進行偽裝 nat表: PREROUTING:DNAT OUTPUT POSTROUTING:SNAT ]# iptables -t nat -A POSTROUTING -s 192.168.56.0/24 ! -d 192.168.56.0/24 -j SNAT --to-source 172.16.0.53 tcp_wrapper:tcp包裝器 對于基于TCP協議開發并且基于TCP協議提供服務應用程序,提供的一層訪問控制工具: 基于庫調用其功能: 庫名稱:libwrap 判斷服務是否能夠由tcp_wrapper進行訪問控制: (1)動態編譯:ldd命令: (2)靜態編譯:strings命令查看應用程序文件,其結果中出現下述文件: hosts.allow hosts.deny 在配置文件在為各服務分別定義訪問控制規則實現訪問控制: /etc/hosts.allow /etc/hosts/deny 配置文件語法: daemon_list:client_list [:options] daemon_list: 應用程序的文件名稱。而非服務名: 應用程序文件名稱列表。彼此間使用逗號分割: 例如:sshd,vsftpd ALL:表示所有服務: client_list: IP地址: 主機名: 網絡地址:必須使用完整格式的掩碼,不使用前綴格式掩碼,所以類似于172.16.0.0/16不合法: 簡短格式的網絡地址:例如:172.16.表示172.16.0.0/255.255.0.0; ALL:所有主機: KNOWN:所有解析的主機 UNKNOWN:所有解析不到的主機 PARANOID:主機名的正反解不匹配 例如:vsftpd服務不允許172.16.100.1訪問: EXCEOT:除了 host.allow vsftpd: [:options] deny: 拒絕,主要用于hosts.allow文件中 allow:允許,用于hosts.deny文件,實現allow的功能 spawn: 啟動額外應用程序: vsftpd: ALL :spawn /bin/echo `date` login attempt from %c to %s, %d >> /var/log/vsftpd.deny.log %c: client ip %s: server ip %d: daemon name
原創文章,作者:wostop,如若轉載,請注明出處:http://www.www58058.com/59226