赞
踩
目录
iptables
是一个配置Linux
内核防火墙的命令行工具,它基于内核的netfilter
机制。新版本的内核(3.13+)也提供了nftables
,用于取代iptables
。
netfilter
是Linux
内核的包过滤框架,它提供了一系列的钩子(Hook
)供其他模块控制包的流动。这些钩子包括
NF_IP_PRE_ROUTING
:刚刚通过数据链路层解包进入网络层的数据包通过此钩子,它在路由之前处理NF_IP_LOCAL_IN
:经过路由查找后,送往本机(目的地址在本地)的包会通过此钩子NF_IP_FORWARD
:不是本地产生的并且目的地不是本地的包(即转发的包)会通过此钩子NF_IP_LOCAL_OUT
:所有本地生成的发往其他机器的包会通过该钩子NF_IP_POST_ROUTING
:在包就要离开本机之前会通过该钩子,它在路由之后处理
iptables
通过表和链来组织数据包的过滤规则,每条规则都包括匹配和动作两部分。默认情况下,每张表包括一些默认链,用户也可以添加自定义的链,这些链都是顺序排列的。这些表和链包括:
raw表
用于决定数据包是否被状态跟踪机制处理,内建PREROUTING
和OUTPUT
两个链filter表
用于过滤,内建INPUT
(目的地是本地的包)、FORWARD
(不是本地产生的并且目的地不是本地)和OUTPUT
(本地生成的包)等三个链nat表
用于网络地址转换,内建PREROUTING
(在包刚刚到达防火墙时改变它的目的地址)、INPUT
、OUTPUT
和POSTROUTING
(要离开防火墙之前改变其源地址)等链mangle表
用于对报文进行修改,内建PREROUTING
、INPUT
、FORWARD
、OUTPUT
和POSTROUTING
等链security表
用于根据安全策略处理数据包,内建INPUT
、FORWARD
和OUTPUT
链Tables↓/Chains→ | PREROUTING | INPUT | FORWARD | OUTPUT | POSTROUTING |
---|---|---|---|---|---|
(routing decision) | ✓ | ||||
raw | ✓ | ✓ | |||
(connection tracking enabled) | ✓ | ✓ | |||
mangle | ✓ | ✓ | ✓ | ✓ | ✓ |
nat (DNAT) | ✓ | ✓ | |||
(routing decision) | ✓ | ✓ | |||
filter | ✓ | ✓ | ✓ | ||
security | ✓ | ✓ | ✓ | ||
nat (SNAT) | ✓ | ✓ |
所有链默认都是没有任何规则的,用户可以按需要添加规则。每条规则都包括匹配和动作两部分:
IP
、数据包类型等。匹配还可以包括模块(如conntrack
、recent
等),实现更复杂的过滤。-j
指定,如ACCEPT
、DROP
、RETURN
、SNAT
、DNAT
等这样,网络数据包通过iptables的过程为
其规律为
PREROUTING
链,在PREROUTING
链中我们有机会修改数据包的DestIP
(目的IP),然后内核的"路由模块"根据"数据包目的IP"以及"内核中的路由表" 判断是否需要转送出去(注意,这个时候数据包的DestIP
有可能已经被我们修改过了)INPUT
链。数据包到达INPUT
链后,任何进程都会收到它OUTPUT
链,然后到达POSTROTING
链输出(注意,这个时候数据包的SrcIP
有可能已经被我们修改过了)FORWARD
链,然后到达POSTROUTING
链输出(选择对应子网的网口发送出去)iptables -nvL
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -s 192.168.0.4 -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
- iptables -P INPUT DROP
- iptables -P FORWARD DROP
iptables -t nat -I POSTROUTING -s 10.0.0.30/32 -j MASQUERADE
- iptables -I FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
- iptables -I INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
- iptables -t nat -I OUTPUT -d 55.55.55.55/32 -j DNAT --to-destination 10.0.0.30
- iptables -t nat -I PREROUTING -d 55.55.55.55/32 -j DNAT --to-destination 10.0.0.30
- iptables -t nat -I POSTROUTING -s 10.0.0.30/32 -j SNAT --to-source 55.55.55.55
- iptables -t nat -I OUTPUT -d 55.55.55.55/32 -p tcp -m tcp --dport 80 -j DNAT --to-destination 10.10.10.3:80
- iptables -t nat -I POSTROUTING -m conntrack ! --ctstate DNAT -j ACCEPT
- iptables -t nat -I PREROUTING -d 55.55.55.55/32 -p tcp -m tcp --dport 80 -j DNAT --to-destination 10.10.10.3:80
- iptables -F
- iptables -t nat -F
- iptables -t mangle -F
- iptables -X
nftables
是从内核 3.13 版本引入的新的数据包过滤框架,旨在替代现用的 iptables
框架。nftables
引入了一个新的命令行工具nft
,取代了之前的iptables
、ip6iptables
、ebtables
等各种工具。
跟iptables
相比,nftables
带来了一系列的好处
IPv4/IPv6
双栈管理set/map
等跟iptables
类似,nftables
也是使用表和链来管理规则。其中,表包括ip
、arp
、ip6
、bridge
、inet
和netdev
等6个类型。下面是一些简单的例子。
- # 新建一个ip类型的表
- nft add table ip foo
-
- # 列出所有表
- nft list tables
-
- # 删除表
- nft delete table ip foo
-
- # 添加链
- nft add table ip filter
- nft add chain ip filter input { type filter hook input priority 0 \; }
- nft add chain ip filter output { type filter hook output priority 0 \; }
-
- # 添加规则
- nft add rule filter output ip daddr 8.8.8.8 counter
- nft add rule filter output tcp dport ssh counter
- nft insert rule filter output ip daddr 192.168.1.1 counter
-
- # 列出规则
- nft list table filter
-
- # 删除规则
- nft list table filter -a # 查询handle是多少
- nft delete rule filter output handle 5
-
- # 删除链中所有规则
- nft delete rule filter output
-
- # 删除表中所有规则
- nft flush table filter
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。