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
浙公网安备 33010602011771号