iptables

标签: linux


笔者Q:972581034 交流群:605799367。有任何疑问可与笔者或加群交流

开源的基于数据包过滤的防火墙工具。
可以做NAT映射:

  • 网关
  • 局域网共享上网
  • IP或端口映射。

Iptables主要工作在OSI七层的二、三四层,如果重新编译内核,
Iptables也可以支持7层控制(squid代理+iptables)。

Iptables企业应用场景

1、主机防火墙(filter表的INPUT链)。
2、局域网共享上网(nat表的POSTROUTING链)。半个路由器,NAT功能。
3、端口及IP(一对一)映射(nat表的PREROUTING链),硬防的NAT功能。

【商用防火墙】
华为
深信服
思科
H3C
Juniper
天融信
飞塔
网康
绿盟科技
金盾

Iptables工作流程
iptables是采用数据包过滤机制工作的,所以它会对请求的数据包的包头数据进行分析,并根据我们预先设定的规则进行匹配来决定是否可以进入主机。

iptables工作流程小结:

  • 防火墙是一层层过滤的。实际是按照配置规则的顺序从上到下,从前到后进行过滤的。
  • 如果匹配上了规则,即明确表明是阻止还是通过,此时数据包就不在向下匹配新规则了。
  • 如果所有规则中没有明确表明是阻止还是通过这个数据包,也就是没有匹配上规则,向下进行匹配,直到匹配默认规则得到明确的阻止还是通过。
  • 防火墙的默认规则是对应链的所有的规则执行完以后才会执行的(最后执行的规则)。

iptables表(tables)和链(chains)

iptables>4个表(tables)=>5个链=(chains)==>规则(policy)

iptales 工作流程以及规则过滤顺序

一层一层过滤,从上到下,从前到后
如匹配上规则,数据包不向下匹配
如没匹配上,继续向下进行匹配
若所有对应链都没匹配上,则匹配默认规则



4个表5个链
表:
filter、nat、mangle。。。后面两个几乎不用
链:INPUT     OUTPUT     FORWARD     PREROUTING    PSOTROUTING
###  filter:  
	1.INPUT 
		负责过滤进入主机的数据包。
	2.OUTPUT 
		处理从主机发出去的包。
	3.FORWARD
		负责流经主机的数据包,起转发作用,和nat关系很大。
### nat:
	1.OUTPUT
		和主机发出去的数据包相关,改变主机发出数据包的目标地址。
	2.PREROUTING
		在数据包到达防火墙时进行路由判断之前的执行规则,改变数据包的目的地址、目的端口等。
		应用:作局域网一对一映射,通过iptables防火墙映射IP到内部服务器,ftp服务。
	3.POSTROUTING
		在数据包离开防火墙时进行路由判断之后执行的规则,改变数据包的源地址、源端口。
		应用:局域网共享上网

命令:

iptables [-t table] -A chain rule-specification
iptables [-t table] -I chain [rulenum] rule-specification
iptables [-t table] -D chain rulenum   #<==根据规则号删除。
iptables [-t table] -D chain rule-specification

注释:

-t 指定表(default: 'filter')
-A  #<==把规则添加到指定的链上,默认添加到最后一行。
-I  #<==插入规则,默认插入到第一行。
-D  #<==删除链上的规则

根据规则号删除:

iptables -D INPUT 4 #<==4是规则号。

-F #<==清除一个链或所有链上的规则
-Z #<==链的记数器清零
-X #<==删除用户自定义的链。

封22端口:

iptables -t filter -A INPUT -p tcp --dport 22 -j DROP
规则注释:
-p       #<==指定过滤的协议-p(tcp,udp,icmp,all)
--dport  #<==指定目标端口(用户请求的端口)。
-j       #<==对规则的具体处理方法(ACCEPT,DROP,REJECT,SNAT/DNAT)
--sport	 #<==指定源端口。

禁止10.0.0.253访问

iptables -I INPUT -p tcp -s 10.0.0.253 -i eth0 -j DROP
iptables -A INPUT -p tcp ! -s 10.0.0.2 -i eth0 -j DROP
-s       #<==指定源地址。 ! 取反。
-d       #<==指定目的地址。
-i       #<==进入的网络接口(eth0,eth1)。
-o       #<==出去的网络接口(eth0,eth1)。

查看加载的模块

[root@lb01 ~]# lsmod |egrep "nat|filter"
iptable_filter          2793  1 
ip_tables              17831  1 iptable_filter

加载如下模块到linux内核,都是和iptables相关的

modprobe ip_tables
modprobe iptable_filter
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ipt_state
[root@lb01 ~]# lsmod |egrep "nat|filter"
nf_nat_ftp              3443  0 
nf_conntrack_ftp       12049  1 nf_nat_ftp
iptable_nat             5923  0 
nf_nat                 22676  2 nf_nat_ftp,iptable_nat
nf_conntrack_ipv4       9186  5 iptable_nat,nf_nat
nf_conntrack           79537  6 nf_nat_ftp,nf_conntrack_ftp,iptable_nat,nf_nat,nf_conntrack_ipv4,xt_state
iptable_filter          2793  1 
ip_tables              17831  2 iptable_nat,iptable_filter

清空规则

[root@lb01 ~]# iptables -F
[root@lb01 ~]# iptables -nL   #现在规则全部清空,仅留下默认规则:ACCEPT
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination  

iptables命令

iptables -n    #数字
iptables -L    #列表
iptables -F    #清除所有规则,不会处理默认的规则
iptables -X    #删除用户自定义的链
iptables -Z    #链的记数器清零

禁止22端口通过

[root@lb01 ~]# ss -lntup|grep ssh
tcp    LISTEN     0      128                   :::22                   :::*      users:(("sshd",1200,4))
tcp    LISTEN     0      128                    *:22                    *:*      users:(("sshd",1200,3))
[root@lb01 ~]# iptables -t filter -A INPUT -p tcp --dport 22 -j DROP
-t           #指定表filter,默认即为filer,可不加
-A           #指定链INPUT
-p tcp       #指定协议(ssh是tcp协议)
--dport 22   #防护22号目的端口
-j(jump)     #指定行为(ACCEPT——接受、DROP——丢弃、REJECT——拒绝:会留下拒绝信息)
DROP         #丢弃
iptables -nL --line-number  #显示序号
iptables -D INPUT 1         #指定链,指定序号删除

禁止网段连入

禁止10.0.0.0段的ip连接

[root@lb01 ~]# iptables -F
[root@lb01 ~]# iptables -A INPUT -s 10.0.0.0/24 -j DROP

禁止除10.0.0.0/24网段以外,都不能连接

[root@lb01 ~]# iptables -A INPUT ! -s 10.0.0.0/24 -j DROP

匹配单一端口

iptables -A INPUT -p tcp --sport 53
iptables -A INPUT -p udp --dport 53

指定范围端口

[root@lb01 ~]# iptables -I INPUT -p tcp --dport 20:100 -j DROP

封掉3306端口

iptables -A INPUT -p tcp --dport 3306 -j DROP

匹配指定的协议

iptables -A INPUT -p tcp
iptables -A INPUT -p udp  #如果不指定-p,默认就是-p (all,tcp,udp,icmp)。默认all。

匹配指定协议外的所有协议

iptables -A INPUT -p ! tcp
iptables -I INPUT ! -p tcp -s 10.0.0.123 -j DROP

匹配指定端口之外的端口

iptables -A INPUT -p tcp --dport ! 22
iptables -I INPUT -p tcp ! --dport 22 -s 10.0.0.123 -j DROP

匹配端口范围:

iptables -I INPUT -p tcp -m multiport --dport 21,22,23,24 -j DROP
iptables -I INPUT -p tcp --dport 3306:8809 -j ACCEPT
iptables -I INPUT -p tcp --dport 18:80 -j DROP  #<==最佳

匹配ICMP类型

iptables -A INPUT -p icmp --icmp-type 8
例:iptables -A INPUT -p icmp --icmp-type 8 -j DROP
iptables -A INPUT -p icmp -m icmp --icmp-type any -j ACCEPT
iptables -A FORWARD -s 192.168.1.0/24 -p icmp -m icmp --icmp-type any -j ACCEPT

匹配网络状态

-m state --state

  • NEW:已经或将启动新的连接
  • ESTABLISHED:已建立的连接
  • RELATED:正在启动的新连接
  • INVALID:非法或无法识别的

允许关联的状态包 ftp协议

iptables -A INPUT  -m state --state ESTABLISHED,RELATED -j ACCEPT

限制指定时间包的允许通过数量及并发数

-m limit --limit n/{second/minute/hour}:   #指定时间内的请求速率"n"为速率,后面为时间分别为:秒、分、时
iptables -I INPUT -p icmp --icmp-type 8 -m limit --limit 6/min -j DROP

局域网共享的两条命令方法:

  • 1:适合于有固定外网地址的:
iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -o eth0 -j SNAT --to-source 10.0.0.8
(1)-s 172.16.1.0/24 #办公室或IDC内网网段。
(2)-o eth0 #为网关的外网卡接口。
(3)-j SNAT --to-source 10.0.0.8 #是网关外网卡IP地址。
#以上命令说简单点就是指定表nat,在POSTROUTING路由后,把源端口,-o指定网卡,
  • 2:适合变化外网地址(ADSL):
iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j MASQUERADE ç伪装。

端口IP映射

当访问10.0.0.8的9000端口时,映射到172.16.1.51的22号端口
当外网IP有限,内网服务器很多的时候可以这样使用

iptables -t nat -A PREROUTING -d 10.0.0.8 -p tcp --dport 9000 -j DNAT --to-destination 172.16.1.51:22

映射多个外网IP上网

iptables -t nat -A POSTROUTING -s 10.0.1.0/255.255.240.0 -o eth0 -j SNAT --to-source 124.42.60.11-124.42.60.16
iptables -t nat -A POSTROUTING -s 10.0.1.0/255.255.255.0 -o eth0 -j SNAT --to-source 124.42.60.11
iptables -t nat -A POSTROUTING -s 10.0.2.0/255.255.255.0 -o eth0 -j SNAT --to-source 124.42.60.12

部署一个最安全的企业级防火墙

iptables -F    #清空默认规则
iptables -X    #删除用户自定义的链。
iptables -Z    #链的记数器清零
iptables -A INPUT -s 10.0.0.0/24 -j ACCEPT   #先使自的主机能通过

iptables -A INPUT -p tcp --dport 22 -j ACCEPT  #22号端口能通过
iptables -P INPUT DROP   #修改默认的INPUT链规则为拒绝
iptables -P FORWARD DROP #修改默认的FORWARD链为拒绝
iptables -P OUTPUT ACCEPT #修改默认的OUTPUT链为拒绝

[root@web02 ~]# iptables -nL #查看修改后的结果
Chain INPUT (policy DROP)
target     prot opt source               destination         
ACCEPT     all  --  10.0.0.0/24          0.0.0.0/0           
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:22 

Chain FORWARD (policy DROP)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination


iptables -A INPUT -p tcp -m multiport --dport 80,443 -j ACCEPT #设置80,443端口通过
iptables -A INPUT -s 172.16.1.0/24 -j ACCEPT #设置内网地址通过
iptables -A INPUT -i lo -j ACCEPT  #设置本机地址通过
iptables -A INPUT  -m state --state ESTABLISHED,RELATED -j ACCEPT #设置

#永久生效:
/etc/init.d/iptables save
cat /etc/sysconfig/iptables

面试题:

内核优化

net.nf_conntrack_max = 25000000
net.netfilter.nf_conntrack_max = 25000000
net.netfilter.nf_conntrack_tcp_timeout_established = 180
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120