防火墻
為了避免用戶獲取了非授權訪問:引入了防火墻機制:將所有的端口堵上;僅開放有限個端口;防火墻是在內核中實現的,因為識別報文的IP和PORT是在TCP/IP協議棧中;
防火墻的分類:
主機防火墻:對單臺主機保護
網絡防火墻:保護對網絡的訪問
防火墻的類型:
軟件防火墻:通用的CPU,軟件級別實現;
硬件防火墻:特定的CPU,在CPU級別實現對報文的拆封和檢查;
防火墻在Linux內核中是在報文必經之處有五個勾子函數,統一叫做netfilter。僅需要向這個框架上填充相關的規則就能對來往的報文檢查其是否符合。我們是不可能直接操作內核的,所以只能通過用戶空間用應用程序,向其傳遞相關的選項及參數,它就能向內核的框架上填充規則;這個就是Iptables命令;
注意:適用于Linux
iptables命令:
1.0:ipfw
2.0: ipchains
3.0: iptables
4.0:nftables
iptables命令實現的功能不僅僅是防火的功能:
filter: 最基本的功能
nat: 網絡地址轉換,是IPv4緊缺的最好的解決方案;
manle: 拆封報文;修改報文;
raw:關閉nat的連接追蹤功能;
這幾個功能即對應了Iptables命令稱為的四表;其優先級,依次遞增;
內核中的五個勾子函數:
prerouting:路由前
input:進入用戶空間
forward:轉發
output:從用戶空間出來
postrouting:路由后
這幾個函數在iptable命令中用函數對應的大寫字母表示其鏈;即五鏈
路由:決定報文的流向;如果報文的目標IP是本機,即流向INPUT。如果目標IP非本機,就丟棄;但在本機開啟了轉發功能后,就流向FORWARD鏈;
在主機中報文的流向:
流入主機,到用戶空間:PREROUTING –> INPUT
流出主機:OUPUT –> POSTROUTING
流經主機,到別的主機:PREROUTING –> FORWRAD –> POSTROUTING
iptables實現不同的功能,調用不同的鏈:
查看鏈的方法:iptables -t 表名 -L -n
記憶方法:
OUTPUT支持所有的表;
filter: INPUT, OUTPUT, FORWARD
nat: 除了FORWARD的所有鏈
mangle: 五個鏈:
raw:命令獲?。?/p>
報文路由流經主機經由的路徑;
使用防火墻即使用iptable命令在不同的鏈上添加規則;規則匹配時,做出相對的處理,此處理的過程被稱為“處理動作”;基于什么匹配叫“匹配條件”;
寫規則要領:
1)實現什么功能,即選擇表;
2)報文的流向:我提供服務,就先寫入站的規則后寫出站的規則;我作為客戶端,就先寫出站的規則后寫入站的規則;
iptables命令大概可以抽出一個公式:
iptables -t table COMMAND chain [規則號number] 匹配條件 -j 處理動作
table: raw, mangle, nat, [filter]
省略表時,表示iptables的基本規則:filter。 例如:iptables COMMAND
COMMAND: 增、刪、查、改
增:
-A: Append
-A chain
-I: Insert
-I chain
-N: 定義鏈
刪:
-D:刪除指定鏈上的指定規則
-X: 刪除鏈本身:自定義的空的未引用的鏈才允許刪除
-F:清空所有鏈上的所有規則
-Z:置零鏈上的數據包;三者都支持
查:
-L sub_command
子命令:-v -n -x –line-number
改:
-R replace
例如:
操作filter表的”所有鏈所有規則”:-vnxL –line-number
操作filter表的”指定鏈所有規則”:-vnxL –line-number INPUT
操作filter表的”指定鏈指定規則”:-vnxL –line-number INPUT 2
匹配條件:rpm -ql iptables 小寫模塊為匹配條件
基本匹配: 內建功能
[!] -s address[/mask][,…]: 源ip,省略表示所有地址; !表示取反
[!] -d address[/mask][,…]: 目標ip,省略表示所有地址;
[!] -i IFACE: 報文從哪個網卡流入;
[!] -o IFACE: 報文從哪個網卡流出;
擴展匹配:必須加載模塊
顯式擴展:不用顯式指定模塊,只要使用-p開頭, 就能自動調用對應的模塊;
省略-p表示所有協議所有端口;
-p {tcp|udp|icmp} 表示匹配指定協議的所有端口;
-p tcp
[!] {–sport|–dport} port[:port] 匹配tcp協議的指定端口(port)或端口連續的范圍(port:port)
[!] [–syn] 匹配syn為1,其它為0的報文;表示僅匹配TCP3次握手的第一次,即建立請求;
-p udp [!] {–sport|–dport} port[:port] 匹配udp協議的指定端口(port)或端口連續的范圍(port:port)
-p icmp [!] –icmp-type major[.minor]
major:
8: echo request, 請求;
0: echo reply, 響應;
例如:本地網絡允許訪問本機的網絡 的 22端口:
功能:filter
流向:自己是服務器:INPUT –> OUTPUT
1、關閉防火墻
# systemctl stop firewalld.service
# systemctl mask firewalld.service
2、查看規則并清空規則
# iptables -vnxL –line-number
# iptables -F
3、配置22端口:
~]# iptables -A INPUT -d 172.16.0.67 -s 172.16.0.0/16 -p tcp –dport 22 -j ACCEPT
~]# iptables -A OUTPUT -s 172.16.0.67 -d 172.16.0.0/16 -p tcp –sport 22 -j ACCEPT
4、注意查看是否22號端口是否有數據報文流過:!~?。。?br />~]# iptables -vnxL –line-number
5、默認策略REJECT
對地址限制:
~]# iptables -A INPUT -d 172.16.0.67 -j REJECT
~]# iptables -A OUTPUT -s 172.16.0.67 -j REJECT
對網卡限制:
~]# ip addr list
~]# iptables -A INPUT -i eno16777736 -j REJECT
~]# iptables -A OUTPUT -o eno16777736 -j REJECT
例如:放行本機的138,137的udp端口;
功能:filter
流向:自己是服務器:INPUT –> OUTPUT
~]# iptables -I INPUT 2 -d 172.16.0.67 -p tcp –dport 137:138 -j ACCEPT
~]# iptables -I OUTPUT 2 -s 172.16.0.67 -p tcp –sport 137:138 -j ACCEPT
例如:只能ping別人,不能被ping?
功能:filter
流向:OUTPUT(8) –> INPUT(0)
~]# iptables -I OUTPUT 2 -s 172.16.0.67 -p icmp –icmp-type 8 -j ACCEPT
~]# iptables -I INPUT 2 -d 172.16.0.67 -p icmp –icmp-type 0 -j ACCEPT
隱式擴展:必須加載模塊:-m MODULE_NAME OPTIONS
multiport [!] {–sports|–dports} port[,port|,port:port]… 多個端口以逗號分隔表示離散的端口,以冒號分隔表示連續;
例如:放行本機的22,80,139,445端口給本地網絡訪問:
功能:filter
流向:自己是服務器:INPUT –> OUTPUT
~]# iptables -R INPUT 1 -d 172.16.0.67 -p tcp -m multiport –dports 22,80,139,445 -j ACCEPT
~]# iptables -R OUTPUT 1 -s 172.16.0.67 -p tcp -m multiport –sports 22,80,139,445 -j ACCEPT
iprange [!] {–src-range|–dst-range} from ipaddress-ipaddress: 匹配地址范圍;
例如:開放telnet服務給172.16.0.60-172.16.0.70主機訪問?
功能:filter
流向:自己是服務器:INPUT –> OUTPUT
~]# iptables -I INPUT 3 -d 172.16.0.67 -p tcp –dport 23 -m iprange –src-range 172.16.0.60-172.16.0.70 -j ACCEPT
~]# iptables -I OUTPUT 3 -s 172.16.0.67 -p tcp –sport 23 -m iprange –dst-range 172.16.0.60-172.16.0.70 -j ACCEPT
time –timestart hh:mm[:ss] –timestop hh:mm[:ss] [–kerneltz] :匹配時間,centos 7必須加上后者;
[!] {–weekdays|–monthdays} day[,day…] 匹配周幾或幾日;不能同時使用!
–datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]] 匹配哪年哪月哪日起始,一般不用
–datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]] 匹配哪年哪月哪日結束,一般不用
注意:省略以上三者表示每天的幾點到幾點;
–kerneltz:使用內核配置的時區而非默認的UTC;
例如:開放telnet服務給172.16.0.60-172.16.0.70主機訪問,且僅允許在工作日的9:00-17:00之間被訪問?
功能:filter
流向:自己是服務器:INPUT –> OUTPUT
~]# iptables -R INPUT 3 -d 172.16.0.67 -p tcp –dport 23 -m iprange –src-range 172.16.0.60-172.16.0.70 -m time –weekdays 1,2,3,4,5 –timestart 9:00:00 –timestop 17:00:00 –kerneltz -j ACCEPT
~]# iptables -R OUTPUT 3 -s 172.16.0.67 -p tcp –sport 23 -m iprange –dst-range 172.16.0.60-172.16.0.70 -m time –weekdays 1,2,3,4,5 –timestart 9:00:00 –timestop 17:00:00 –kerneltz -j ACCEPT
string –algo {bm|kmp} [!] –string pattern 基于模式匹配字串;僅對明文協議生效。對ssh, https無效,對http, telnet有效;
例如:不允許響應傳輸hi字串;
功能:filter
流向:響應:OUTPUT
~]# iptables -I OUTPUT -s 172.16.0.67 -m string –algo kmp –string “hi” -j REJECT
上傳:請求:INPUT
~]# iptables -I INPUT -d 172.16.0.67 -m string –algo kmp –string “hi” -j REJECT
connlimit –connlimit-{upto|above} n 單個IP的并發數限制;例如:172.16.0.67一次只能啟動2個mysql客戶端或2個ssh客戶端;
upto表示<=;
above表示>
注意:具體如何使用,根據使用場景決定:例如:默認拒絕:<=允許;默認允許:>拒絕;
例如:允許ssh單個IP并發2個;
功能:filter
流向:自己是服務器:INPUT –> OUTPUT
~]# iptables -I INPUT 1 -d 172.16.0.67 -p tcp –dport 22 -m connlimit –connlimit-above 2 -j REJECT
注意:上面已經開啟了22號端口,所以用黑名單
limit –limit rate[/second|/minute|/hour|/day] –limit-burst number 對速率限制;
#/second 每秒多少個請求數量;
注意速率限制僅限制單個方向即可;
例如:
1)對Httpd服務限制每秒接收200個請求;
功能:filter
流向:自己是服務器:INPUT –> OUTPUT
即限制入站速率;
~]# iptables -I INPUT -d 172.16.0.67 -p tcp –dport 80 -m limit –limit 200/second –limit-burst 200 -j ACCEPT
2)ping響應默認是每秒1個,限制3秒才一個;即1分鐘20個;
注意:只能對別人響應的ping和別人請求的ping做限制;即在INPUT上
~]# iptables -R INPUT 5 -d 172.16.0.67 -p icmp –icmp-type 0 -m limit –limit 20/minute –limit-burst 5 -j ACCEPT
state –state {NEW|ESTABLISHED|RELATED} 表示根據連接追蹤表記錄情況對來往的報文做檢查;
NEW: 表中沒有記錄,只有第一次請求才是此狀態;
ESTABLISHED: 表中有記錄,說明第一次檢查通過;請求和響應都可以有此狀態
RELATED:表中有相關連的連接:例如:第一次檢查請求我們的21號通過,第二次檢查請求一個大于1024的端口還是原IP,則放行!
連接追蹤表:記錄于內存中,內存滿了,客戶端不能請求。對于并發訪問量大的服務器,連接追蹤表的數量應該調大,且內存要加大!
位置:/proc/net/nf_conntrack
限制記錄條目數量:/proc/sys/net/nf_conntrack_max
連接的超時時長:/proc/sys/net/netfilter/*timeout*
使用狀態規則思路:
第一次請求為NEW,第二次請求為ESTABLISHED
響應都是為ESTABLISHED;
所以在寫狀態規則前:iptables -I chain -m state –state ESTABLISHED -j ACCEPT 表示請求和響應都放行ESTABLISHED。
作為服務器提供服務:NEW請求在INPUT
作為客戶端去請求服務:NEW請求在OUTPUT
使用被動連接的思路:
提供21服務者:第一次是開放21,第二次是開放一個隨機端口。RELATED
請求21服務者:第一次是開放隨機,第一次是開放隨機:所以直接將:iptables -I chain -m state –sate NEW -j ACCEPT
使用狀態追蹤機制:
不能限速
例如:放行80,22,23,139,445,3306
功能:filter
狀態:作為服務器提供服務:NEW請求在INPUT
# iptables -F
非第一次請求:# iptables -A INPUT -m state –state ESTABLISHED -j ACCEPT
第一次請求: # iptables -A INPUT -d 172.16.0.67 -p tcp -m multiport –dports 22,80,23,139,445,3306 -m state –state NEW -j ACCEPT
所有響應: # iptables -A OUTPUT -m state –state ESTABLISHED -j ACCEPT
默認策略:
基于地址
~]# iptables -A INPUT -d 172.16.0.67 -j REJECT
~]# iptables -A OUTPUT -s 172.16.0.67 -j REJECT
基于接口
~]# iptables -A INPUT -i eno16777736 -j REJECT
~]# iptables -A OUTPUT -o eno16777736 -j REJECT
例如:開放udp 137,138 NEW狀態
功能:filter
狀態:作為服務器提供服務:NEW請求在INPUT
~]# iptables -I INPUT 2 -d 172.16.0.67 -p udp –dport 137:138 -m state –state NEW -j ACCEPT
例如:開放同步時間,123,323端口的udp協議;
功能:filter
狀態:作為客戶端去請求服務:NEW請求在OUTPUT
~]# iptables -I OUTPUT 2 -s 172.16.0.67 -p udp -m multiport –dports 123,323 -m state –state NEW -j ACCEPT
例如:開放vsftpd服務:
功能:filter
狀態:作為服務器提供服務:NEW請求在INPUT;且第一次是開放21,第二次是開放一個隨機端口。RELATED
~]# iptables -R INPUT 3 -d 172.16.0.67 -p tcp -m multiport –dports 21:23,80,139,445,3306 -m state –state NEW -j ACCEPT
注意:其它主機不能訪問ftp;
~]# modprobe nf_conntrack_ftp
~]# iptables -I INPUT 4 -d 172.16.0.67 -m state –state RELATED -j ACCEPT
處理動作: rpm -ql iptables 大寫模塊為處理條件
基本動作: 內建功能
ACCEPT:接受
DROP: 丟棄
擴展動作:必須加載模塊
REJECT:不接受,還響應他被拒絕;
LOG [–log-level #] [–log-prefix “STRING”] : 默認記錄日志于/var/log/message中;
例如:記錄telnet服務每次NEW請求于日志中。
~]# iptables -vnL –line-number
3 3 180 ACCEPT tcp — * * 0.0.0.0/0 172.16.0.67 multiport dports 21:23,80,139,445,3306 state NEW
注意23號規則在3號。所以要在其之前添加規則:
~]# iptables -I INPUT 3 -d 172.16.0.67 -p tcp –dport 23 -m state –state NEW -j LOG –log-prefix “access telnet: ”
測試訪問:
~]# grep “access telnet: ” /var/log/messages
Dec 10 13:09:17 localhost kernel: access telnet: IN=eno16777736 OUT= MAC=00:0c:29:4f:51:e0:00:26:9e:af:36:6e:08:00 SRC=172.16.0.179 DST=172.16.0.67 LEN=52 TOS=0x00 PREC=0x00 TTL=128 ID=16392 DF PROTO=TCP SPT=55023 DPT=23 WINDOW=8192 RES=0x00 SYN URGP=0
自定義鏈的名字。表示調用此鏈,此鏈的reference+1,即引用數量加1;
例如:僅允許ping所有人:
作為客戶端:OUTPUT
請求:icmp 8
~]# iptables -N out_ping_rules
~]# iptables -A out_ping_rules -s 172.16.0.67 -p icmp –icmp-type 8 -m state –state NEW -j ACCEPT
~]# iptables -I OUTPUT 3 -s 172.16.0.67 -j out_ping_rules
添加被ping
~]# iptables -N in_ping_rules
~]# iptables -I in_ping_rules -d 172.16.0.67 -p icmp –icmp-type 8 -m state –state NEW -j ACCEPT
~]# iptables -I INPUT 5 -d 172.16.0.67 -p icmp -j in_ping_rules
RETURN:返回調用者;
例如:允許ping所有,但不允許ping172.16.0.68;
~]# iptables -I out_ping_rules -s 172.16.0.67 -d 172.16.0.68 -p icmp -j RETURN
iptables命令做的操作都在內存中完成,重啟服務則會生效,要想永久有效則保存在持久存儲的文件中:
保存:iptables-save > /PATH/TO/SOME_RULE_FILE
重載:iptabls-restore < /PATH/FROM/SOME_RULE_FILE
CentOS 6:
保存規則:
service iptables save
保存規則于/etc/sysconfig/iptables文件,覆蓋保存;
重載規則:
service iptables restart
默認重載/etc/sysconfig/iptables文件中的規則
配置文件:/etc/sysconfig/iptables-config
例如:將以上所有的規則保存于文件:
~]# iptables-save > /etc/sysconfig/iptables-20171210-v1
~]# iptables-restore < /etc/sysconfig/iptables-20171210-v1
CentOS 7:
(1) 自定義Unit File,進行iptables-restore;
ftp被動連接時,將模塊定義在IPTABLES_MODULES=””中 /etc/sysconfig/iptables-config
~]# vim /etc/systemd/system/iptables.service
[Unit]
Description=Iptables Service
Before=network.target
Before=libvirtd.service
Before=NetworkManager.service
[Service]
Type=simple
EnvironmentFile=/etc/sysconfig/iptables-config
ExecStartPre=/bin/bash -c “exec /usr/sbin/modprobe $IPTABLES_MODULES”
ExecStart=/bin/bash -c “exec /usr/sbin/iptables-restore < /etc/sysconfig/iptables-20171213-v2”
ExecStop=/bin/bash -c “exec /usr/sbin/iptables-save > /etc/sysconfig/iptables”
[Install]
WantedBy=multi-user.target
~]# systemctl daemon-reload
~]# systemctl enable vsftpd.service
~]# systemctl enable iptables.service
(2) firewalld服務;
(3) 自定義腳本;
網絡防火墻:
(1) 在網關定義,因為非本地網絡的通信報文會經由是網關;
(2) filter給的FORWARD; 轉發 PREROUTING –> FORWRAD –> POSTROUTING,而過濾只能filter表,所以為FORWARD;
客戶端網關防火墻:
不能確定服務端的具體IP
僅能確定客戶端的具體IP,通常給一個范圍開放;
服務端網關防火墻:
不能確定客戶端的具體IP,通常給所有人開放;
僅能確定服務端的具體IP,僅給有限的主機開放;
環境準備:
node1:
eno16777736:192.168.10.2 net1
node2:
eno33554984:192.168.10.254 net1
eno16777736:172.16.0.6 bridge
node3:
eno16777736:172.16.0.67 bridge
前提:
所有防火墻關閉;
node1能ping能,192.168.10.254
node2能ping通, node1,nod3
node3能ping通, 172.16.0.6
報文流向:node1 — node2(eno33554984 — PREROUTING — FORWARD — POSTROUTING — eno16777736) — node3
1、為什么在node1上能ping通node2的172.16.0.6地址;
對于Linux主機來講:“地址屬于內核,與網卡無關”。
2、為什么在node1上不能ping通node3;
根據報文流向可知:node1 –> node3
先在node2的eno33554984抓包分析:~]# tcpdump -i eno33554984 -nn icmp (注意:抓包如此方法)
192.168.10.2 > 172.16.0.67: ICMP echo request,
192.168.10.2 > 172.16.0.67: ICMP echo request,
192.168.10.2 > 172.16.0.67: ICMP echo request,
注意:僅關注這部分;
表示報文已經到達此網卡。
在node2的eno16777736抓包分析:~]# tcpdump -i eno16777736 -nn icmp
沒有任何報文。
說明: PREROUTING — FORWARD — POSTROUTING 不通;則是FORWARD沒有打開!
[root@localhost ~]# cat /proc/sys/net/ipv4/ip_forward
0
打開FORWARD:~]# sysctl -w net.ipv4.ip_forward=1
還是不通:
先在node2的eno33554984抓包分析:
14:09:26.165715 IP 192.168.10.2 > 172.16.0.67: ICMP echo request, id 12648, seq 314, length 64
14:09:27.180426 IP 192.168.10.2 > 172.16.0.67: ICMP echo request, id 12648, seq 315, length 64
在node2的eno16777736抓包分析:
14:09:47.459987 IP 192.168.10.2 > 172.16.0.67: ICMP echo request, id 12648, seq 335, length 64
14:09:48.474520 IP 192.168.10.2 > 172.16.0.67: ICMP echo request, id 12648, seq 336, length 64
說明:這段路已經通暢!在Node3測試,為什么不回應呢?
在node3的eno16777736抓包分析:
14:11:59.742810 IP 192.168.10.2 > 172.16.0.67: ICMP echo request, id 12648, seq 466, length 64
14:12:00.742701 IP 192.168.10.2 > 172.16.0.67: ICMP echo request, id 12648, seq 467, length 64
說明:沒有默認路由:添加路由規則:
~]# route add -net 192.168.10.0/24 gw 172.16.0.6 dev eno16777736
通了!
先在node2的eno33554984抓包分析:
14:15:21.181338 IP 192.168.10.2 > 172.16.0.67: ICMP echo request, (注意:請求)
14:15:21.182078 IP 172.16.0.67 > 192.168.10.2: ICMP echo reply, (注意:響應)
在node2的eno16777736抓包分析:
14:15:39.388731 IP 192.168.10.2 > 172.16.0.67: ICMP echo request, id 12648, seq 683, length 64
14:15:39.389340 IP 172.16.0.67 > 192.168.10.2: ICMP echo reply, id 12648, seq 683, length 64
在node3的eno16777736抓包分析:
14:15:58.565743 IP 192.168.10.2 > 172.16.0.67: ICMP echo request, id 12648, seq 702, length 64
14:15:58.565825 IP 172.16.0.67 > 192.168.10.2: ICMP echo reply, id 12648, seq 702, length 64
通過網關實現:
功能:filter(INPUT, FORWARD, OUTPUT)
網關:報文流向 node1 — node2(eno33554984 — PREROUTING — FORWARD — POSTROUTING — eno16777736) — node3
所以僅能在FORWARD鏈上進行操作;
將192.網絡當作 客戶端; 172.67.0.67當作服務端:
此時172和192能相互對ping。
客戶端防火墻:
1)僅開放192網絡內的所有主機 訪問外網的web服務;
1、不知道外網的IP;
2、172.16.0.67僅是外網中浩瀚海洋中的滄海一栗;
FORWARD不影響ssh:
~]# iptables -A FORWARD -j REJECT
此時的效果是node1不能請求node3,且請求過程后在node2上查看REJECT的包有數量;
非狀態:
請求:~]# iptables -I FORWARD -s 192.168.10.0/24 -p tcp –dport 80 -j ACCEPT
在Node2上抓包分析:
~]# tcpdump -i eno33554984 -nn tcp port 80
14:29:42.883716 IP 192.168.10.2.40791 > 172.16.0.67.80
14:29:43.889321 IP 192.168.10.2.40791 > 172.16.0.67.80
請注意:沒有回來的報文;
~]# tcpdump -i eno16777736 -nn tcp port 80
14:30:41.078966 IP 192.168.10.2.40794 > 172.16.0.67.80
14:30:41.079766 IP 172.16.0.67.80 > 192.168.10.2.40794
請注意:67是回應了的。
說明響應的FORWARD沒有打開:
響應: ~]# iptables -I FORWARD 2 -d 192.168.10.0/24 -p tcp –sport 80 -j ACCEPT
在Node2上eno33554984 抓包分析80端口:
14:36:36.966057 IP 172.16.0.67.80 > 192.168.10.2.40796: Flags [S.], seq 787342888, ack 4234809659, win 14480, options [mss 1460,sackOK,TS val 23912515 ecr 3861304,nop,wscale 7], length 0
14:36:36.966367 IP 192.168.10.2.40796 > 172.16.0.67.80: Flags [.], ack 1, win 115, options [nop,nop,TS val 3861313 ecr 23912515], length 0
在Node2上eno16777736 抓包分析80端口:
14:37:41.686423 IP 192.168.10.2.40797 > 172.16.0.67.80: Flags [S], seq 3666394773, win 14600, options [mss 1460,sackOK,TS val 3926032 ecr 0,nop,wscale 7], length 0
14:37:41.687211 IP 172.16.0.67.80 > 192.168.10.2.40797: Flags [S.], seq 3443343486, ack 3666394774, win 14480, options [mss 1460,sackOK,TS val 23977236 ecr 3926032,nop,wscale 7], length 0
在Node3上eno16777736 抓包分析80端口:
14:44:45.809942 IP 192.168.10.2.40798 > 172.16.0.67.80
14:44:45.810071 IP 172.16.0.67.80 > 192.168.10.2.40798
請注意:源地址是192.168.10.2。這樣很不安全,就引入了SNAT機制,將源地址轉換為網關的接口地址;
SNAT:
~]# iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -p tcp –dport 80 -j SNAT –to-source 172.16.0.6
在Node3上eno16777736 抓包分析80端口:
14:46:41.952947 IP 172.16.0.6.40800 > 172.16.0.67.80
14:46:41.953184 IP 172.16.0.67.80 > 172.16.0.6.40800
注意:源地址是172.16.0.6,此時即使能看見自己的公網地址,但只要網關自己的“主機防火墻”做到位,安全加強就沒事了;
狀態方式配置:
重置:
~]# iptables -F
~]# iptables -t nat -F
~]# iptables -A FORWARD -j REJECT
狀態:
請求有NEW和ESTABLISHED:
響應只能ESTABLISHED;
請求和響應的:~]# iptables -I FORWARD -m state –state ESTABLISHED -j ACCEPT
在Node2上eno33554984 抓包分析80端口:
14:54:08.268057 IP 192.168.10.2.40805 > 172.16.0.67.80: Flags [S], seq 3064237376, win 14600, options [mss 1460,sackOK,TS val 4912614 ecr 0,nop,wscale 7], length 0
在Node2上eno16777736 抓包分析80端口:
不存在;說明請求的FORWARD沒有打開!
請求的NEW:~]# iptables -I FORWARD 2 -s 192.168.10.0/24 -p tcp –dport 80 -m state –state NEW -j ACCEPT
在Node2上eno33554984 抓包分析80端口:
14:56:42.044843 IP 192.168.10.2.40807 > 172.16.0.67.80: Flags [S], seq 3951411244, win 14600, options [mss 1460,sackOK,TS val 5066390 ecr 0,nop,wscale 7], length 0
14:56:42.045433 IP 172.16.0.67.80 > 192.168.10.2.40807: Flags [S.], seq 3032164064, ack 3951411245, win 14480, options [mss 1460,sackOK,TS val 25117595 ecr 5066390,nop,wscale 7], length 0
有響應
在Node2上eno16777736 抓包分析80端口:
14:56:42.044916 IP 192.168.10.2.40807 > 172.16.0.67.80: Flags [S], seq 3951411244, win 14600, options [mss 1460,sackOK,TS val 5066390 ecr 0,nop,wscale 7], length 0
14:56:42.045399 IP 172.16.0.67.80 > 192.168.10.2.40807: Flags [S.], seq 3032164064, ack 3951411245, win 14480, options [mss 1460,sackOK,TS val 25117595 ecr 5066390,nop,wscale 7], length 0
在內網主機上已經有數據返回
在Node3上eno16777736 抓包分析80端口:
14:58:04.981834 IP 192.168.10.2.40808 > 172.16.0.67.80: Flags [S], seq 3832854045, win 14600, options [mss 1460,sackOK,TS val 5149313 ecr 0,nop,wscale 7], length 0
14:58:04.982045 IP 172.16.0.67.80 > 192.168.10.2.40808: Flags [S.], seq 4077508747, ack 3832854046, win 14480, options [mss 1460,sackOK,TS val 25200525 ecr 5149313,nop,wscale 7], length 0
請注意:源地址是192.168.10.2。這樣很不安全,就引入了SNAT機制,將源地址轉換為網關的接口地址;
SNAT:
~]# iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -p tcp –dport 80 -j SNAT –to-source 172.16.0.6
在Node3上eno16777736 抓包分析80端口:
15:00:31.381961 IP 172.16.0.6.40809 > 172.16.0.67.80
15:00:31.382087 IP 172.16.0.67.80 > 172.16.0.6.40809
總結: 如果是192.168.10.0/24不能訪問外網:
在網關的通向互聯網的接口上抓包分析:
不存在任何報文:說明FORWARD沒有打開;
存在回應此請求:說明響應的FORWARD沒有打開;
2)開放內網訪問外網的所有服務:
重置:
~]# iptables -F
~]# iptables -t nat -F
~]# iptables -A FORWARD -j REJECT
1、非狀態:
請求:[root@localhost ~]# iptables -I FORWARD -s 192.168.10.0/24 -j ACCEPT
~]# tcpdump -i eno16777736 -nn tcp port 21
在網關的非本地網絡上的網卡上抓包,有響應;但主機上沒有結果;說明沒有響應的FORWARD規則;
響應:[root@localhost ~]# iptables -I FORWARD 2 -d 192.168.10.0/24 -j ACCEPT
注意: lftp可以使用;web可以使用;
在遠端的主機上抓包:
15:12:26.338858 IP 192.168.10.2.48013 > 172.16.0.67.21: Flags [S], seq 3806805776, win 14600, options [mss 1460,sackOK,TS val 6010676 ecr 0,nop,wscale 7], length 0
15:12:26.338978 IP 172.16.0.67.21 > 192.168.10.2.48013: Flags [S.], seq 1173645814, ack 3806805777, win 14480, options [mss 1460,sackOK,TS val 26061882 ecr 6010676,nop,wscale 7], length 0
SNAT:
~]# iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT –to-source 172.16.0.6
在遠端的主機上抓包:
15:18:55.993893 IP 172.16.0.67.21 > 172.16.0.6.48016
15:18:55.996743 IP 172.16.0.6.48016 > 172.16.0.67.21
在Node2上eno16777736 抓包分析21端口:
15:18:55.986390 IP 172.16.0.67.21 > 172.16.0.6.48016
15:18:55.987850 IP 172.16.0.6.48016 > 172.16.0.67.21
在Node2上eno33554984 抓包分析21端口:
15:18:55.986410 IP 172.16.0.67.21 > 192.168.10.2.48016
15:18:55.987809 IP 192.168.10.2.48016 > 172.16.0.67.21
總結:源地址轉換不轉換源端口;在遠程主機看到的是轉換后的結果;
2、狀態:
[root@localhost ~]# iptables -F
[root@localhost ~]# iptables -t nat -F
[root@localhost ~]# iptables -A FORWARD -j REJECT
[root@localhost ~]# iptables -I FORWARD -m state –state ESTABLISHED -j ACCEPT
[root@localhost ~]# iptables -I FORWARD -s 192.168.10.0/24 -m state –state NEW -j ACCEPT
SNAT:
~]# iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT –to-source 172.16.0.6
將192.網絡當作 服務端; 172.67.0.67當作客戶端:
服務端防火墻:
不能確定客戶端的具體IP
僅能確定服務端的具體IP
報文流向:node3 — node2(eno16777736 — PREROUTING — FORWARD — POSTROUTING — eno33554984) — node1
1)開放內網單個主機 僅提供web服務給外網所有人訪問?
[root@localhost ~]# iptables -t nat -F
[root@localhost ~]# iptables -F
[root@localhost ~]# iptables -A FORWARD -j REJECT
非狀態配置:
請求:[root@localhost ~]# iptables -A FORWARD -d 192.168.10.2 -p tcp –dport 80 -j ACCEPT
在Node2上eno16777736 抓包分析80端口:
15:38:03.388459 IP 172.16.0.67.50656 > 192.168.10.2.80
15:38:04.394062 IP 172.16.0.67.50656 > 192.168.10.2.80
在本地網卡上只能單向的包,回應的包呢?
在Node2上eno33554984 抓包分析80端口:
15:38:51.051463 IP 172.16.0.67.50657 > 192.168.10.2.80
15:38:51.052237 IP 192.168.10.2.80 > 172.16.0.67.50657
在非本地網卡上可以看到有回應:
在Node1上eno16777736 抓包分析80端口:
15:40:04.033488 IP 172.16.0.67.50658 > 192.168.10.2.80
15:40:04.033568 IP 192.168.10.2.80 > 172.16.0.67.50658
響應:[root@localhost ~]# iptables -I FORWARD 2 -s 192.168.10.2 -p tcp –sport 80 -j ACCEPT
在Node2上eno16777736 抓包分析80端口:
15:43:46.434900 IP 172.16.0.67.50661 > 192.168.10.2.80
15:43:46.437480 IP 192.168.10.2.80 > 172.16.0.67.50661
在Node2上eno33554984 抓包分析80端口:
15:43:46.437274 IP 192.168.10.2.80 > 172.16.0.67.50661
15:43:46.437793 IP 172.16.0.67.50661 > 192.168.10.2.80
在Node1上eno16777736 抓包分析80端口:
15:43:46.441933 IP 192.168.10.2.80 > 172.16.0.67.50661
15:43:46.443837 IP 172.16.0.67.50661 > 192.168.10.2.80
注意:服務端的IP應該被隱藏:這樣很不安全:
DNAT:代表服務器接收請求,僅需要去請求網關就可以返回結果;
[root@localhost ~]# iptables -t nat -A PREROUTING -d 172.16.0.6 -p tcp –dport 80 -j DNAT –to-destination 192.168.10.2
請注意:以Node3去請求網關的外網地址:172.16.0.6
在Node2上eno16777736 抓包分析80端口:
15:50:31.559020 IP 172.16.0.67.51361 > 172.16.0.6.80
15:50:31.561719 IP 172.16.0.6.80 > 172.16.0.67.51361
請注意:請求的是網關的80;源: 172.16.0.67.51361 目標:172.16.0.6.80
在Node2上eno33554984 抓包分析80端口:
15:50:31.559047 IP 172.16.0.67.51361 > 192.168.10.2.80
15:50:31.561689 IP 192.168.10.2.80 > 172.16.0.67.51361
請注意:源: 172.16.0.67 目標:192.168.10.2.80
在Node1上eno16777736 抓包分析80端口:
15:50:31.565910 IP 172.16.0.67.51361 > 192.168.10.2.80
15:50:31.566390 IP 192.168.10.2.80 > 172.16.0.67.51361
總結:DNAT轉換目標地址時,不指定轉換端口,同請求的端口;
狀態配置:
請求有NEW和ESTABLISHED
響應只有ESTABLISHED
[root@localhost ~]# iptables -t nat -F
[root@localhost ~]# iptables -F
[root@localhost ~]# iptables -A FORWARD -j REJECT
[root@localhost ~]# iptables -vnL
開放請求和響應的ESTABLISHED:
[root@localhost ~]# iptables -I FORWARD -m state –state ESTABLISHED -j ACCEPT
在eno33554984網卡上不能看到報文:說明請求的FORWARD沒有撕開!
開放請求的NEW
[root@localhost ~]# iptables -I FORWARD 2 -d 192.168.10.2 -m state –state NEW -j ACCEPT
在Node2上eno16777736 抓包分析80端口:
16:05:57.834066 IP 172.16.0.67.50671 > 192.168.10.2.80
16:05:57.836114 IP 192.168.10.2.80 > 172.16.0.67.50671
請注意:請求的是網關的80;源: 172.16.0.67.51361 目標:172.16.0.6.80
在Node2上eno33554984 抓包分析80端口:
116:05:57.834090 IP 172.16.0.67.50671 > 192.168.10.2.80
16:05:57.836080 IP 192.168.10.2.80 > 172.16.0.67.50671
請注意:源: 172.16.0.67 目標:192.168.10.2.80
在Node1上eno16777736 抓包分析80端口:
16:05:57.841300 IP 172.16.0.67.50671 > 192.168.10.2.80
16:05:57.841399 IP 192.168.10.2.80 > 172.16.0.67.50671
請注意:客戶端怎么可以直接訪問真正的服務器呢?
DNAT:網關代理服務器接收請求:
[root@localhost ~]# iptables -t nat -A PREROUTING -d 172.16.0.6 -p tcp –dport 80 -j DNAT –to-destination 192.168.10.2
在Node2上eno16777736 抓包分析80端口:
16:15:37.502189 IP 172.16.0.67.51372 > 172.16.0.6.80
16:15:37.504440 IP 172.16.0.6.80 > 172.16.0.67.51372
請注意:請求的是網關的80;源: 172.16.0.67.51372 目標:172.16.0.6.80
在Node2上eno33554984 抓包分析80端口:
16:15:37.502214 IP 172.16.0.67.51372 > 192.168.10.2.80
16:15:37.504396 IP 192.168.10.2.80 > 172.16.0.67.51372
請注意:源: 172.16.0.67.51372 目標:192.168.10.2.80
在Node1上eno16777736 抓包分析80端口:
16:15:37.502214 IP 172.16.0.67.51372 > 192.168.10.2.80
16:15:37.504396 IP 192.168.10.2.80 > 172.16.0.67.51372
總結:DNAT轉換目標地址時,不指定轉換端口,同請求的端口;
擴展:
(1) 開放內網單個主機 提供samba, ssh, http, mariadb, https允許被訪問。
重置:iptables -F; iptables -t nat -F
[root@localhost ~]# iptables -A FORWARD -j REJECT
非狀態:
[root@localhost ~]# iptables -I FORWARD -d 192.168.10.2 -p tcp -m multiport –dports 22,443,80,139,445 -j ACCEPT
[root@localhost ~]# iptables -I FORWARD -d 192.168.10.2 -p udp –dport 137:138 -j ACCEPT
[root@localhost ~]# iptables -I FORWARD 2 -s 192.168.10.2 -p tcp -m multiport –sports 22,443,80,139,445 -j ACCEPT
[root@localhost ~]# iptables -I FORWARD 2 -s 192.168.10.2 -p udp –sport 137:138 -j ACCEPT
DNAT: 代理服務器接收請求
[root@localhost ~]# iptables -t nat -A PREROUTING -d 172.16.0.6 -p tcp -m multiport –dports 22,80,139,443,445 -j DNAT –to-destination 192.168.10.2
注意:在172.16.0.179也將路由指向了172.16.0.6
在Node2上eno33554984 抓包分析80端口:
16:50:45.410044 IP 172.16.0.179.57418 > 192.168.10.2.80: Flags [.], ack 5660, win 254, length 0
16:50:45.510019 IP 172.16.0.179.57419 > 192.168.10.2.80: Flags [.], ack 1366, win 251, length 0
在Node2上eno33554984 抓包分析22端口:
16:52:56.694559 IP 172.16.0.67.50878 > 192.168.10.2.22
16:52:56.697502 IP 192.168.10.2.22 > 172.16.0.67.50878
(2) 狀態跟蹤機制開放內網單個主機 提供ftp, samba, ssh, http, mariadb, https允許被訪問
重置:iptables -F; iptables -t nat -F
[root@localhost ~]# iptables -A FORWARD -j REJECT
請求和響應:[root@localhost ~]# iptables -I FORWARD -m state –state ESTABLISHED -j ACCEPT
在eno33554984上沒有回應
請求:[root@localhost ~]# iptables -I FORWARD 2 -d 192.168.10.2 -p tcp -m multiport –dports 21:22,139,445,80,3306,443 -m state –state NEW -j ACCEPT
(3) 開放ftp
[root@localhost ~]# modprobe nf_conntrack_ftp
[root@localhost ~]# iptables -I FORWARD 3 -d 192.168.10.2 -p tcp -m state –state RELATED -j ACCEPT
DNAT:
隱藏服務器地址:通過訪問172.16.0.6即可 ;
[root@localhost ~]# iptables -t nat -A PREROUTING -d 172.16.0.6 -p tcp -j DNAT –to-destination 192.168.10.2
注意:使用ftp時,在DNAT中,tcp中不能指明端口,因為被動模式中端口是隨機的!
SNAT: 代表客戶端去請求服務器,將客戶端的源地址修改為網關接口的外網地址;
注意:
1、POSTROUTING做地址轉換,FORWARD鏈配置過濾應該以狀態來追蹤;因為客戶端端口所以放行,響應所有放行,相當于大門敞開;
2、客戶端是隨機端口,所以不應該固定端口;
DNAT: 代表服務端去響應客戶端,將客戶端請求的目標地址(即網關自己接口的外網地址)修改為內網的”某個”或”某些”主機的地址或端口;
注意:
1、PREROUTING做地址轉換后, FORWARD鏈配置過濾規則時目標地址是 內網的”某個”或”某些”主機的地址或端口;
2、FORWARD鏈配置過濾可以狀態可以以非狀態;
DNAT地址轉換:
192.168.10.2監聽在8080端口,在外網請求網關的80時,自動映射到8080
~]# iptables -t nat -I PREROUTING -d 172.16.0.6 -p tcp –dport 80 -j DNAT –to-destination 192.168.10.2:8080
REDIRECT: 端口映射:將所以請求80端口定向至8080;例如:本機未監聽80服務,打開此功能:別人來請求80時,kernel自己將其映射為8080端口;
注意:
1、PREROUTING將80 端口轉換為8080后,主機防火墻FORWARD鏈配置過濾時的端口是 8080
REDIRECT映射:
172.16.0.6將地址映射到了8080端口;本機192.168.10.2監聽在80上;
在2上的網卡上抓包可以看出:
# tcpdump -i eno16777736 -nn tcp port 8080
17:45:51.898055 IP 172.16.0.179.57559 > 192.168.10.2.8080
17:45:51.898749 IP 192.168.10.2.8080 > 172.16.0.179.57559
目標:192.168.10.2.8080
此時在2上配置:# iptables -t nat -A PREROUTING -d 192.168.10.2 -p tcp –dport 8080 -j REDIRECT –to-ports 80
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/90445
內容上還是蠻多知識點~繼續加油~