iptables詳解

  netfilter(iptables)

netfilter --工做在內核軟件,實現數據包的過濾。
iptables --工做應用層一個軟件,用來控制netfilter。

1.netfilter/iptables包過濾防火牆(tcp/ip四層)

1)應用層 --經過軟件爲用戶提供接口
2)傳輸層 --提供可靠或不可靠的數據傳輸(TCP/UDP)使用端口來標示服務類型 sport dport
3)網絡層 --提供路由和選址(icmp) sip dip
4)數據鏈路層 --傳輸數據幀(MAC) s_mac
5)物理層 --傳輸透明比特流
過濾的依據: s_mac/sip/dip/sport/dport/狀態(三次握手/四次斷開)

netfilter的邏輯架構:web

  ------------------------
netfilter防火牆的元素及關係:
netfilter==>表==>鏈==>規則

------------------------


三張表:
filter 防火牆表,容許和拒絕都在這裏實現
nat 地址轉換
mangle 數據包整形
五條鏈:
INPUT 本機進站的數據流
OUTPUT 本機出站的數據流
FORWARD 路由的數據流
POSTROUTING 路由後的數據流
PREROUTING 路由前的數據流
--------------------
表跟鏈的對應關係:
filter:INPUT,OUTPUT,FORWARD
nat: OUTPUT,PREROUTING,POSTROUTING
mangle:INPUT,OUTPUT,FORWARD,PREROUTING,POSTROUTING

------------
四種數據流:
本機進站的數據流:packet-->ethX-->PREROUTING-->INPUT-->本機
本機出站的數據流:packet-->OUTPUT-->POSTROUTING-->ethX-->destination
路由的數據流:
出去: packet-->eth0-->PREROUTING-->FORWARD-->POSTROUTING-->eth1--destination
回來: packet-->eth1-->PREROUTING-->FORWARD-->POSTROUTING-->eth0--destination

本機訪問本機: 本機-->packet-->lo-->PREROUTING-->INPUT-->本機
本機-->packet-->OUTPUT-->POSTROUTING--lo-->本機
--------------------
表的匹配順序:
mangle-->nat-->filter
-----------------
防火牆規則匹配順序:
1.按順序匹配,若是第一條匹配到了就直接執行這條規則的動做,不往下匹配其它規則.
2.若是第一條匹配不到,第二條也匹配不到,繼續往下匹配直到找到匹配的規則,若是找不到匹配默認規則.
--------------------
iptables操做命令:
#iptables --help
Usage: iptables -[AD] chain rule-specification [options]
iptables -[RI] chain rulenum rule-specification [options]
iptables -D chain rulenum [options]
iptables -[LFZ] [chain] [options]
iptables -[NX] chain
iptables -E old-chain-name new-chain-name
iptables -P chain target [options]
iptables -h (print this help information)

--append -A chain 追加規則
--delete -D chain 刪除規則
--delete -D chain rulenum 刪除指定序號的規則

--insert -I chain [rulenum] 插入一條規則(default 1=first)
--replace -R chain rulenum 替換一條規則

--list -L [chain] 顯示出鏈或者鏈中的規則
--flush -F [chain] 在一個鏈或者全部鏈中清空規則
--zero -Z [chain] 清空計數
--new -N chain 建立用戶自定義鏈
--delete-chain
-X [chain] 刪除用戶自定義鏈
--policy -P chain target 指定默認規則
Change policy on chain to target
--rename-chain
-E old-chain new-chain
重命名用戶自定義鏈
Options:
--proto -p [!] proto 指定協議,!表明取反
--source -s [!] address[/mask] --指定源地址
source specification
--destination -d [!] address[/mask] --指定目標地址
destination specification
--in-interface -i [!] input name[+] --指定數據從哪一個網口進來
network interface name ([+] for wildcard)
--jump -j target --匹配動做
target for rule (may load target extension)
--goto -g chain
jump to chain with no return
--match -m match --擴展匹配
extended match (may load extension)
--numeric -n --端口和IP以數值方式顯示,不做反解
--out-interface -o [!] output name[+] --指定數據從哪一個網口出去
network interface name ([+] for wildcard)
--table -t table --指定使用哪一個表 (default: `filter')
--verbose -v --顯示詳細信息
--line-numbers --顯示規則的序號
--exact -x expand numbers (display exact values)


傳輸層:協議(tcp/udp)
端口(sport/dport)
網絡層:
IP地址(sip/dip/icmp)
數據鏈路層:
mac地址(--mac-source)
物理層:
從哪一個網卡進來 -i
從哪一個網卡出去 -o
---------------

查看:
# iptables -t nat -L -n -v --line
# iptables -t filter -L -n
# iptables -t filter -L INPUT
# iptables -t filter -L INPUT -v -n
# iptables -t filter -L INPUT -n -v --line
# watch -n 0.1 iptables -L INPUT --line -n -v


追加規則:
# iptables -t filter -A INPUT -i lo -j ACCEPT

插入規則:
# iptables -t filter -I INPUT -i eth0 -j ACCEPT --插入成爲第一條
# iptables -t filter -I INPUT 3 -i eth0 -j ACCEPT --插入成爲第三條規則

替換規則:
# iptables -t filter -R INPUT 3 -i eth1 -j ACCEPT --替換成爲指定規則

刪除規則:
# iptables -t filter -D INPUT 2 --刪除指定鏈指定編號的規則

+++++++++++
#iptables -t filter -A INPUT -i lo -j ACCEPT
#iptables -t filter -A OUTPUT -o lo -j ACCEPT
#iptables -t filter -A INPUT -i eth0 -s 192.168.0.0/24 -d 192.168.0.250 -j ACCEPT
# iptables -t filter -A INPUT -i eth1 -j ACCEPT
# iptables -L INPUT -n --line -v
# iptables -t filer -I INPUT 2 -i eth2 -j ACCEPT 插入默認第二條
# iptables -t filter -I INPUT -i eth3 -j ACCEPT 插入默認第一條
# iptables -t filter -R INPUT 1 -i eth4 -j ACCEPT 替換默認第一條
#iptables -t filter -D INPUT 1 刪除默認第一條
# iptables -t filter -F INPUT 清空filter全部INPUT鏈
#iptables -t filter -F

#iptables -L INPUT -n --line -v


+++++++++++++++++++
清空規則:
一、清空一張表
# iptables -t filter -F

二、清空一條鏈中的規則
# iptables -t filter -F INPUT

新建/刪除用戶自定義的鏈:
# iptables -t filter -N uplooking 新建
# iptables -t filter -X uplooking 刪除
# iptables -t filter -X 清空filter表中全部用戶自定義鏈
+++++++++
iptables -t filter -N TCP
iptables -t filter -N UDP
iptables -t filter -A INPUT -i lo -j ACCEPT
iptables -t filter -A INPUT -p tcp -j TCP
++++++++
更改默認規則:
# iptables -t filter -P INPUT ACCEPT
# iptables -t filter -P INPUT DROP





實例應用一(本機的訪問控制):
拒絕全部:容許本機能訪問全部服務,容許訪問DNS,postfix,dovecot,vsftpd,telnet,web,

iptables -t filter -P INPUT DROP
iptables -t filter -P OUTPUT DROP
1.容許本機訪問本機的全部服務:
[root@mail ~]# iptables -t filter -A INPUT -i lo -j ACCEPT
[root@mail ~]# iptables -t filter -A OUTPUT -o lo -j ACCEPT
+++++++++
iptables -t filter -A INPUT -p tcp -dport 5902 -i br0 -s 192.168.0.45 -j ACCEPT
iptables -t filter -A OUTPUT -o br0 -p tcp --sport 5902 -d 192.168.0.45 -j ACCEPT
iptables -L -n -v --line
iptables -t filter -A INPUT -i br0 -p tcp --dport 5900:5902 -s 192.168.0.0/24 -j ACCEPT
iptables -t filter -A OUTPUT -o br0 -p tcp --sport 5900:5902 -d 192.168.0.0/24 -j ACCEPT
++++++++++++++

2.容許指定客戶機訪問個人80端口
[root@mail ~]# iptables -t filter -A INPUT -i eth0 -p tcp --dport 80 -s 10.1.1.111 -j ACCEPT
[root@mail ~]# iptables -t filter -A OUTPUT -o eth0 -p tcp --sport 80 -d 10.1.1.111 -j ACCEPT

[root@mail ~]# iptables -t filter -A INPUT -i eth0 -p tcp --dport 80 -s 10.1.1.0/24 -j ACCEPT
[root@mail ~]# iptables -t filter -A OUTPUT -o eth0 -p tcp --sport 80 -d 10.1.1.0/24 -j ACCEPT


[root@mail ~]# iptables -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT
[root@mail ~]# iptables -A OUTPUT -o eth0 -p tcp --sport 22 -j ACCEPT

# iptables -t filter -R INPUT 2 -p tcp -m multiport --dport 20:21,80,443,5900 -j ACCEPT
# iptables -t filter -R OUTPUT 2 -p tcp -m multiport --sport 20:21,80,443,5900 -j ACCEPT


[root@mail ~]# service iptables save --防火規則立刻寫立刻生效,但重啓機器或者重iptables服務,規則丟失.
將當前規則保存到 /etc/sysconfig/iptables: [肯定]

從非默認位置恢復規則:
# iptables-save > /tmp/iptables.save
# iptables-restore < /tmp/iptables.save


icmp:
[root@mail ~]# iptables -t filter -i eth0 -A INPUT -p icmp -j ACCEPT
[root@mail ~]# iptables -t filter -o eth0 -A OUTPUT -p icmp -j ACCEPT

===========================================================================================================================================vim

iptables應用示例:服務器

  一、容許ping 127.0.0.1 和 容許 ping 10.1.1.0/24 ,其餘服務都禁止

# iptables -A INPUT -p icmp -i lo -j ACCEPT
# iptables -A INPUT -p icmp -s 10.1.1.0/255.255.255.0 -j ACCEPT
# iptables -A INPUT -j DROP

或者
# iptables -P INPUT DROP 《--定義默認策略,當在規則表裏找不到匹配的規則就採起策略的動做
# iptables -A INPUT -p icmp -i lo -j ACCEPT
# iptables -A INPUT -p icmp -s 10.1.1.0/255.255.255.0 -j ACCEPT



二、只運訪問本機的SSH服務(只容許遠程ssh登陸到本機)

# iptables -P INPUT DROP
# iptables -A INPUT -p tcp --dport 22 -j ACCEPT <---定義端口的參數 --dport
還有就是
定義源端口 --source-port --sport
定義目的端口 --destination-port --dport

三、定義連續端口
iptables -A INPUT -p tcp --dport 20:100 -j ACCEPT <---容許訪問 20到100的端口


四、定義多端口 <---引入一個「模塊」的概念
iptables -A INPUT -m multiport -p tcp --dports 22,80,110 -j ACCEPT
-m 指定模塊
multiport 支持多端口的擴展模塊

五、容許和內網的客戶(10.1.1.0/24)進行傳輸數據(包括ping)
iptables -P INPUT DROP
iptables -A INPUT -p ALL -i eth0 -s 10.1.1.0/24 -j ACCEPT

六、決絕訪問色情網站www.baidu.com
iptables -A OUTPUT -d www.baidu.com -j DROP

七、經過硬件地址進行過濾
-m mac --mac-source [!] address
iptables -A INPUT -m mac --mac-source 00:25:86:8E:AF:C8 -p icmp -j REJECT

注意REJECT 和 DROP 區別


八、定義連續的IP地址
iptables -A INPUT -m iprange --src-range 10.1.1.140-10.1.1.254 -j DROP

九、
只想個人電腦成爲SSH 服務器端
# iptables -P INPUT DROP
# iptables -A INPUT -i lo -j ACCEPT
# iptables -A INPUT -p tcp --dport 22 -s 10.1.1.0/24 -j ACCEPT

成爲ssh服務器端的同時成爲ssh客戶端,讓你能遠程登陸到別的電腦

# iptables -P INPUT DROP
# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# iptables -A INPUT -p tcp --dport 22 -s 10.1.1.0/24 -j ACCEPT

數據包的四種狀態
NEW 想要創建鏈接的數據包,也就是第一個數據包
INVALID 無效的數據包,例如:損壞的數據報或者不完整的數據包
ESTABLISHED 數據包是完整有效的,已經創建鏈接的。通信的兩端已經有數據來往過的。
RELATED 與已經發送的數據包相關的數據包。

NEW(相似TCP的syn) [NEW,INVALID無效態] ESTABLISHED (鏈接態) RELATED(衍生態,關聯)[ ESTABLISHED,RELATED]


ssh 10.1.1.141 ---> NEW (創建鏈接的請求的數據包) ----OUTPUT---> 10.1.1.141
10.1.1.141 ---> ACK 迴應 本機,這時候迴應的數據包就屬於 ESTABLISHED ,迴應的數據包走的INPUT鏈的,根據規則,容許經過。 那麼之後在這個創建的鏈接的基礎上產生的數據包就屬於RELATED,根據規則也容許經過。

iptables 引入數據包的狀態的目的是爲了提升iptables的處理效率,只要匹配一次,之後的數據包就能夠再也不與規則進行屢次的匹配。


十一、對外只開放web服務,其餘一切不放行,不容許進來也不容許出去
# iptables -P OUTPUT DROP
# iptables -P INPUT DROP
# iptables -A INPUT -p tcp --dport 80 -j ACCEPT <--tcpdump tcp port 80 只看到進來的,沒有出去的
# iptables -A OUTPUT -p tcp --sport 80 -m state --state ESTABLISHED,RELATED -j ACCEPT



十二、開放工做在主動模式下的ftp服務
# iptables -P INPUT DROP
# iptables -P OUTPUT ACCEPT
# iptables -A INPUT -p tcp --dport 21 -j ACCEPT
# iptables -A INPUT -p tcp --dport 20 -j ACCEPT



1三、開放工做在被動模式下的ftp服務

ftp 兩種模式:
主動模式:傳輸數據20端口 ,ftp服務器主動去鏈接客戶端
被動模式:傳輸數據>1024端口,客戶端主動去鏈接服務器

# modprobe ip_conntrack_ftp

# iptables -P INPUT DROP
# iptables -P OUTPUT ACCEPT
# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# iptables -A INPUT -p tcp --dport 21 -j ACCEPT
# iptables -A INPUT -i lo -j ACCEPT

假如ftp服務器監聽的端口不僅是21而是還有別的:
# modprobe ip_conntrack_ftp ports=21,2021

# iptables -P INPUT DROP
# iptables -P OUTPUT ACCEPT
# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# iptables -A INPUT -p tcp --dport 21 -j ACCEPT
# iptables -A INPUT -p tcp --dport 2021 -j ACCEPT
# iptables -A INPUT -i lo -j ACCEPT








1四、綜合應用:
本機須要開放的服務有: ssh(22) 、 web(80) 、 ftp(21 20) 、 DNS(53) 、pop3(110)、pop3s(995)、IMAP(143)、IMAPS(993)、smtp(25)等服務。
其中web 、ftp、pop三、pop3s、IMAP、IMAPS 容許全部網絡的人訪問;
ssh 只容許本地局域網中的某個MAC地址訪問
只容許本地局域網的用戶發送郵件
只容許本地局域網的用戶查詢DNS


# modprobe ip_conntrack_ftp
# iptables -P INPUT DROP
# iptables -P OUTPUT DROP
# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# iptables -A INPUT -i lo -j ACCEPT
# iptables -A INPUT -p tcp -m multiport --destination-ports 20,21,80,110,143,993,995 -j ACCEPT
# iptables -A INPUT -m mac --mac-source 00:25:86:8E:AF:C8 -p tcp -s 10.1.1.0/24 --dport 22 -j ACCEPT
# iptables -A INPUT -p tcp --dport 25 -s 10.1.1.0/24 -j ACCEPT
# iptables -A INPUT -p tcp --dport 53 -s 10.1.1.0/24 -j ACCEPT
# iptables -A INPUT -p udp --dport 53 -s 10.1.1.0/24 -j ACCEPT


service iptables save

==================================================================

SNAT

SNAT:(1)-j SNAT 源地址轉換,靜態 IP
(2)-j MASQUERADE 源地址轉換,動態 IP



[內網] (172.16.196.129) 【eth0】<---host-only-----> 【eth0】(172.16.196.1) 【eth1】 [外網](192.168.2.138)
【LAN】(客服端) [SNAT] ( 服務端)

服務器配置(實現軟路由那臺機器,須要兩張網卡)

一、打開路由轉發
echo "1" > /proc/sys/net/ipv4/ip_forward

開機生效:
# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
# sysctl -p

# sysctl -a | grep ip_forward

二、配置Iptables
iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source 192.168.2.138 《--把全部的協議數據都映射出去外部網絡


內網客戶端的配置:

一、配置網關
# route add default gw 172.16.196.1

二、配置DNS
# vim /etc/resolv.conf
nameserver 210.21.196.6

================================

host-only (內網) | 外網(互聯網)
[vm1-slave] eth0 <---> eth0 [vm2-master] eth1 <------> eth0 [真實機]
172.16.196.129 172.16.196.128 10.1.1.21 10.1.1.20

服務器(vm2-master)的配置:

一、打開路由轉發

二、配置Iptables
iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source 10.1.1.21

iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source -j MASQUERADE


客戶端的配置(vm1-slave):
一、配置網關
# route add default gw 172.16.196.128

二、配置DNS
# vim /etc/resolv.conf
nameserver 202.96.128.86



===============================================
DNAT


外網 內網

[vm1-slave] -------------------> eth0 [vm2-master] eth1 <--------------------> 10.1.1.20 eth0 [真實機器Web]
172.16.196.129 (172.16.196.128Router DNAT 10.1.1.21)


192.168.100.2 192.168.100.1 10.1.1.21 10.1.1.20
http://172.16.196.128/

Router的配置(vm2-master)

一、打開路由轉發
echo "1" > /proc/sys/net/ipv4/ip_forward

開機生效:
# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
# sysctl -p

# sysctl -a | grep ip_forward

二、配置Iptables ,實現目的地址映射 DNAT

# iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -d 172.16.196.128 -j DNAT --to 10.1.1.20


內網的Web服務器的配置:

一、配默認網關

# route add default gw 10.1.1.21
# route del -net 172.16.196.0 netmask 255.255.255.0 dev vmnet1 <---額外的步驟,因爲虛擬機自動添加了一個路由條目

外網的[vm1-slave] 做爲測試主機,須要訪問 http://172.16.196.128/
一、配默認網關

# route add default gw 172.16.196.128


注意真機的默認網關10.1.1.20

#route add default gw 10.1.1.21網絡

相關文章
相關標籤/搜索