admin管理员组

文章数量:1635850

文章目录

    • 1. 路由器与防火墙
    • 2. iptables规则链
    • 3. iptabnles命令与参数
      • 3.1. iptables -t filter -L 看filter表内内容
      • 3.2. 数据包常见的控制类型
      • 3.3. 添加一条规则
      • 3.4. iptables -F 清空规则
      • 3.5. 限制源或目标的IP
        • 3.5.1 限制源IP
        • 3.5.2 限制目标IP
      • 3.6. 查看表格详细信息
      • 3.7. 追加新的规则
        • 3.7.1 在链的第一行前追加一条规则
        • 3.7.2 在链的最后一行追加一条规则
      • 3.8. 删除表格的数据
        • 3.8.1 -D 删除指定规则
        • 3.8.2 -F 清空表内规则
      • 3.9. 修改链的默认规则
      • 3.10. 其他参数
      • 3.11. 参数总结
    • 4. 隐示匹配
      • 4.1. 端口匹配
        • 4.1.1 --dport源端口匹配
        • 4.1.2 --sport目标端口匹配
      • 4.2. 限制TCP三次握手 = --tcp-flags
    • 5. 显示匹配
      • 5.1. 多端口匹配
      • 5.2. 限制ip范围匹配
      • 5.3. MAC地址匹配
      • 5.4.三次握手状态匹配
    • 6. SNAT与DNAT
      • 6.1. 原理
        • 6.1.1 第一种:SNAT
        • 6.1.2 第二种:DNAT
      • 6.2. 实验模拟
        • 6.2.1 SNAT
        • 6.2.2 抓包
        • 6.2.3 DNAT

1. 路由器与防火墙

网关也是linux操作系统,所以,网关也有内核。

假设网关有两块网卡,A和B。

数据包要发给网关,要从A口进。如果数据包的目标IP地址为网关IP。那么网关就会认为数据包是找自己的,与是通过的就是入站(input)和出站(output)。然后数据包会通过B口出去。(比如,ping网关的时候)

如果数据包的IP地址找的不是自己,那么网关就会将数据包通过转发(forward)通道转发到B口发出去

在网卡A前,还有一条路是出路由前(PREROUTING),在网卡B后,也有一条路叫做出路由后(POSTROUTING)。

2. iptables规则链

这五条路就是在防火墙上被封住的五条路。所以通过防火墙可以限制五条路的任何一条路。

而它们也叫作防火墙的五条规则链。

在ping网关的时候,如果不想让网关对任何机器做回应,只需要堵住入站input或出站output即可。

五条规则链的每个链内都可以设置规则,链内的规则就是限制当前链的。而这五条链,分别都被放在了四张表内。

这四张表分别为:raw,mangle,nat,filter表。常用的表为nat,filter表

3. iptabnles命令与参数

3.1. iptables -t filter -L 看filter表内内容

查看filter表内的所有内容

-t 指定一个表,-L 查看表内容

[root@iptables ~]# iptables -t filter -L
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         
[root@iptables ~]# 

chain = 链

policy ACCEPT = 链的默认规则。如果链内没有设定具体规则,默认就为ACCEPT(允许)。

当前filter表内无任何规则。如果不-f指定一个表格,那么默认查看的就是filter表格

防火墙是不会被关闭的,所谓的stop只是清空了他的规则。

3.2. 数据包常见的控制类型

ACCEPT = 允许通过

DROP = 丢包

REJECT = 拒绝通过,但会给出提示

LOG = 记录日志信息

3.3. 添加一条规则

ping的协议为icmp

当前用windowsping虚拟机是可以ping通的。

如果想让windowsping不通虚拟机。需要在入站或出站做限制

[root@iptables ~]# iptables -t filter -I INPUT -p icmp -j DROP
[root@iptables ~]# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
DROP       icmp --  anywhere             anywhere            

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
[root@iptables ~]# 

-t 指定filter表

-I INPUT 向INPUT链添加一条规则

-p icmp 限定icmp协议

协议有很多种,可以用!来取反。如:! -p icmp

-j DROP 控制类型为丢包

这样一来windows端就ping不通虚拟机了。

3.4. iptables -F 清空规则

iptables -F 清空所有规则

[root@iptables ~]# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
DROP       icmp --  anywhere             anywhere            

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
[root@iptables ~]# iptables -F
[root@iptables ~]# iptables -L
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         
[root@iptables ~]# 

3.5. 限制源或目标的IP

3.5.1 限制源IP
[root@iptables ~]# iptables -t filter -I OUTPUT -p icmp -s 192.168.200.0/24 -j DROP
[root@iptables ~]# iptables -L
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         
DROP       icmp --  192.168.200.0/24     anywhere            
[root@iptables ~]# 

针对filter表格的OUTPUT内添加一条规则,限定icmp协议,针对192.168.200.0/24网段的用户控制类型为丢包

-s 来源为192.168.200.0/24的用户访问为DROP

3.5.2 限制目标IP
[root@iptables ~]# iptables -t filter -I OUTPUT -p icmp -d 192.168.200.2 -j DROP
[root@iptables ~]# iptables -L
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         
DROP       icmp --  anywhere             192.168.200.2       
[root@iptables ~]# 

针对filter表格的OUTPUT内添加一条规则,限定icmp协议,只要是发往192.168.200.1的用户控制类型为丢包

-d 限制出站目标

入站针对来源,出站针对目标

3.6. 查看表格详细信息

[root@iptables ~]# iptables -L -nv
Chain INPUT (policy ACCEPT 6 packets, 432 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 4 packets, 448 bytes)
 pkts bytes target     prot opt in     out     source               destination 
#两者对比差距
[root@iptables ~]# iptables -L
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         
[root@iptables ~]# 

3.7. 追加新的规则

3.7.1 在链的第一行前追加一条规则

iptables -t filter -I OUTPUT -p icmp -d192.168.200.2 -j DROP

3.7.2 在链的最后一行追加一条规则

iptables -t filter -A OUTPUT -p icmp -d192.168.200.3 -j DROP

[root@iptables ~]# iptables -L
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         
DROP       icmp --  anywhere             192.168.200.1       #当前只有一条1
[root@iptables ~]# iptables -t filter -I OUTPUT -p icmp -d192.168.200.2 -j DROP
[root@iptables ~]# iptables -t filter -A OUTPUT -p icmp -d192.168.200.3 -j DROP
[root@iptables ~]# iptables -L
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         
DROP       icmp --  anywhere             192.168.200.2       #加I的在前
DROP       icmp --  anywhere             192.168.200.1       
DROP       icmp --  anywhere             192.168.200.3       #加A的在后
[root@iptables ~]# 

3.8. 删除表格的数据

3.8.1 -D 删除指定规则
[root@iptables ~]# iptables -D OUTPUT 2 #删除OUTPUT第二行的数据
[root@iptables ~]# iptables -L
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         
DROP       icmp --  anywhere             192.168.200.2       
DROP       icmp --  anywhere             192.168.200.3       
[root@iptables ~]# 
3.8.2 -F 清空表内规则
[root@iptables ~]# iptables -L
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         
DROP       icmp --  anywhere             192.168.200.2       
DROP       icmp --  anywhere             192.168.200.3       
[root@iptables ~]# iptables -F
[root@iptables ~]# iptables -L
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         
[root@iptables ~]# 

3.9. 修改链的默认规则

iptables -P FORWARD DROP 将FORWARD链设为丢包

[root@iptables ~]# iptables -P FORWARD DROP
[root@iptables ~]# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy DROP) #源ACCEPT变成为DROP
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
[root@iptables ~]# 

当前状态为所有转发均为丢包。

3.10. 其他参数

-i 限制入站网卡

-o 限制出站网卡

3.11. 参数总结

参数作用
-t指定一个表
-L查看表内容
-picmp 限定icmp协议
-jDROP 控制类型为丢包
-s指定来源IP
-I添加一条规则,在首行前一行增加一条规则
-d限制出站目标IP
-A在末行后一行增加一条规则
-nv查看表格详细信息
-F清空表的所有规则
-D删除指定规则
-i限制入站网卡
-o限制出站网卡

4. 隐示匹配

4.1. 端口匹配

4.1.1 --dport源端口匹配

iptables -A FORWARD -s 192.168.200.0/24 -p udp --dport 53 -j ACCEPT

4.1.2 --sport目标端口匹配

iptables -A FORWARD -s 192.168.200.0/24 -p udp --sport 53 -j ACCEPT

–dport 一个减号- 叫做显示匹配,两个减号–叫做隐示匹配

想要限制端口,首先要限制协议。如:-p udp --dport53

端口间可以用冒号:来代表多端口

4.2. 限制TCP三次握手 = --tcp-flags

iptables -I INPUT -i eth1 -p tcp --tcp-flags SYN,RST,ACK SYN -j DROP

–tcp-flags 检查范围

5. 显示匹配

5.1. 多端口匹配

-m multiport --sports 源端口列表
-m multiport --dports 目标端口列表

-m multiport = 限制多端口

5.2. 限制ip范围匹配

-m iprange --src-range IP 源地址限制多IP

5.3. MAC地址匹配

-m mac --mac-souce MAC地址

5.4.三次握手状态匹配

-m state --state

常见的连接状态

NEW: 新连接
ESTABLISHED: 响应请求或已建立的连接(常用于游戏维护)
RELATED: 与预警连接有相关性的

6. SNAT与DNAT

6.1. 原理

数据包的源IP在出猫之后,源IP就变成了猫的IP。在工作中有两种场景

6.1.1 第一种:SNAT

两个客户端在同一个网段通过同一个路由器访问一个网址。这种情况处于共享上网模式(SNAT)

帮助外网访问内网,叫做DNAT,帮助内网访问外网,叫做SNAT(共享上网)

客户端发出来的包,经过路由器变成了公网IP,当到达对方路由器后,公网IP就会变成私网IP,然后找后端交换机服务器。

数据包在经过路由器之后,源IP就变成了路由器的公网IP。而这个过程是在**出路由后(POSTROUTING)**的瞬间完成的。

为什么在出路由后?

如果源IP在之前四个链中任意一链变成了公网IP,那么这个数据包最终会访问自己。

6.1.2 第二种:DNAT

当一个数据包访问企业路由器,数据包实现的是公网到私网的过程。而数据包如果一直是公网IP,那么在到达百度路由器后,进行的是入站出站的过程。所以要实现公找私,需要在**进路由前(PREROUTING)**将公网IP变成私网IP。从而实现转发到私网的过程

6.2. 实验模拟

要开启IPV4转发 cat /etc/sysctl.conf

第十行: 10 net.ipv4.conf.default.rp_filter = 1

6.2.1 SNAT

SNAT是在出路由后执行,所以表在NAT表。写入规则,针对POSTROUTING 来源为192.168.200网段,且从eth1网卡出去的数据包,进行源地址转换,改成100.215

iptables -t nat -I POSTROUTING -s 192.168.200.0/24 -o eth1 -j SNAT --to-source 192.168.100.215

[root@localhost ~]# iptables -t nat -I POSTROUTING -s 192.168.200.0/24 -o eth1 -j SNAT --to-source 192.168.100.215
[root@localhost ~]# iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
SNAT       all  --  bogon/24             anywhere            to:192.168.100.215 

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
[root@localhost ~]# 

#用一号虚拟机ping三号就可ping通了
[root@iptables ~]# ping 192.168.100.150
PING 192.168.100.150 (192.168.100.150) 56(84) bytes of data.
64 bytes from 192.168.100.150: icmp_seq=1 ttl=63 time=1.36 ms
64 bytes from 192.168.100.150: icmp_seq=2 ttl=63 time=0.695 ms
64 bytes from 192.168.100.150: icmp_seq=3 ttl=63 time=0.558 ms
^C
--- 192.168.100.150 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2007ms
rtt min/avg/max/mdev = 0.558/0.872/1.364/0.352 ms
[root@iptables ~]# 

6.2.2 抓包

下载安装包:yum -y install tcpdump

[root@localhost ~]# tcpdump -p icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
01:57:11.727235 IP 192.168.100.215 > 192.168.100.150: ICMP echo request, id 39685, seq 1, length 64
01:57:11.727254 IP 192.168.100.150 > 192.168.100.215: ICMP echo reply, id 39685, seq 1, length 64
01:57:12.727235 IP 192.168.100.215 > 192.168.100.150: ICMP echo request, id 39685, seq 2, length 64
01:57:12.727250 IP 192.168.100.150 > 192.168.100.215: ICMP echo reply, id 39685, seq 2, length 64
01:57:13.727347 IP 192.168.100.215 > 192.168.100.150: ICMP echo request, id 39685, seq 3, length 64
01:57:13.727363 IP 192.168.100.150 > 192.168.100.215: ICMP echo reply, id 39685, seq 3, length 64
01:57:14.727486 IP 192.168.100.215 > 192.168.100.150: ICMP echo request, id 39685, seq 4, length 64
01:57:14.727501 IP 192.168.100.150 > 192.168.100.215: ICMP echo reply, id 39685, seq 4, length 64
01:57:15.728410 IP 192.168.100.215 > 192.168.100.150: ICMP echo request, id 39685, seq 5, length 64
01:57:15.728425 IP 192.168.100.150 > 192.168.100.215: ICMP echo reply, id 39685, seq 5, length 64
^C
10 packets captured
10 packets received by filter
0 packets dropped by kernel
[root@localhost ~]#

数据包从199.215发到100.150。发送一个请求包request。150回复215一个响应包reply。

刚才这是能ping通的情况。ping不通也可以用这个命令来抓包。就是如下效果

[root@localhost ~]# tcpdump -p icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
02:00:56.503302 IP 192.168.200.123 > 192.168.100.150: ICMP echo request, id 39941, seq 4, length 64
02:00:57.504013 IP 192.168.200.123 > 192.168.100.150: ICMP echo request, id 39941, seq 5, length 64
02:00:58.503650 IP 192.168.200.123 > 192.168.100.150: ICMP echo request, id 39941, seq 6, length 64
02:00:59.503837 IP 192.168.200.123 > 192.168.100.150: ICMP echo request, id 39941, seq 7, length 64
02:01:00.504153 IP 192.168.200.123 > 192.168.100.150: ICMP echo request, id 39941, seq 8, length 64
02:01:01.504642 IP 192.168.200.123 > 192.168.100.150: ICMP echo request, id 39941, seq 9, length 64
^C
6 packets captured
6 packets received by filter
0 packets dropped by kernel
[root@localhost ~]# 

6.2.3 DNAT

用户访问我方公司。通过路由器访问到网关,后经转发来到web或负载均衡器。

iptables -t nat -I PREROUTING -i eth1 -d 192.168.100.215 -p tcp --dport 80 -j DNAT --to-destination 192.168.200.123:8080

先在一号虚拟机上构建nginx环境。修改端口为8080

worker_processes  1;
events {
    worker_connections  20480;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       8080;  #修改端口
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
        }
    }
}

然后在二号虚拟机编写规则。

[root@localhost ~]# iptables -t nat -I PREROUTING -i eth1 -d 192.168.100.215 -p tcp --dport 80 -j DNAT --to-destination 192.168.200.123:8080
[root@localhost ~]# iptables -t nat -
[root@localhost ~]# iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
DNAT       tcp  --  anywhere             192.168.100.215     tcp dpt:http to:192.168.200.123:8080 

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
[root@localhost ~]# 

最后,在三号虚拟机ping二号虚拟机。刚开始是不通的,通过修改规则,就可以ping通了

[root@localhost ~]# curl 192.168.100.215:8080
curl: (7) couldn't connect to host
[root@localhost ~]# curl 192.168.100.215
192.168.200.123 test
[root@localhost ~]# 

本文标签: 防火墙规则常用方式iptables