Linux教程系列-iptables

iptables防火牆簡介
iptables/netfilter是Linux下自帶的一款免費且優秀的基於包過濾的防火牆工具,它的功能十分強大,使用非常靈活,
可以對流入、流出、流經服務器的數據包進行精細的控制。
iptables是Linux2.4及2.6內核中集成的模塊。

防火牆規則的執行順序默認是從前到後依次執行,遇到匹配的規則就不在繼續向下檢查,若果遇到不匹配的規則會繼續向下執行,
匹配上了拒絕規則也是匹配,因此不再繼續。

在iptables中有四張表,分別是filter、nat、mangle和raw每一個表中都包含了各自不同的鏈。
最常用的是filter表和nat表
filter表:
filter是iptables默認使用的表,負責對流入、流出本機的數據包進行過濾,該表中定義了3個鏈:
INPOUT 負責過濾所有目標地址是本機地址的數據包,就是過濾進入主機的數據包。
FORWARD 負責轉發流經本機但不進入本機的數據包,起到轉發的作用。
OUTPUT 負責處理所有源地址是本機地址的數據包,就是處理從主機發出去的數據包。

NAT表:
NAT是Network Address Translation的縮寫,是網絡地址轉換的意思,用來負責來源與目的ip地址和port的轉換。
一般用於局域網多人共享上網或將內網ip映射成外網ip+port轉換的功能。該表主要包含3個鏈:
OUTPUT 和主機發出去的數據包有關,在數據包路由之前改變主機產生的數據包的目的地址。
PREROUTING 在數據包剛到達防火牆時,進行路由判斷之前執行的規則。改變包的目的地址(DNAT功能)、端口等
POSTROUTING 在數據包離開防火牆時,進行路由判斷之後執行的規則。改變包的源地址(SNAT功能)、端口等

Mangle表:
Mangle表主要負責修改數據包中的特殊路由標記,如TTL、TOS、MARK等。這個表中包含了5個鏈:INPUT、FORWARD、OUTPUT、PREROUTING、POSTROUTING,
這張表與特殊的標記相關,一般情況我們很少使用。

#查看幫助
iptables -h
man iptables

列出iptables規則
iptables -L -n
列出iptables規則並顯示規則編號
iptables -L -n --line-numbers

列出iptables nat表規則(默認是filter表)
iptables -L -n -t nat

清除默認規則(注意默認是filter表,如果對nat表操作要加-t nat)
#清楚所有規則
iptables -F
#刪除用戶自定義的鏈
iptables -X
#將鏈的計數器清零
iptables -Z

#重啓iptables發現規則依然存在,因爲沒有保存
service iptables restart

#保存配置
service iptables save

#禁止ssh登陸(若果服務器在機房,一定要小心)
iptables -A INPUT -p tcp --dport 22 -j DROP
#清除規則
iptables -D INPUT -p tcp --dport 22 -j DROP

-A, --append chain 追加到規則的最後一條
-D, --delete chain [rulenum] Delete rule rulenum (1 = first) from chain
-I, --insert chain [rulenum] Insert in chain as rulenum (default 1=first) 添加到規則的第一條
-p, --proto proto protocol: by number or name, eg. ‘tcp’,常用協議有tcp、udp、icmp、all
-j, --jump target 常見的行爲有ACCEPT、DROP和REJECT三種,但一般不用REJECT,會帶來安全隱患

注意:INPUT和DROP這樣的關鍵字需要大寫

#禁止192.168.10.0網段從eth0網卡接入
iptables -A INPUT -p tcp -i eth0 -s 192.168.10.0/24 -j DROP

#禁止ip地址非192.168.10.10的所有類型數據接入
iptables -A INPUT ! -s 192.168.10.10 -j DROP

#禁止ip地址非192.168.10.10的ping請求
iptables -I INPUT -p icmp --icmp-type 8 -s 192.168.50.100 -j DROP

#擴展匹配:1.隱式擴展 2.顯示擴展
#隱式擴展
-p tcp
–sport PORT 源端口
–dport PORT 目標端口

#顯示擴展:使用額外的匹配規則
-m EXTENSTION --SUB-OPT
-p tcp --dport 22 與 -p tcp -m tcp --dport 22功能相同

state:狀態擴展,接口ip_contrack追蹤會話狀態
NEW:洗的連接請求
ESTABLISHED:已建立的連接請求
INVALID:非法連接
RELATED:相關聯的連接

#匹配端口範圍
iptables -I INPUT -p tcp --dport 22:80 -j DROP

#匹配多個端口
iptables -I INPUT -p tcp -m multiport --dport 22,80 -j DROP

#不允許源端口爲80的數據流出
iptables -I OUTPUT -p tcp --sport 80 -j DROP

#服務器一般默認規則問拒絕,如果想允某種流量通過需要額外添加

Incoming                 /     \         Outgoing
       -->[Routing ]--->|FORWARD|------->
          [Decision]     \_____/        ^
               |                        |
               v                       ____
              ___                     /    \
             /   \                  |OUTPUT|
            |INPUT|                  \____/
             \___/                      ^
               |                        |
                ----> Local Process ----

http://www.netfilter.org/documentation/HOWTO/packet-filtering-HOWTO-6.html

配置防火牆:
兩種模式:電影院模式和逛公園模式

配置一個生產環境的防火牆
#1.清空所有規則
iptables -F
iptables -Z
iptables -X

#2.配置允許ssh協議的22端口進入
iptables -A INPUT -p tcp --dport 22 -s 192.168.50.100 -j ACCEPT

#3.配置允許lo接口數據的進出
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

#4.設置默認的進出規則,DROP掉INPUT鏈和FORWARD鏈,保留OUTPUT鏈
iptables --policy OUTPUT ACCEPT
iptables -P INPUT DROP
iptables -P FORWARD DROP

#5.開啓信任的IP段
iptables -A INPUT -p all -s 192.168.10.0/24 -j ACCEPT

#6.開放http的80端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT

#7.允許icmp類型協議通過
iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT

#8.允許關聯狀態包進出
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#對於FTP而言,就需要 RELATED 才能實現 21 端口白名單,如不加此項需要額外開放端口,而那些額外開放端口是不受連接狀態保護的。

#9.保存iptables配置到文件
service iptables save

iptables的NAT功能:將Linux服務器配置爲上網網關和端口映射功能

上網網關:就是將Linux服務器配置成路由器或者網關,實現其他服務器能通過這臺服務器進行上網的功能,如果需要實在
該功能,就要藉助iptables的nat表

NAT的兩種方式:DNAT和SNAT

SNAT的全稱是Source Network Address Translation,意思是源網絡地址轉換,這是一種改變數據包源ip地址等功能的技術,
經常用來實現使多臺計算機共享一個Internet地址訪問互聯網的功能,如x小區寬帶、企業內部機器上網。(nat表的POSTROUTING)

DNAT的全稱是Destination Network Address Translation,意思是目的網絡地址轉換,DNAT是一種改變數據包目的ip地址等
功能的技術,它可以使多臺服務器共享一個ip地址連入Internet,並且繼續對外提供服務。通過對同一個外部ip地址分配不同的
端口,可以映射到不同的內部服務器的ip和端口,從而實現提供各種服務的目的。除了進行端口映射外,還可以配合SNAT的功能,
來實現類似防火牆設備才能實現的DMZ功能,即ip的一對一映射。(nat表的PREROUTING)

SNAT實驗步驟:
1.準備兩臺服務器,其中一臺服務器作爲網關服務器,這臺服務器要有兩塊網卡。另外一臺作爲內網服務器,有一塊網卡。
2.網關服務器內核文件/etc/sysctl.conf需要開啓轉發功能。編輯/etc/sysctl.conf修改內容爲net.ipv4.ip_forward=1,然後執行sysctl -p使修改立即生效。
3.設置iptables的filter表的FORWARD鏈允許轉發。iptables -P FORWARD ACCEPT
4.將內網服務器的網關設置爲網關服務器的內網ip地址
網關服務器VM1,外網IP地址192.168.50.128,內網ip地址192.168.80.128
將內網服務器VM2的網關設置爲192.168.80.128
5.在網關服務器的iptables的nat表中加一條規則:iptables -t nat -A POSTROUTING -s 192.168.80.0/24 -o eth0 -j SNAT --to-source 192.168.50.128
6.驗證:ping 8.8.8.8可以ping通,但是ping百度不同,需要配置DNS

DNAT實驗步驟
在網關服務器的iptables的nat表中加一條規則:iptables -t nat -A PREROUTING -d 192.168.50.128 -p tcp -m tcp --dport 8080 -j DNAT --to-destination 192.168.80.129:80

一對一映射:
ifconfig eth0:1 192.168.50.200/24

iptables -t nat -A POSTROUTING -o eth0 -s 192.168.80.129 -j SNAT --to-source 192.168.50.200

iptables -t nat -A PREROUTING -d 192.168.50.200 -j DNAT --to-destination 192.168.80.129

在宿主機中開啓KVM的IP轉發功能。編輯/etc/sysctl.conf文件,把其中的net.ipv4.ip_forward = 0修爲net.ipv4.ip_forward = 1 或者使用如下命令:echo 1 > /proc/sys/net/ipv4/ip_forward
/etc/stsctl.conf文件修該完畢後,我們要使用sysctl -p使其生效

以上配置完畢後,我們還要開啓KVM服務器的iptables的轉發功能,使用如下命令:
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

爲VM配置iptables端口轉發
iptables -t nat -A PREROUTING -d 192.168.50.150 -p tcp -m tcp --dport 8022 -j DNAT --to-destination 192.168.122.150:22
iptables -t nat -A POSTROUTING -s 192.168.122.0/255.255.255.0 -d 192.168.122.150 -p tcp -m tcp --dport 22 -j SNAT --to-source 192.168.122.1

第一條規則是把所有訪問192.168.50.150:8022的請求轉發到192.168.122.150:22的端口上。
第二條規則是把所有來自192.168.122.0/255.255.255.0網段訪問192.168.122.150:22的數據全部通過192.168.122.1這個網關轉發出去。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章