linux主机是个路由器,防火墙,Linux中iptables防火墙
用了一个简单的示意图表示Filter原理,注意图中路由表虽然画了两个,但实际只有一个,也就是我们在系统中用“route –n”看到的内容,路由表决定了封包的传送路径,尤其在多网卡的系统中尤为重要。本地进程就是上面所述的Web服务器进程,大家可以理解为httpd进程。







收发包整体框架:
这里我们从客户端和服务端整体框架层面来看数据收发流程:

- 用户态(User Space)程序 Client 向另一台主机上的 Server 发送数据,需要通过调用内核态(Kernel Space)提供给用户态的 Socket 抽象层接口发送数据;
- Socket 抽象层接口收到用户态数据后,向下交给传输层接口(TCP 或 UDP);
- 传输层负责创建 sk_buff,并将用户数据(应用层数据)填充到缓冲区,做合法性检查后,添加传输层头部,并通过网络层注册的接口将数据包交给网络层处理;
- 网络层收到传输层数据包后,会查询路由表,决定数据包去向,如果是需要发出的数据包,会填充网络层头部,并交到内核虚拟网络接口设备的发送队列中;
- 虚拟网络接口从发送队列获取数据,调用对应网卡驱动发送数据;
Server 端接收数据时,按照相反的过程从网卡驱动中将数据包一层层上交,直到通过 Socket 抽象层接口将用户数据上交到用户态 Server 进程处理。
3. 网络层(IPv4)收发包流程
数据包在实际现网传输过程中,会经过各类交换机,路由器的转发处理,在这个过程中,路由器一般只处理到网络层。这里我们仅对 Linux 内核中网络层接收,发送以及转发数据的流程进行简单介绍。
下图为基于 Linux 2.6.38 版本内核的网络层相关接口在数据包收发过程的调用逻辑图:
- 从图中可以看到,*ip_rcv*函数为网络层向下层开放的入口,数据包通过该函数进入网络层进行处理,该函数主要对上传到网络层的数据包进行前期合法性检查,通过后交由 Netfilter 的钩子节点;---理解为网卡收到数据包后,交给网络层处理
- 绿色方框内的IP_PRE_ROUTING为 Netfilter 框架的 Hook 点,该节点会根据预设的规则对数据包进行判决并根据判决结果做相关的处理,比如执行 NAT 转换;
- IP_PRE_ROUTING节点处理完成后,数据包将交由*ip_rcv_finish*处理,该函数根据路由判决结果,决定数据包是交由本机上层应用处理,还是需要进行转发;如果是交由本机处理,则会交由*ip_local_deliver*走本地上交流程;如果需要转发,则交由*ip_forward*函数走转发流程;
- 在数据包上交本地的流程中,IP_LOCAL_INPUT节点用于监控和检查上交到本地上层应用的数据包,该节点是 Linux 防火墙的重要生效节点之一;
- 在数据包转发流程中,Netfilter 框架的IP_FORWARD节点会对转发数据包进行检查过滤;
- 而对于本机上层发出的数据包,网络层通过注册到上层的*ip_local_out*函数接收数据处理,处理 OK 进一步交由IP_LOCAL_OUT节点检测;
- 对于即将发往下层的数据包,需要经过IP_POST_ROUTING节点处理;网络层处理结束,通过*dev_queue_xmit*函数将数据包交由 Linux 内核中虚拟网络设备做进一步处理,从这里数据包即离开网络层进入到下一层;
IPv4 网络层的 Netfilter Hook 点
在第二章已经提及,Linux 内核中,Netfiler 在网络层设置了多个 Hook 点,这里我们不考虑实际的处理函数,仅看 Netfilter 的钩子节点,从而将网络层处理流程进行简化,如下图:
其中,矩形方框中的即为 Netfilter 的钩子节点。从图中可以看到,三个方向的数据包需要经过的钩子节点不完全相同:
- 发往本地:NF_INET_PRE_ROUTING-->NF_INET_LOCAL_IN
- 转发:NF_INET_PRE_ROUTING-->NF_INET_FORWARD-->NF_INET_POST_ROUTING
- 本地发出:NF_INET_LOCAL_OUT-->NF_INET_POST_ROUTING
- fileter INPUT(所有以本地为目的的包都要经过这个链,不管它们从哪里来,对这些包的过滤条件都设在这)
- filter OUTPUT(对本地发出的包过滤)
- FORWARD链 – 将数据转发到本机的其他网卡设备上。
- PREROUTING链 – 处理刚到达本机并在路由转发前的数据包。它会转换数据包中的目标IP地址(destination ip address),通常用于DNAT(destination NAT)。网卡接收到数据包后,要在路由判决之前,它可以改变目标ip地址,那么就可以在路由那里就有两条路可走了
- POSTROUTING链 – 处理即将离开本机的数据包。它会转换数据包中的源IP地址(source ip address),通常用于SNAT(source NAT)。 将其中一块网卡作为自己作为源ip,从这块网卡出去
这里可以使用Linux防火墙netfilter的用户态工具
iptables有4种表:raw-->mangle(修改报文原数据)-->nat(定义地址转换)-->filter(定义允许或者不允许的规则)
**每个表可以配置多个链:**
* 对于filter来讲一般只能做在3个链上:INPUT ,FORWARD ,OUTPUT
* 对于nat来讲一般也只能做在3个链上:PREROUTING ,OUTPUT ,POSTROUTING
* 对于mangle是5个链都可以做:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
**filter表的三个链详解:**
* INPUT链: 过滤所有目标地址是本地的数据包
* FORWARD链: 过滤所有路过本机的数据包
* OUTPUT链: 过滤所有由本机产生的数据包
举一反三学习:
```
【例】:过滤所有的访问:
iptables -t filter -A INPUT -s 0.0.0.0/0.0.0.0 -d X.X.X.X -j DROP
【例】:对SSH的22端口开放
iptables -I INPUT -s 0.0.0.0/0.0.0.0 -d X.X.X.X -p tcp --dport 22 -j ACCEPT
【例】:开放80端口
iptables -A INPUT -s 0.0.0.0/0.0.0.0 -d X.X.X.X -p tcp --dport 80 -j ACCEPT
【例】:来自124的数据禁止通过174 IP
iptables -A OUTPUT -p tcp -s 45.32.102.124 -d 157.240.22.174 -j REJECT
【例】打印当前生效的iptables规则(-n显示IP地址)
iptables -L -n
```
**Linux中iptables防火墙指定端口范围**
```
iptables -I INPUT -p tcp --dport 700:800 -j DROP
iptables -I INPUT -s 11.129.35.45 -p tcp --dport 700:800 -j ACCEPT
```
一、 700:800 表示700到800之间的所有端口
二、 :800 表示800及以下所有端口
三、 700: 表示700以及以上所有端口
这个例子作用是,700-800端口,仅仅对 11.129.35.45 IP开放,白名单机制。
**Snat、Dnat的iptables用途:**
源地址转换(Snat): iptables -t nat -A -s 私IP -j Snat --to-source 公IP
目的地址转换(Dnat): iptables -t nat -A -PREROUTING -d 公IP -j Dnat --to-destination 私IP
**iptables命令详解**
```
iptables常用的命令选项有:
-P:设置默认策略的(设定默认门是关着的还是开着的)如:iptables -P INPUT (DROP|ACCEPT)
-F: FLASH,清空规则链的(注意每个链的管理权限)
-N:NEW 支持用户新建一个链,比如:iptables -N inbound_tcp_web 表示附在tcp表上用于检查web的。
-X:用于删除用户自定义的空链
-Z:清空链
-A:追加
-I num : 插入,把当前规则插入为第几条
-R num:Replays替换/修改第几条规则
-D num:删除,明确指定删除第几条规则
-L:查看规则详细信息,比如"iptables -L -n -v"
-s 表示源地址IP
-d 表示目标地址IP
DROP 表示丢弃(拒绝)
ACCEPT 表示接受
-p 表示适用协议,如tcp
```
其他更多例子:
```
【例】添加iptables规则禁止用户访问域名为http://www.sexy.com的网站。
iptables -I FORWARD -d http://www.sexy.com -j DROP
【例】添加iptables规则禁止用户访问IP地址为20.20.20.20的网站。
iptables -I FORWARD -d 20.20.20.20 -j DROP
【例】添加iptables规则禁止IP地址为192.168.1.X的客户机上网。
iptables -I FORWARD -s 192.168.1.X -j DROP
【例】添加iptables规则禁止192.168.1.0子网里所有的客户机上网。
iptables -I FORWARD -s 192.168.1.0/24 -j DROP
【例】禁止192.168.1.0子网里所有的客户机使用FTP协议下载。
iptables -I FORWARD -s 192.168.1.0/24 -p tcp –dport 21 -j DROP
【例】强制所有的客户机访问192.168.1.x这台Web服务器。
iptables -t nat -I PREROUTING -i eth0 -p tcp –dport 80 -j DNAT –to-destination 192.168.1.x:80
【例】禁止使用ICMP协议。
iptables -I INPUT -i ppp0 -p icmp -j DROP
mangle表的主要功能是根据规则修改数据包的一些标志位,以便其他规则或程序可以利用这种标志对数据包进行过滤或策略路由。
内网的客户机通过Linux主机连入Internet,而Linux主机与Internet连接时有两条线路,它们的网关如图所示。现要求对内网进行策略路由,所有通过TCP协议访问80端口的数据包都从ChinaNet线路出去,而所有访问UDP协议53号端口的数据包都从Cernet线路出去。

这是一个策略路由的问题,为了达到目的,在对数据包进行路由前,要先根据数据包的协议和目的端口给数据包做上一种标志,然后再指定相应规则,根据数据包的标志进行策略路由。为了给特定的数据包做上标志,需要使用mangle表,mangle表共有5条链,由于需要在路由选择前做标志,因此应该使用PREROUTING链,下面是具体的命令。
- iptables -t mangle -A PREROUTING -i eth0 -p tcp
--dport 80 -j MARK --set- mark 1 - iptables -t mangle -A PREROUTING -i eth0 -p udp
--dprot 53 -j MARK --set- mark 2
以上命令在mangle表的PREROUTING链中添加规则,为来自eth0接口的数据包做标志,其匹配规则分别是TCP协议、目的端口号是80和UDP协议、目的端口号是53,标志的值分别是1和2。数据包经过PREROUTING链后,将要进入路由选择模块,为了对其进行策略路由,执行以下两条命令,添加相应的规则。
- ip rule add from all fwmark 1 table 10
- ip rule add from all fwmark 2 table 20
以上两条命令表示所有标志是1的数据包使用路由表10进行路由,而所有标志是2的数据包使用路由表20进行路由。路由表10和20分别使用了ChinaNet和Cernet线路上的网关作为默认网关,具体设置命令如下所示。
- ip route add default via 10.10.1.1 dev eth1 table 10
- ip route add default via 10.10.2.1 dev eth2 table 20
以上两条命令在路由表10和20上分别指定了10.10.1.1和10.10.2.1作为默认网关,它们分别位于ChinaNet和Cernet线路上。于是,使用路由表10的数据包将通过ChinaNet线路出去,而使用路由表20的数据包将通过Cernet线路出去。
(2)
iptables网关服务器三块网卡:eth0(网通ip:10.0.0.1)、eth1(电信ip:20.0.0.1);eth2:网关192.168.10.1。
要求:公司内网要求192.168.10.1---100以内的ip使用 10.0.0.1 网关上网(网通),其他IP使用 20.0.0.1 (电信)上网;
iptables网关服务器配置如下:
|
1
2
3
4
5
6
7
|
ip route add default gw 20.0 . 0.1ip route add table 10 via 10.0 . 0.1 dev eth0#eth0 是 10.0 . 0.1 所在的网卡, 10 是路由表的编号ip rule add fwmark 10 table 10#fwmark 10 是标记,table 10 是路由表 10 。 标记了 10 的数据使用table10 路由表iptables -A PREROUTING -t mangle -i eth2 -s 192.168 . 10.1 - 192.168 . 10.100 -j MARK -- set -mark 10#使用iptables给相应的数据打上标记 |
mangle应用顺序要高于nat、filter哈。
案例2、
iptables网关服务器三块网卡:eth0(网通ip:10.0.0.1)、eth1(电信ip:20.0.0.1);eth2:网关192.168.10.1。
要求:公司内网要求员工访问外面的网站服务;使用 10.0.0.1 网关上网(网通),其他IP使用 20.0.0.1 (电信)上网;
|
1
2
3
4
|
iptables -t mangle -A PREROUTING -i eth2 -p tcp --dport 80 -j MARK -- set -mark 20ip route add default gw 20.0 . 0.1ip route add table 20 via 10.0 . 0.1 dev eth0ip rule add fwmark 20 table 20 |


网络环境
1、一台服务器中有两个网络出口,出口1为电信;出口2为联通;出口3位移动,三个网络出口通过p55p1出网只是vlan不同。默认网关在移动
2、内网出口为p55p2出网
网络需求
内网的所有80流量和443流量全部走联通口,其中内网源地址中的1.1.1.1用户80流量走电信
网络top
需要指定一个策略路由表 web 和 nw 其中web走80和443流量,nw走1.1.1.1的80流量
操作命令(linux系统)
ip route re 0/0 via 移动网关 ---->指定默认路由在移动
在策略路由表文件中添加路由表
echo "230 web " >> /etc/iproute2/rt_table
echo "240 nw " >> /etc/iproute2/rt_table
指定策略路由表的默认路由
ip route re 0/0 via 联通网关 table web
ip route re 0/0 via 电信网关 table nw
针对所有80和443流量做标签1
iptables -t mangle -A PREROUTING -i p55p2 -p tcp -m tcp --dport 80 -j MARK --set-xmark 0x1
针对源地址1.1.1.1的流量做标签2
iptables -t mangle -A PREROUTING -i p55p2 -s 1.1.1.1 -p tcp -m tcp --dport 80 -j MARK --set-xmark 0x2
+++++重点,需要将第二个规则放在第一个规则上面 并且第二个规则需要设定除了1.1.1.1源地址意外的所有地址,所以应如下:
iptables -t mangle -A PREROUTING -i p55p2 -s 1.1.1.1 -p tcp -m tcp --dport 80 -j MARK --set-xmark 0x2
iptables -t mangle -A PREROUTING !-s 1.1.1.1 -i p55p2 -p tcp -m tcp --dport 80 -j MARK --set-xmark 0x1
理论可以按照第一个方法写 本人实验没成功。不知道哪里问题
设置策略路由
ip rule add from all fwmark 0x1 table web
ip rule add from all fwmark 0x2 table nw
总结
本文章主要解决问题是mangle表规则如果写入不清晰会出现的情况。

数据包从网卡接口进来后,最先经过的就是mangle表中的prerouting链。此表中有五条链:
<code class=" has-numbering language-as3" id="code_id_0">iptables -t mangle -L -n
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
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
Chain POSTROUTING (policy ACCEPT)
target prot opt source destinatio</code><ul class="pre-numbering" style="opacity: 0.285217;"><li>1.</li><li>2.</li><li>3.</li><li>4.</li><li>5.</li><li>6.</li><li>7.</li><li>8.</li><li>9.</li><li>10.</li><li>11.</li></ul>
通常不要在此表做过滤。若是在此表中做过滤,也是可以生效的,效率应比别的链快。
比如禁止访问本机的22端口,可以在mangle的input链做规则。
例:禁止访问iptables主机的30001端口
[root@LinuxB ~]# telnet 10.1.1.1 30001
Trying 10.1.1.1...
Connected to 10.1.1.1.
Escape character is '^]'.
现在是可以正常telnet
在mangle的input链添加一条禁止访问30001的规则
iptables -t mangle -A INPUT -p tcp --dport30001 -j DROP
[root@fw /]# iptables -t mangle -L -n
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:30001
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
应用之后,无法连接此端口,mangle表做规则是生效的。
[root@LinuxB ~]# telnet 10.1.1.1 30001
Trying 10.1.1.1...
telnet: connect to address 10.1.1.1:Connection timed out
[root@LinuxB ~]#
设置TTL:
TTL的初值通常是系统缺省值,是包头中的8位的域。TTL的最初设想是确定一个时间范围,超过此时间就把包丢弃。由于每个路由器都至少要把TTL域减一,TTL通常表示包在被丢弃前最多能经过的路由器个数。当记数到0时,路由器决定丢弃该包,并发送一个ICMP报文给最初的发送者。
如win7的TTL值默认是:64 (若想知道系统的默认TTL值是多少,在本机ping一下本机,可以看到TTL=数值 ,这个数据就是此系统的默认ttl)
例: LinuxB - iptables -LinuxA (第一节的环境)正常情况下,LinuxB ping LinuxA,在LinuxA机上抓包,可以看到10.1.1.2来的数据包,里面的ttl = 63。因为经过了iptables这个开了路由功能的主机,所以会把原来值减1(64-1=63)
[root@LinuxA ~]# tcpdump -i eth1 icmp -vv
tcpdump: listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes
11:13:45.125190 IP (tos 0x0, ttl 63, id 0, offset 0, flags [DF], proto ICMP (1), length 84)
10.1.1.2 > puppet.onepc.com: ICMP echo request, id 13833, seq 1, length 64
11:13:45.125253 IP (tos 0x0, ttl 64, id 63336, offset 0, flags [none], proto ICMP (1), length 84)
puppet.onepc.com > 10.1.1.2: ICMP echo reply, id 13833, seq 1, length 64
11:13:46.126795 IP (tos 0x0, ttl 63, id 0, offset 0, flags [DF], proto ICMP (1), length 84)
10.1.1.2 > puppet.onepc.com: ICMP echo request, id 13833, seq 2, length 64
11:13:46.126826 IP (tos 0x0, ttl 64, id 63337, offset 0, flags [none], proto ICMP (1), length 84)
puppet.onepc.com > 10.1.1.2: ICMP echo reply, id 13833, seq 2, length 64
从LinuxB的ttl值可以看出,LinuxB只经过一个路由器。若是想不让其他人知道我的机器穿过多少个路由,可以在mangle表中设置TTL值。
[root@fw ~]# iptables -j TTL -h
TTL target options
--ttl-set value Set TTL to <value 0-255>
--ttl-dec value Decrement TTL by <value 1-255>
--ttl-inc value Increment TTL by <value 1-255>
简单设置,隐藏iptables减去1的值,保持原来的ttl值,从eth2接口进来的数据包的ttl值加1,离去后会再减去1:
iptables -t mangle -A PREROUTING -i eth2 -j TTL --ttl-inc 1
linuxb再pinglinuxa,在linxa抓包发现,ttl值变成64,达到隐藏网络位置的效果:
11:30:35.269945 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto ICMP (1), length 84)
10.1.1.2 > puppet.onepc.com: ICMP echo request, id 47122, seq 1, length 64
11:30:35.270327 IP (tos 0x0, ttl 64, id 63338, offset 0, flags [none], proto ICMP (1), length 84)
puppet.onepc.com > 10.1.1.2: ICMP echo reply, id 47122, seq 1, length 64
11:30:36.261973 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto ICMP (1), length 84)
10.1.1.2 > puppet.onepc.com: ICMP echo request, id 47122, seq 2, length 64
11:30:36.262045 IP (tos 0x0, ttl 64, id 63339, offset 0, flags [none], proto ICMP (1), length 84)
puppet.onepc.com > 10.1.1.2: ICMP echo reply, id 47122, seq 2, length 64
A、B、C三台主机,A主机扮演外网访问角色;B主机打开核心转发,启用防火墙。两张网卡配置不一样网段IP;C主机为内网HTTP服务器。如下为配置流程:网络
本次实验使用2台虚拟机,一台物理机;主机A和主机B虚拟机网卡设置成VMnet3tcp
一、打开主机B中的核心转发功能;ide
# vi /etc/sysctl.conf
将net.ipv4.ip_forward值修改成1
net.ipv4.ip_forward = 1
# sysctl -p 查看是否生效
二、主机C安装APACHE测试
在实验过程当中发现192.168.1.10能正常ping通全部IP,包括192.168.2网段;但192.168.2.10没法ping通192.168.1.10。解决方案:在192.168.2.10上添加一条路由,以下blog
# ip route add 192.168.1.0/24 via 192.168.1.1 dev enp3s0
三、在B主机上配置防火墙FORWARD链策略,放行80端口:ip
#iptables -I FORWARD -p tcp --dport 80 -j ACCEPT 放行入方向目标端口为80的数据包
#iptables -I FORWARD -p tcp --sport 80 -j ACCEPT 放行出方向源端口为80的数据包,即让服务器能够响应外部的http请求
测试结果:因为防火墙只放行了80端口,192.168.1.10能够请求到192.168.2.10的http页面,但没法ping通以及远程等操做。路由
CentOS7没有iptables服务,只有iptables工具,服务可以写入配置文件,重启服务器自动读取配置文件,centos7自带的iptable工具命令行执行后重启后就失效了
iptables默认无法被systemctl控制,需要安装iptables-services、iptables-devel这两个依赖包。
禁用/停止自带的firewalld服务 如下
停止firewalld服务
[root@localhost ~]# systemctl stop firewalld
禁用firewalld服务
[root@localhost ~]# systemctl mask firewalld
如果使用disable的话,可以正常启动服务。总体来看,disable和enable是一对操作,是用来启动、停止服务。
使用systemctl unmask xxx取消屏蔽
如果使用了mask,要想重新启动服务,必须先执行unmask将服务取消屏蔽。mask和unmask是一对操作,用来屏蔽和取消屏蔽服务。
查看iptables现有规则
[root@localhost ~]# iptables -L -n
允许所有
[root@localhost ~]# iptables -P INPUT ACCEPT
安装iptables-services、iptables-devel
启用并启动iptables
查看状态 systemctl status iptables.service
查看iptables配置文件 vim /etc/sysconfig/iptables
添加一个80端口

防火墙没有启动的进程,而是工作于内核空间中的规则。
写防火墙规则man iptables 参照写
iptable -t table option chain parameter rule-specificaciton --line-number
option: -A append追加 -R 修改 -D 删除等选项
parameter :-s --sport -p等具体的参数 ,parameter是修饰rule-specification
rule-specification:具体的规则,包括两部分-m match (不用管)和-j 动作 即target
--line-number 列出规则在链中的序号,删除修改添加都可以参照序号
iptables -nL --line-number -n在linux中都是将端口,ip显示出来
理解-j RETURN:
1. 从一个CHAIN里可以jump到另一个CHAIN, jump到的那个CHAIN是子CHAIN. 2. 从子CHAIN return后,回到触发jump的那条规则,从那条规则的下一条继续匹配. 3. 如果return不是在子CHAIN里,而是在main CHAIN,那么就以默认规则进行.
先理解子链
iptables中,target/jump决定了符合条件的包到何处去,语法是--jump target或-j target。
通过-N参数创建自定义链:
iptables -N BLOCK
之后将BLOCK链作为jump的目标:
iptables -I INPUT 6 -p tcp --dport 80 -i p3p1 -j BLOCK
如下:
登录后复制
[root@cz ~]# iptables -vnL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
230K 118M ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
2939 247K ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0
4882 293K ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:8080
24 1432 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
0 0 BLOCK tcp -- p3p1 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
38897 3908K REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT 17 packets, 1604 bytes)
pkts bytes target prot opt in out source destination
Chain BLOCK (1 references)
pkts bytes target prot opt in out source destination
这样从INPUT链中匹配规则6的包都会跳入BLOCK链中,若到达了BLOCK链的结尾(即未被链中的规则匹配),则会回到INPUT链的下一条规则。如果在子链中被ACCEPT了,则就相当于在父链中被ACCEPT了,那么它不会再经过父链中的其他规则。但要注意这个包能被其他表的链匹配;
为BLOCK链增加规则:
iptables -A BLOCK -p tcp -s 10.1.1.92/32 -i p3p1 --dport 80 -j DROP
查看如下:
Chain BLOCK (1 references) pkts bytes target prot opt in out source destination 18 912 DROP tcp -- p3p1 * 10.1.1.92 0.0.0.0/0 tcp dpt:80
这样就配置完成,可验证访问;
实验了下,在forward链加filter规则,禁止icmp ping, -j RETRUN 还是可以ping 通,因为是main链中,按照默认规则accept,没有子链,-j DROP REJECT都不通
我们说过,”动作”在iptables中被称为”target”,这样描述并不准确,因为target为目标之意,报文被规则匹配到以后,target能是一个”动作”,target也能是一个”自定义链”,当target为一个动作时,表示报文按照指定的动作处理,当target为自定义链时,表示报文由自定义链中的规则处理,现在回过头再理解之前的术语,似乎更加明了了。
per-target-option 动作选项,在REJECT 用到,per-target-options 是reject-with icmp-net-unreachable
白名单,黑名单是看允许哪些流量放行,和拒绝哪些数据包通过,白名单是允许,黑名单是拒绝。而防火墙规则为了保护管理员能登录,采用白名单,白名单都是默认拒绝, 允许哪些数据包通过, 但这里将默认改成允许,具体规则仍是允许哪些流量放行,最后一条规则是拒绝所有,就是为了防止不小心执行iptables -F,将管理员自己锁死在服务器外面登录不进去,但这仍是白名单机制。
iptables中nat表可以实现SNAT, DNAT,
一. 源地址NAT
1. 标准的SNAT
SNAT的目的是进行源地址转换,应用于POSTROUTING规则链.在路由决定之后应用.SNAT与出站接口相关,而不是入站接口. 语法如下:
iptables -t nat -A POSTROUTING -o ... \
-j SNAT --to-source
[-
][:port-port]
2. MASQUERADE源NAT
MASQUERADE没有选项来指定在NAT设备上使用的特定源地址,使用的源地址就是出站好接口的地址.
iptables -t nat -A POSTROUTING -o ... \
-j MASQUERADE [--to-ports [-port]]
二. 目的地址NAT
目的地址NAT有2种形式: DNAT和REDIRECT. REDIRECT是目的地址转换的特殊形式,将数据包重定向到NAT设备的输入或回环接口. 目的地址NAT应用于nat表的PREROUTING和OUTPUT规则链,在做出路由决定前对目的地址进行修改.在PREROUTING中,DNAT和REDIRECT规则与用来接受通过本地路由转发或送到主机的入站接口的数据包的入站接口有关.在OUTPUT中,DNAT和REDIRECT规则用来处理来自NAT主机本身生成的出站数据包.
1. 标准目的地址NAT(DNAT)
iptables -t nat -A PREROUTING -i ... \
-j DNAT --to-destination
[-
][:port-port]
iptables -t nat -A OUTPUT -o ... \
-j DNAT --to-destination
[-
][:port-port]
目的地址用来替换数据包中的原始目的地址,多位本地服务器地址.
2. REDIRECT
iptables -t nat -A PREROUTING -i ... \
-j REDIRECT [--to-ports [-port]]
iptables -t nat -A OUTPUT -o ... \
-j REDIRECT [--to-ports [-port]]
REDIRECT重定向数据包到执行REDIRECT操作的那台主机.
-m state模块,如果想要一端能ping ,另一端不能ping,那么可以这样设置:
iptables -P INPUT DROP
iptables -I INPUT -p icmp -j ACCPET
iptables -P INPUT DROP
iptables -I INPUT -m state --state ESTABLISHED -j ACCEPT
不管tcp, icmp,udp只要第一次请求穿越防火墙,那么接下来所有的连接都是ESTABLIED
参考这篇文章
| https://www.zsythink.net/ |




浙公网安备 33010602011771号