iptables/netfilter的網絡防火牆
接上文繼續講解網絡防火牆和nat功能的基礎功能;
網絡防火牆的功能簡單講就是,所有經由本機的一個接口進來的報文在本地路由決策後路由的目標地址不是本機,需要幫忙轉發到其它網絡當中或來源網絡中去的這種請求時的場景,我們就稱爲轉發功能;
那麼轉發的報文必須是經由forward鏈(含三個鏈,prerouting,forward,postrouting),不過過濾只能在forward實現;
請注意:定義在forward鏈上的策略只對那些經由本機轉發的報文才有效,進出本主機的報文沒有任何效用;
其它的我們就不多說了,上一些規則測試語句,想必都可以看得懂;
添加規則於FORWARD鏈,注意幾個問題
(1) 請求和響應報文均會經由FORWARD鏈,要注意規則的方向性;
如:iptables -I FORWARD -m state –state ESTABLISHED,RELATED -j ACCEPT
(2) 如果可以啓用conntrack機制,注意網關主機所能夠追蹤的連接數的最大數量要符合需要;
如何使用iptables構建網絡防火牆環境
1、環境構建並做相應服務應用測試
主機1臺,CentOS 7.2 構建模型爲網關接口
NIC 01:172.16.5.40/16 外網主機地址;
NIC 02:192.168.22.1/24 內網主機地址;
~]# cat /proc/sys/net/ipv4/ip_forward (這時轉發功能未打開 );
主機1臺,CentOS 7.2 搭建模型爲內網主機客戶端
IP:192.168.22.2/24;
Gateway:192.1.68.22.1;
主機1臺,CentOS 7.2 構建模型爲外網主機客戶端
IP:172.16.5.50/16;
在內網主機客戶端安裝測試環境;
~]# yum install -y vsftpd httpd telnet-server samba
測試ping 172.16.5.40能通,因爲ip工作與內核只在本機未轉發;
可抓包看地址解析過程;
~]# tcpdump -i eno16777736 -nn icmp
開啓轉發後報文還是無法響應,最簡單需在本機更改默認網關或添加路由;
~]# route del -net 0.0.0.0 gw 172.16.5.1
~]# route add default gw 172.16.5.40
增加一個應用服務,並在外網客戶端主機上去測試內網主機客戶端能否訪問;
~]# systemctl start httpd
~]# echo 192.168.22.2 > /var/www/html/index.html
在外網主機客戶端測試;
~]# curl http://192.168.22.2(通證明網絡之間通信沒問題)
同理在外網客戶端安裝一個應用,並在內網主機做測試能連同網絡之間連接正常;
2、在網關上添加策略
先做個黑名單
~]# iptables -A FORWORAD -j DROP
內網客戶端測試;
~]# curl http://192.168.22.2
示例如下:
放行由內而外訪問任意外部服務 ;
~]# iptables -I FORWARD -s 192.168.22.0/24 -p tcp –dport 80 -j ACCEPT
開放請求報文出去;
~]# iptables -I FORWARD 2 -d 192.168.22.0/24 -p tcp –sport 80 -j ACCEPT
放響應報文進來;
注意: 因爲我們做的是黑名單,任何能請求出去的響應報文都是安全的,爲了避免規則越來越多,我們可以使用狀態追蹤機制;
~]# iptables -D FORWARD 2
添加一條規則,無論從內而外只要是響應報文都可正常允許進行;
~]# iptables -I FORWARD -m state –state ESTABLISHED -j ACCEPT
以後只要寫請求策略就可以了;
如:內網主機開放ssh連入到外網;
~]# iptables -R FORWARD 2 -s 192.168.22.0/24 -p tcp -m multiport –dport 80,22,23,21 139,445 -m state –state new
-j ACCEPT
開放由內網主機去訪問外網主機客戶端的ftp服務;
在網關主機上裝載ftp狀態追蹤模塊;
~]# modprobe nf_conntrack_ftp,lsmod | grep nf_conntrack_ftp
~]# iptables -R FORWARD 1 -m state –state established,related -j ACCEPT
注意:一定要在寫規則時別把自己擋在牆外面,可定義任務計劃,20分鐘策略失效 @指定iptables -F ;
NAT功能
NAT是什麼我想不用我在這裏嗷述,它的全稱是(Network Address Translation即網絡地址轉換);
它的出現減緩甚至代替了IP地址空間的枯竭;
更詳細的介紹可參考360百科或官方RFC 1632技術文檔做參考;
**功能**
源地址轉換:SNAT,僅能應用於POSTROUTING INPUT鏈 只考慮報文的前半段;
靜態轉換:地址是固定的;
動態轉換:地址是隨機的;
目標地址轉換:DNAT,僅能應用於PREROUTING OUTPUT鏈;
基於IP+端口轉換,地址做轉換,端口做判斷;
MASQUERADE:地址僞裝;
REDIRECT: 端口映射;
RETURN:返回 ;
自定義鏈功能;
基於地址池定義;
SNAT:源IP地址轉換
對於有Internet訪問需求而內部又使用私有地址的網絡,就要在組織的出口位置部署NAT網關,在報文離開私網進入Internet時,將源IP替換爲公網地址,通常是出口設備的接口地址。一個對外的訪問請求在到達目標以後,表現爲由本組織出口設備發起,因此被請求的服務端可將響應由Internet發回出口網關。出口網關再將目的地址替換爲私網的源主機地址,發回內部。這樣一次由私網主機向公網服務端的請求和響應就在通信兩端均無感知的情況下完成了。依據這種模型,數量龐大的內網主機就不再需要公有IP地址了;
DNAT:目的IP地址轉換
1、發佈內部服務器,讓外面的internet用戶能訪問到內網的服務器;
2、網絡重定向;
(摘自網絡)
NAT的功能測試
實驗的環境還是沿用之前的環境;
多個示例襲來:
所有來自內網中的主機請求都轉發到外網中去(在網關中加入) ;
~]# iptables -t nat -A POSTROUTING -s 192.168.22.0/24 -j SNAT –to-source 172.16.5.40
~]# iptables -t nat -vnL
在外網主機客戶端抓包看一下;
~]# tcpdump -i eno16777736 -nn icmp (目標地址轉換自動完成);
所有來自於外網對公網地址上某一個端口的請求,統統都轉發自內網中某一服務器上去;
~]# iptables -t nat -A PREROUTING -d 172.16.5.40 -p tcp –dport 80 -j DNAT –to-destination 192.168.22.2
~]# iptables -t nat -vnL
外網主機客戶端測試 curl http://172.16.5.40;
~]# iptables -t nat -A PREROUTING -d 172.16.5.40 -j DNAT –to-destination 192.168.22.2:80
任意端口任意地址;
端口映射httpd 8080;
~]# iptables -t nat -A PREROUTING -d 172.16.5.40 -p tcp –dport 80 -j DNAT –to-destination 192.168.22.2:8080
~]# iptables -t nat PREROUTING 2 -d 172.16.5.40 -p tcp –dport 22022 -j DNAT –to-destination 192.168.22.3:22
在外網主機客戶端測試;
~]# ssh -p 22022 [email protected]
自定義鏈、RETURN
自定義鏈:需被引用;
~]# iptables -A web_in -d 192.168.22.0/24 -p tcp –dport 80 -m state --state NEW-j ACCEPT
~]# iptables -A FORWARD -j REJECT
在默認規則前調用上面的規則;
~]# iptables -I FORWARD 2 -d 192.168.22.0/24 -p tcp –dport 80 -j web_in
~]# iptables -A web_in -j RETURN
注意:自定義鏈無法被刪除,需清除鏈規則後在刪除;
~]# iptables -F web_in
~]# iptables -X web_in
其它未講的可自行參考Linux內核編譯系列叢書和最大的***指導性網站Google;
done