压在透明的玻璃上c-国产精品国产一级A片精品免费-国产精品视频网-成人黄网站18秘 免费看|www.tcsft.com

防火墻 -- iptables 打補丁layer7---重新編譯內核

  很多人認為iptables就是防火墻,其實這是片面的,Linux的防火墻其實是由netfilter和iptables組成的。

  我會簡單的闡述這兩個組件的含義:

  netfilter也叫內核空間,它其實是內核的一部分,工作在內核空間。那它干嘛的呢,簡單的說,netfilter就是定義那些規則是如何實行的(規則是在內核中實現的)。

  iptables那就叫用戶空間了,netfilter定義好了哪個規則有哪樣的作用,那就交給用戶空間的iptables用來操作了。netfilter只是負責翻譯。

  如此看來,我們能操作的也就是用戶空間iptables了。

  姑且我們講iptables就看做是一個軟件,因為本人是通過RPM安裝的,所以可以通過rpm -ql iptables來查看iptables軟件包安裝所生成的文件都有那些。

  [root@station153 ~]# rpm -ql iptables  查看安裝生成的文件

  /bin/iptables-xml-1.4.7

  /etc/rc.d/init.d/iptables  iptables對應的啟動服務

  /etc/sysconfig/iptables-config 對應的開機要配置參數

  /lib64/libip4tc.so.0-1.4.7  iptables所需的庫文件

  /lib64/xtables

  /lib64/xtables/libipt_CLUSTERIP.so

  /sbin/iptables-1.4.7    iptables的啟動程序

  /sbin/iptables-multi-1.4.7

  /sbin/iptables-restore-1.4.7   iptables的重載規則程序

  /sbin/iptables-save-1.4.7        iptables的保存規則的程序

  /usr/share/doc/iptables-1.4.7    iptables相關文檔

  /usr/share/doc/iptables-1.4.7/COPYING

  /usr/share/doc/iptables-1.4.7/INCOMPATIBILITIES

  /usr/share/doc/iptables-1.4.7/INSTALL

  /usr/share/man/man8/iptables-1.4.7.8.gz   man文檔

  當然并不是生成只有這么多的文件,因為篇幅的原因,我只是復制了各種類型的文件出來已做解釋。

  了解完這些后,就去看看具體怎么使用了,當然軟件都是看其怎么使用的。

  先說說規劃,我先將所以的命令和解釋都寫出來,然后通過舉例子來演示他們的用法,這樣子能夠在全局上有個了解。

  當然,中間還會穿插一些筆者自己不太清楚的東西,這樣能夠為那些在網絡方面基礎也不好的同學來個鞏固。

  防火墻種類:

  主機防火墻     網絡防火墻

  iptables中有四表五鏈:

  四表:filter  nat   mangle raw                    五鏈:INPUT OUTPUT FORWARD PREROUTING POSTROUTING

  表是按照數據包的不同操作區分的,按優先級順序為raw,mangle,nat,filter

  raw :一般是為了不再讓iptables做數據包的鏈接跟蹤處理,提高性能

  mangle:用于對數據包相關字段的修改,如設置TOS、TTL

  nat :只用于NAT轉換時的訪問控制

  filter:默認表,用于一般的過濾

  鏈是按處理過程的hook點進行劃分的,類似時間先后,有以下幾種鏈:

  PREROUTING :路由之前,進入防火墻之后

  INPUT :路由之后目的地為本機

  FORWARDING :路由之后目的地不為本機

  OUTPUT :本機產生,向外轉發

  POSTROUTIONG:發送到網卡接口之前

  filter表中,只有INPUT  OUTPUT FORWARD

  因為其過濾封包或者數據包,只能過濾進入本機或者從本機出去的(人家轉發的數據封包你不能隨便的給人家過濾吧)

  nat表中,只有 PREROUTING POSTROUTING OUTPUT

  iptables <-t 表名> <操作 鏈> <一級參數 [二級參數]> <-j 行為 [參數]>

  Iptables [-t tables] -A/-R/-I chain -i/-o/-s/-d/-p tcp.udp.icmp –dport/–sport PORT -m time/multiport/iprange/state –> ESTABLESHED RELEAVED NEW  -j ACCEPT DROP return REJECT SNAT DNAT

  iptables [-t table] -N chain 創建一條新鏈

  //例如:iptables -N chainA 創建一個名為chainA的新表

  -D chain 刪除一條已有鏈中的規則,可以輸入完整規則,或直接指定規則編號加以刪除(常用)

  iptables -D INPUT –dport 80 -j DROP //刪除INPUT鏈中匹配的規則

  iptables -D INPUT 1 //刪除INPUT鏈第一條規則

  -E old_chain new_chain

  //例如: iptables -E filterA filterB 講filterA改名為filterB

  -R 替換某條規則,規則被替換并不會改變順序,必須要指定替換的規則編號

  //例如:  iptables -R INPUT 1 -s 192.168.1.1 -j ACCEPT  替換INPUT鏈中的第一行規則

  -I 在指定規則編號處插入一條規則,原本該位置上的規則將會往后順序移動,如果沒有指定規則編號,則在第一條規則前插入(常用)

  //例如:  iptables -I INPUT 1 -s 192.168.1.1 -j ACCEPT  在filter表的INPUT鏈中加入這個一條規則

  -F:清空所選的鏈。如果沒有指定鏈,則清空指定表中的所有鏈。如果什么都沒有指定,就清空默認表所有的鏈。

  //例如: iptables -F INPUT //清空filter表中INPUT鏈中的所以規則

  -Z:將指定鏈中的數據包計數器和流量計數器歸零

  //例如: iptables -Z INPUT //清空INPUT鏈中的計數器

  -X:后接名稱,刪除自定義鏈。如果沒有給出參數,這條命令將會刪除默認表所有非內建的鏈。

  -P:設置默認策略

  iptables -P INPUT DROP //設置表filter的INPUT鏈的默認策略為DROP

  一級參數:這一欄可以多個參數并存

  -i:后接網卡名,指定數據表從哪塊網卡輸入,要和INPUT鏈配合,如ppp0、eth0,查詢網卡名:ifconfig

  -o:后接網卡名,指定數據表從哪塊網卡輸出,要和OUTPUT鏈配合同上

  -s:后接源IP或子網,表示數據包的源IP是否相同或在此網段,可加!,表示指定之外的網段

  -d:后接目的IP或子網,表示數據包的目的IP是否相同或者在此網段1

  -p:后接協議名,該協議是封裝在IP中的,常見有TCP、UDP、ICMP,具體請查看/etc/protocols,all代表全部協議

  如果接的是tcp、udp、icmp,他們還有二級參數

  //tcp:根據tcp相關信息進行過濾,詳見iptables -p tcp -h

  –sport:后接源端口號或服務名,具體查看/etc/services,可以接多端口,如1024:65535

  –dport:后接目的端口號服務名,同上

  –tcp-flags:后接A B,A表示標記范圍標記之間用逗號隔開;B表示已設置的標記位,標記有SYN | ACK | FIN | RST | URG | PSH

  –syn:后不接參數,作用同iptables -p tcp –tcp-flags SYN,RST,ACK SYN 過濾由外到內的TCP連接請求

  //udp:根據tcp相關信息進行過濾,詳見iptables -p udp -h

  –sport:后接源端口號或服務名,具體查看/etc/services,可以接多端口,如1024:65535

  –dport:后接目的端口號服務名,同上

  //icmp:根據tcp相關信息進行過濾,詳見iptables -p icmp -h

  –icmp-type:后接icmp報文類型名或對應值

  -m:后接外掛模塊,外掛模塊就是根據其他的維度來對數據進行過濾,常見的有state、mac、limit

  不同的模塊有他們自己的二級參數

  //state:根據狀態匹配機制進行過濾,幾乎適用于所有的協議,包括那些無狀態的協議,如UDP和ICP

  –state:后接狀態類型,狀態類型有INVALID、ESTABLISHED、NEW、RELATED

  //multiport:根據多端口進行過濾,其實這個和–sport上面多端口差不多,同時用以第一個出現起作用,感覺有點雞肋

  –source-port:后接端口號,多個用逗號隔開,如3,34-36

  –destination-port:同上

  –port:后接端口號,適用于源和目的端口號一致的連接

  //limit:根據包的速率進行過濾

  –limit:后接速率,設置最大平均匹配速率,格式如:1/second、12/minute、3/hour 7/day

  –limit-burst:后接數值,設定峰值,超出則拋棄

  //mac:根據mac地址進行過濾

  –mac-source:后接MAC地址XX:XX:XX:XX:XX:XX,只適用于以太口和PREROUTING,FORWARD 和INPUT鏈

  //mark:根據數據包標記進行過濾

  –mark:后接數值或數值和掩碼,如1,2/3,如果有掩碼,則將兩數進行與操作,最大4個字節,即2^32-1,設置詳見MARK動作

  //owner:根據包生成者進行過濾,只適用于OUTPUT鏈,可以是啟動進程的用戶的ID,或用戶所在的組的ID,或進程的ID,或會話的ID

  –uid-owner:后接UID,按生成包的用戶的ID來匹配外出的包

  –gid-owner:后接GID,按生成包的用戶所在組的ID來匹配外出的包

  –pid-owner:后接PID,按生成包的進程的ID來匹配外出的包

  –sid-owner:后接SID,按生成包的會話的ID來匹配外出的包

  //tos:根據IP頭部中TOS字段進行過濾

  –tos:后接16進制數值,詳情使用iptables -m tos -h查詢

  //ttl:根據IP報文中TTL字段進行過濾

  –ttl:后接TTL

  行為:Target和Jump。Target就是下面要講的鏈的操作,JUMP會指定鏈名,然后轉調到該鏈,進行鏈中其他操作,如

  iptables -A INPUT -p tcp -j ABCD //轉跳到自定義的ABCD鏈

  —————–如果在ABCD子鏈中未匹配任何規則,則會轉到父鏈INPUT,繼續INPUT鏈后面的規則匹配———————

  如果在ABCD子鏈中匹配了一條規則,也就說明父鏈INPUT匹配,然后跳到INPUT的下一條鏈。

  Target有如下分類:

  1、ACCEPT:接受數據表

  2、DROP:拒絕數據表

  3、REJECT:作用同DROP,并將錯誤信息返回給信息發送方,只能用在INPUT、FORWARD、OUTPUT和它們的子鏈里

  –reject-with:tcp-reset

  4、TOS:改變IP頭部中的TOS字段,只能在mangle表內使用,它后面要接參數

  –set-tos:后接數值0-255或者0x00-0xFF

  5、TTL:改變IP頭部中的TTL字段,只能在mangle表內使用,他后面要接參數

  –ttl-set:后接數值,作用是設置ttl的值

  –ttl-dec:后接數值,作用是在原TTL基礎上減去這個數值

  –ttl-inc:后接數值,作用是在原TTL基礎上加上這個數值

  6、MARK:給數據包打上標記,用于高級路,其實并不是修改報文,而是在包穿越計算機的過程中由內核分配的和它相關聯的一個字段

  只用于mangle表,它后面要接參數

  –set-mark:后接無符號整數,用于標記

  7、SNAT:改變數據表源地址,只用于nat表的PREROUTING和OUT鏈和它們的子鏈里,它后面要接參數

  –to-source:后接改變后的源地址

  8、DNAT:改變數據包目的地址,只用于nat表的PREROUTING和OUT鏈和它們的子鏈里,它后面要接參數

  –to-destination:后接改變后的目的地址

  9、MASQUERADE:基于端口的NAT,只用于nat表的POSTROUTING鏈和它的子鏈里,它后面可接參數

  –to-ports:后接端口號,如1024-65535

  10、LOG:記錄行為,存在/var/log/messages,它后面可接參數

  –log-level:后接信息級別,級別有debug,info,notice,warning,warn,err,error,crit,alert, emerg,panic

  –log-prefix:后接"STRING",告訴iptables在記錄的信息之前加上指定的前綴

  –log-tcp-sequence:把包的TCP序列號和其他日志信息一起記錄下來

  –log-tcp-options:記錄TCP包頭中的字段大小不變的選項

  –log-ip-options:記錄IP包頭中的字段大小不變的選項

  11、REDIRECT:后接重定向端口,它后面要接參數,只能用在nat表的    PREROUTING、OUTPUT鏈和被它們調用的自定義鏈里

  –to-ports:后接端口號

  12、RETURN:返回上一級鏈,子鏈 -> 父鏈 -> 默認策略

  13、NOTRACK:跳過追蹤,只用于raw表,當行為為NOTRACK,則跳過后面所有的鏈

  iptables-save > /path/to/somefile  將內存中生效的規則保存到一個文件中

  iptables-restore > /path/to/somefile  恢復由iptables-save保存文件中的規則到內存

  //拒絕192.168.1.0/24端口1024到65535程序從eth0網卡訪問本機SSH服務

  iptables -A INPUT -i eth0 -p tcp -s 192.168.1.0/24 –sport 1024:65534 –dport ssh -j DROP

  //SNAT示例:從eth0口出去的包將數據包的源地址改成192.168.1.10到192.168.1.20這個范圍

  iptables -t nat -A POSTROUTING -o eth0 -j SNAT –to-source 192.168.1.10-192.168.1.20

  //DNAT示例:外網訪問80端口都轉到192.168.100.10這臺主機上

  iptables -t nat -A PREROUTING -i eth0 -p tcp –dport 80 -j DNAT –to-destination 192.168.100.10:80

  //MASQUERADE示例:將192.168.1.0/24內的主機進行基于端口的NAT轉換

  iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE

  //重定向端口,僅適用于nat:PREROUTING和OUTPUT鏈上

  iptables -t nat -A PREROUTING -p tcp –dport 80 -j REDIRECT –to-ports 8080

  相關注意事項:

  iptables -t nat -A POSTROUTING -o ppp0 -s 192.168.0.0/24 -j MASQUERADE

  MASQUERADE和SNAT作用一樣哈~同樣是提供源地址轉換的操作,但是MASQUERADE是針對外部接口為動態IP地址來設置滴,不需要使用–to-source指定轉換的IP地址。如果網絡采用的是撥號方式接入互聯網,而沒有對外的靜態IP地址(主要用在動態獲取IP地址的連接,比如ADSL撥號、DHCP連接等等),那么建議使用MASQUERADE哈~

  注意:MASQUERADE是特殊的過濾規則,其只可以映射從一個接口到另一個接口的數據哈

  做了NAT之后要是拒絕誰訪問的話,就要用到過濾filter上的forward了,不給被拒絕的IP做轉發。

  端口映射:

  Iptables -t nat -A PREROUTING -d 172.16.251.153 -p tcp –dport 22022 -j DNAT –to-destination 192.168.100.2:22

  如果你去連接172.16.251.153的22022端口,就會被轉換成為192.168.100.2的22號端口

  iptables實現七層訪問過濾:

  對內核中的netfilter,打補丁layer7,重新編譯內核

  獲取內核源碼 https://www.kernel.org

  內核編譯安裝是基于 mockbuild 這個用戶的,所以要先創建這個賬戶:

  編譯內核:

  [root@station153 ~]# useradd mockbuild

  [root@station153 ~]# rpm -ivh kernel-2.6.32-431.5.1.el6.src.rpm

  warning: kernel-2.6.32-431.5.1.el6.src.rpm: Header V3 RSA/SHA256 Signature, key ID fd431d51: NOKEY

  1:kernel                 ########################################### [100%]

  [root@station153 ~]# cd rpmbuild/SOURCES/

  [root@station153 SOURCES]# ls

  check-kabi                config-powerpc64             config-x86_64-debug               Makefile.common

  config-debug              config-powerpc64-debug       config-x86_64-debug-rhel          Makefile.config

  config-debug-rhel         config-powerpc64-debug-rhel  config-x86_64-generic             merge.pl

  config-framepointer       config-powerpc64-kdump       config-x86_64-generic-rhel        Module.kabi_greylist_i686

  config-generic            config-powerpc64-kdump-rhel  config-x86_64-nodebug             Module.kabi_greylist_ppc64

  config-generic-rhel       config-powerpc64-rhel        config-x86_64-nodebug-rhel        Module.kabi_greylist_s390x

  config-i686               config-powerpc-generic       config-x86-generic                Module.kabi_greylist_x86_64

  config-i686-debug         config-powerpc-generic-rhel  config-x86-generic-rhel           Module.kabi_i686

  config-i686-debug-rhel    config-s390x                 extrakeys.pub                     Module.kabi_ppc64

  config-i686-nodebug       config-s390x-debug           find-provides                     Module.kabi_s390x

  config-i686-nodebug-rhel  config-s390x-debug-rhel      genkey                            Module.kabi_x86_64

  config-i686-rhel          config-s390x-generic-rhel    kabitool                          perf

  config-ia64-generic-rhel  config-s390x-kdump           kernel-abi-whitelists.tar.bz2     perf-archive

  config-nodebug            config-s390x-kdump-rhel      linux-2.6.32-431.5.1.el6.tar.bz2

  config-nodebug-rhel       config-s390x-rhel            linux-kernel-test.patch

  [root@station153 SOURCES]# tar xf kernel-abi-whitelists.tar.bz2 -C /usr/src/

  [root@station153 usr]# cd src/

  [root@station153 src]# ls

  debug  kabi-rhel60  kabi-rhel61  kabi-rhel62  kabi-rhel63  kabi-rhel64  kabi-rhel65  kernels

  [root@station153 src]# cd kernels/

  [root@station153 kernels]# ls

  2.6.32-431.el6.x86_64

  [root@station153 kernels]# ln -sv 2.6.32-431.el6.x86_64 linux

  `linux' -> `2.6.32-431.el6.x86_64'

  [root@station153 kernels]# cd linux/

  [root@station153 linux]# ls

  arch   crypto   firmware  include  ipc     lib       Makefile.common  Module.symvers  samples  security  System.map  usr

  block  drivers  fs        init     kernel  Makefile  mm               net             scripts  sound     tools       virt

  [root@station153 linux]# cp /boot/config-2.6.32-431.el6.x86_64 .config

  [root@station153 linux]# cd ~

  [root@station153 ~]# ls

  anaconda-ks.cfg      bind-9.9.5.tar.gz       kernel-2.6.32-431.5.1.el6.src.rpm  Python-3.4.0         rpmbuild

  bind10-1.1.0         Discuz_X2.5_SC_GBK.zip  netfilter-layer7-v2.23.tar.bz2     Python-3.4.0.tar.xz

  bind10-1.1.0.tar.gz  install.log             phpwind_UTF8_8.5                   readme

  bind-9.9.5           install.log.syslog      phpwind_UTF8_8.5.zip               Readme–?+?.htm

  [root@station153 ~]# tar xf netfilter-layer7-v2.23.tar.bz2

  [root@station153 ~]# ls

  anaconda-ks.cfg      bind-9.9.5.tar.gz       kernel-2.6.32-431.5.1.el6.src.rpm  phpwind_UTF8_8.5.zip  Readme–?+?.htm

  bind10-1.1.0         Discuz_X2.5_SC_GBK.zip  netfilter-layer7-v2.23             Python-3.4.0          rpmbuild

  bind10-1.1.0.tar.gz  install.log             netfilter-layer7-v2.23.tar.bz2     Python-3.4.0.tar.xz

  bind-9.9.5           install.log.syslog      phpwind_UTF8_8.5                   readme

  [root@station153 ~]# cd netfilter-layer7-v2.23

  [root@station153 netfilter-layer7-v2.23]# ls

  CHANGELOG  iptables-1.4.3forward-for-kernel-2.6.20forward  kernel-2.6.32-layer7-2.23.patch  README

  下來要給內核打補丁,讓內核支持 netfilter-layer7,一會直接編譯進內核

  1

  [root@station153 linux]# patch -p1 < /root/netfilter-layer7-v2.23/kernel-2.6.32-layer7-2.23.patch

  wKiom1M2rADTpfQYAAMO2jlNe1U103.jpg

  2、給內核打補丁

  # tar xf netfilter-layer7-v2.23.tar.bz2

  # cd /usr/src/linux

  # patch -p1 < /root/netfilter-layer7-v2.23/kernel-2.6.32-layer7-2.23.patch

  # cp /boot/config-*  .config

  # make menuconfig

  3、編譯并安裝內核

  # make

  # make modules_install

  # make install

  4、重啟系統,啟用新內核

  5、編譯iptables

  # tar xf iptables-1.4.20.tar.gz

  # cp /root/netfilter-layer7-v2.23/iptables-1.4.3forward-for-kernel-2.6.20forward/* /root/iptables-1.4.20/extensions/

  # cp /etc/rc.d/init.d/iptales /root

  # cp /etc/sysconfig/iptables-config /root

  # rpm -e iptables iptables-ipv6 –nodeps

  # ./configure  –prefix=/usr  –with-ksource=/usr/src/linux

  # make && make install

  # cp /root/iptables /etc/rc.d/init.d

  # cp /root/iptables-config /etc/sysconfig

  6、為layer7模塊提供其所識別的協議的特征碼

  # tar zxvf l7-protocols-2009-05-28.tar.gz

  # cd l7-protocols-2009-05-28

  # make install

  7、如何使用layer7模塊

  ACCT的功能已經可以在內核參數中按需啟用或禁用。此參數需要裝載nf_conntrack模塊后方能生效。

  net.netfilter.nf_conntrack_acct = 1

  l7-filter uses the standard iptables extension syntax

  # iptables [specify table & chain] -m layer7 –l7proto [protocol name] -j [action]

  # iptables -A FORWARD -i eth1 -m layer7 –l7proto qq -j REJECT

  注意:

  網絡防火墻:ip_forward

  net.netfilter.nf_conntrack_acct參數只有裝載nf_conntrack模塊后方能生效

上一篇:安卓防火墻 PS DroidWall

下一篇:wireshark 安裝與使用(持續更新)