Linux:網絡防火牆
netfilter: Frame
iptables: 數據報文過濾,NAT、mangle等規則生成的工具
TCP鏈接的三次握手:
Client --1--> Server : SYN=1,ACK=0,FIN=0,RST=0; Client 狀態:Closed-->SYN_SENT;
Client <--2-- Server : SYN=1.ACK=1,FIN=0,RST=0; Server 狀態:Listen-->SYN_RCVD
Client --3--> Server : SYN=0,ACK=1,FIN=0,RST=0; Server 收到Client的ACK以後,二者轉換爲ESTABLISHED
TCP斷開鏈接
防火牆: 硬件,軟件:規則(匹配標準,處理辦法)
Framework:
默認規則:
開放:堵
關閉:通
規則:匹配標準
IP: 源IP,目標IP
TCP: 源端口,目標端口
UDP: 源端口,目標端口
ICMP: icmp-type
linux不一樣內核的不一樣防火牆以及工具:
Linux 2.0
ipfw/firewall
Linux 2.2
ipchain/firewall
Linux 2.4-2.6
iptables/netfilter
hook function: 鉤子函數
prerouting
input
output
forward
postrouting
規則鏈(CHAIN):
PERROUTING
INPUT
OUTPUT
FORWARD
POSTROUTING
iptables表:
filter(過濾):
INPUT
OUTPUT
FORWARD
NAT(地址轉換):
PREDOUTING
OUTPUT
POSTROUTING
mangle(拆開、修改、封裝):
PREROUTING
INPUT
FORWARD
OUTPUT
POSTROUTING
raw(原始格式):
PREROUTING
OUTPUT
表在規則鏈上的優先級:
PREROUTING: raw-->mangle-->nat
INPUT : mangle-->filter
FORWARD : mangle-->filter
OUTPUT : raw-->mangle-->nat-->filter
POSTROUTING: mangle-->nat
可使用自動義鏈,但只有在被調用時才能發揮做用,並且若是沒有自定義鏈中的任何規則匹配,還應該有返回機制;
用戶能夠刪除自定義的空鏈
默認鏈不能被刪除
每一條規則都有兩個內置的計數器
一、被匹配的報文個數
二、被匹配的報文大小之和
規則:匹配標準, 處理動做
iptables [-t TABLE_NAME] COMMAND CHAIN [num] 匹配標準 -j 處理方法
保存iptables寫入的規則
# service iptables save
/etc/sysconfig/iptables
此命令保存的配置文件,在下次啓動iptables時會自動讀取此配置文件
# iptables-save > /etc/sysconfig/iptables.20160216
此種方式保存的配置文件,在下次啓動iptables時須要使用下面的指令加載配置
# iptables-restore < /etc/sysconfig/iptables.20160216
COMMAND:
管理規則:
-A: 在鏈的尾部添加一條規則
-I CHAIN [num]: 在鏈中插入一條規則,若是省略 num ,則插入爲第一條
-D CHAIN [num]: 刪除鏈中的第num條規則
-R CHAIN [num]: 替換指定的規則:
管理鏈:
-F [CHAIN]: flush,清空指定鏈中的規則,若是省略 CHAIN ,則能夠實現刪除對應表中全部鏈中的規則
-P CHAIN target: 設定指定鏈的默認策略
-N CHAIN: 自定義一個新的空鏈
-X [CHAIN]: 刪除一個自定義的空鏈
-Z [CHAIN [num]]: 將指定鏈中的規則的計數器置爲0
-E old-chain new-chain: 重命名自定義的鏈
查看:
-L: 顯示指定表中的規則
-n: 以數字格式顯示主機地址和端口號
-v: 顯示鏈及規則的詳細信息
-vv:
-x: 顯示計數器的精確值
--line-numbers: 顯示鏈中規則的號碼
-j target
動做(target):
ACCEPT :放行
DROP :丟棄
REJECT :拒絕
DNAT :目標地址轉換
SNAT :源地址轉換
REDIRECT :端口重定向
MASQUERADE :地址假裝
LOG : 日誌
MARK : 打標記
匹配標準:
通用匹配
-s,--src : 指定源地址
-d,--dst : 指定目標地址
-p {tcp|udp|icmp} : 指定協議
-i INTERFACE: 指定數據報文流入接口
可用於定義標準的鏈: PREROUTING,INPUT,FORWARD
-o INTERFACE: 指定數據報文流出接口
可用於定義標準的鏈: OUTPUT,POSTROUTING,FORWARD
擴展匹配:
隱含擴展: 不要特別指明由哪一個模塊進行的擴展,由於此時使用 -p {tcp|udp|icmp}
-p tcp
--sport PORT[-PORT]: 源端口
--dport PORT[-PORT]: 目標端口
--tcp-flags mask comp:只檢查mask指明的標誌位,使用逗號分隔的標誌位列表;comp中指明的標誌爲必須爲1
--tcp-flags SYN,FIN,ACK,RST SYN :表示檢查四個標誌位,其中SYN爲1,其餘標誌位爲0,其至關於 --syn
--syn :TCP三次握手的第一個數據報文
容許192.168.21.64/26訪問21.117的80端口(http服務)
# iptables -t filter -A INPUT -s 192.168.21.64/26 -d 192.168.21.117 -p tcp --dport 80 -j ACCEPT
# iptables -A OUTPUT -s 192.168.21.117 -d 192.168.21.64/26 -p tcp --sport 80 -j ACCEPT
-p icmp
--icmp-type
0: echo-reply
8: echo-request
容許本機21.117 ping全部主機,但不容許其餘主機ping本機
# iptables -A OUTPUT -s 192.168.21.117 -p icmp --icmp-type 8 -j ACCEPT
# iptables -A INPUT -d 192.168.21.117 -p icmp --icmp-type 0 -j ACCEPT
-p udp
--sport PORT[-PORT]: 源端口
--dport PORT[-PORT]: 目標端口
顯式擴展: 必須指明由哪一個模塊進行的擴展,在iptables中使用 -m 選項完成此功能
-m EXTESTION --spe-opt
state: 狀態擴展
--state
NEW : 新請求
ESTABLISHED: 已創建的鏈接
INVALID: 非法鏈接
RELATED: 相關聯的
# iptables -I INPUT -d 192.168.21.117 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
multiport: 離散多端口匹配
--sports,--source-ports PORT[,PORT|PORT:PORT...]
--dports,--destination-ports
--ports
# iptables -I INPUT 2 -d 192.168.21.117 -p tcp -m multiport --dports 22,80 -m state --state NEW -j ACCEPT
NAT:
DNAT:
-j DNAT
--to-destination IPaddr[:PORT]
# iptables -t nat -A PREROUTING -d 105.236.8.106 -p tcp --dport 80 -j DNAT --to-destination 192.168.17.212
SNAT:源地址轉換(POSTROUTING,OUTPUT)
-j SNAT
--to-source IPaddr[-IPaddr[:PORT]] :指定NAT轉換的地址
-j MASQUERADE: 例如使用ADSL撥號上網的時候使用,它會自動選擇可以上網的地址進行NAT的轉換
SNAT簡易實驗,三臺linux虛擬機
虛擬機1:主機名 httpd ip=192.168.21.117 gw=192.168.21.120
虛擬機2:主機名 test_hostonly ip=172.16.10.123 gw=172.16.10.101
虛擬機3: 主機名 lvs1 eth0=192.168.21.120 eth1=172.16.10.101
打開網關主機LVS1的網卡間轉發功能
[root@lvs1 ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
[root@lvs1 ~]# cat /proc/sys/net/ipv4/ip_forward
1
在虛擬主機1上抓包
[root@httpd ~]# tcpdump -i eth0 -nn -X icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
此時在虛擬主機2上ping 虛擬機1
[root@test_hostonly ~]# ping 192.168.21.117
PING 192.168.21.117 (192.168.21.117) 56(84) bytes of data.
64 bytes from 192.168.21.117: icmp_seq=1 ttl=63 time=0.393 ms
查看當前虛擬機1抓取到的icmp包:
13:55:35.411979 IP 172.16.10.123 > 192.168.21.117: ICMP echo request, id 54795, seq 3, length 64
13:55:35.412037 IP 192.168.21.117 > 172.16.10.123: ICMP echo reply, id 54795, seq 3, length 64
此時的ping的源地址是虛擬機2的IP地址
接下來在虛擬機3上添加SNAT的規則
[root@lvs1 ~]# iptables -t nat -A POSTROUTING -s 172.16.10.0/24 -j SNAT --to-source 192.168.21.120
[root@lvs1 ~]# iptables -t nat -L -n
Chain POSTROUTING (policy ACCEPT)
target prot opt source
SNAT all -- 172.16.10.0/24 0.0.0.0/0 to:192.168.21.120
再次在虛擬機2上ping 虛擬機1
[root@test_hostonly ~]# ping 192.168.21.117
PING 192.168.21.117 (192.168.21.117) 56(84) bytes of data.
64 bytes from 192.168.21.117: icmp_seq=1 ttl=63 time=2.19 ms
64 bytes from 192.168.21.117: icmp_seq=2 ttl=63 time=0.375 ms
而後再查看虛擬機1上的抓包狀況,這個時候的ping源地址變成了192.168.21.120,和預期結果相同
14:07:17.711563 IP 192.168.21.120 > 192.168.21.117: ICMP echo request, id 12814, seq 1, length 64
14:07:17.711605 IP 192.168.21.117 > 192.168.21.120: ICMP echo reply, id 12814, seq 1, length 64
這樣一個簡單的SNAT轉換配置就完成了
此時想禁止虛擬主機2 ping 虛擬機1,則在虛擬機3 上添加FORWARD規則:
[root@lvs1 ~]# iptables -t filter -A FORWARD -s 172.16.10.0/24 -p icmp -j REJECT
[root@lvs1 ~]# iptables -L -n
Chain FORWARD (policy ACCEPT)
target prot opt source destination
REJECT icmp -- 172.16.10.0/24 0.0.0.0/0 reject-with icmp-port-unreachable
linux