Linux 下 iptables 防火墙管理服务设置
- iptables
iptables是linux系统中管理防火墙的工具(内核版本为2.4及以上,在低于2.4版本的LINUX系统中,用的不是iptables) iptables本身不是防火墙。 通过iptables可以建立、删除、修改、保存(导出)、导入防火墙策略。- iptables 的三表五链
预设的情況下, Linux 的 iptables 至少就有三個表格,
三张表包括:filter、nat、mangle
五条链包括:
INPUT链:处理输入数据包。
OUTPUT链:处理输出数据包。
PORWARD链:处理转发数据包。
PREROUTING链:用于目标地址转换(DNAT)。
POSTOUTING链:用于源地址转换(SNAT)。
- 管理本机进出的 filter
filter (过滤器):主要跟进入 Linux 本机的封包有关,这是预设的 table,包含以下三条链:
INPUT:主要与想要进入我们 Linux 本机的封包有关;
OUTPUT:主要与我們 Linux 本机所要送出的封包有关;
FORWARD:这个与 Linux 本机比较沒有关系, 他可以”转换封包”到后端的电脑中,与下列 nat table 相关性较高。- 管理后端主机 (防火墙內部的其他电脑) 的 nat
nat (位址转换):是 Network Address Translation 的缩写, 这个表格主要在进行来源与目的之 IP 或 port 的转换,与 Linux 本机较无关,主要与 Linux 主机后的区域网路內电脑较有相关。包含以下四条链:
INPUT:主要与想要进入我们 Linux 本机的封包有关;
PREROUTING:在进行路由判断之前所要进行的规则(DNAT/REDIRECT)
POSTROUTING:在进行路由判断之后所要进行的规则(SNAT/MASQUERADE)
OUTPUT:与发送出去的封包有关- 管理特殊旗标使用的 mangle (较少使用) 。
mangle (破坏者):这个表格主要是与特殊的封包的路由旗标有关,由于这个表格与特殊旗标相关性较高,所以像这种单纯的环境当中,较少使用 mangle 这个表格。包含以下五条链:
INPUT:主要与想要进入我们 Linux 本机的封包有关;
PREROUTING:在进行路由判断之前所要进行的规则(DNAT/REDIRECT)
POSTROUTING:在进行路由判断之后所要进行的规则(SNAT/MASQUERADE)
OUTPUT:与发送出去的封包有关
FORWARD:可以”转换封包”到后端的电脑中。
1. iptables 中常用的参数以及作用
参数 | 作用 |
---|---|
-t | 指定tabke |
-R | 修改 |
-n | 不作地址解析 |
-P | 设置默认策略 |
-F | 清空规则链 |
-L | 查看规则链 |
-A | 在规则链的末尾加入新规则 |
-I | num 在规则链的头部加入新规则 |
-D | num 删除某一条规则 |
-s | 匹配来源地址 IP/MASK,加叹号“!”表示除这个 IP 外 |
-d | 匹配目标地址 |
-i | 网卡名称 匹配从这块网卡流入的数据 |
-o | 网卡名称 匹配从这块网卡流出的数据 |
-p | 匹配协议,如 TCP、UDP、ICMP |
-E | 修改规则链名称 |
-N | 添加自定义链名 |
-X | 删除自定义链 |
iptables命令选项输入顺序:
iptables -t 表名 <-A/I/D/R> 规则链名 [规则号] <-i/o 网卡名> -p 协议名 <-s 源IP/源子网>
--sport 源端口 <-d 目标IP/目标子网> -- dport 目标端口 -j 动作
动作包括:
accept:接收数据包。
DROP:丢弃数据包。
REJECT:拒绝接受数据包。
REDIRECT:重定向、映射、透明代理。
SNAT:源地址转换。
DNAT:目标地址转换。
MASQUERADE:IP伪装(NAT),用于ADSL。
LOG:日志记录。
2. iptables 链表的具体操作
注:
在进行操作时关闭 firewalld
iptables 策略的执行,是由上到下依次查询表链信息,一但查到符合的信息,将直接进行应用,若是下述链中还有对应的符合信息是无法被是别的,若是表链中未查询到策略信息,将会执行默认的策略
2.1 iptables 策略查看、清空及保存
[root@client ~]# iptables -nL #不加地址解析的查看防火墙策略
其中:
target:代表进行的动作, ACCEPT 是放行,而 REJECT 則是拒绝,此外,还有 DROP (丢弃) 的項目!
prot:代表使用的封包协定,主要有 tcp, udp 及 icmp 三种封包格式;
opt:額外的选项说明
source :代表此规则是针对哪个“来源 IP”进行限制?
destination :代表此规则是针对哪个“目标 IP”进行限制?
[root@client ~]# iptables -F #清空防火墙策略
[root@client ~]# service iptables save
# 保存火墙策略到: /etc/sysconfig/iptables
执行如下:
查看火墙策略
清空策略并进行保存
2.2 iptables 策略的修改
2.2.1 iptables 默认策略修改,及简单的策略添加
iptables 的默认策略是 ACCEPT 允许,接受
[root@client ~]# iptables -P INPUT DROP #修改 INPUT 链的策略为 DROP
# 当数据包没有被规则列表里的任何规则匹配到时,按此默认规则处理
[root@client ~]# iptables -nL
利用 httpd 服务进行测试
[root@client ~]# iptables -A IPNUT -p tcp --dport 80 -j ACCEPT
# 修改火墙策略,允许 80 端口通过 tcp 协议进行访问
利用 httpd 服务进行测试
执行如下:
修改火墙策略
在另一主机通过 http 服务进行访问,由于火墙策略为DROP 因此无法访问,且无回复
为火墙添加策略,允许 80 端口通过 tcp 协议进行访问
访问成功
2.2.2 iptables 策略添加,插入,修改及删除
[root@client ~]# iptables -A INPUT -s 172.25.151.250 -p tcp --dport 80 -j REJECT
# 添加策略,拒绝指定主机通过 80 端口访问
# 添加默认是添加在策略最后
[root@client ~]# iptables -I INPUT 1 -s 172.25.151.250 -p tcp --dport 22 -j REJECT
# 插入策略到 INPUT 链的第一条,拒绝指定主机通过 22 端口访问
[root@client ~]# iptables -D INPUT 2
# 删除指定策略
[root@client ~]# iptables -R INPUT 2 -s 172.25.151.250 -p tcp --dport 80 -j ACCEPT
# 修改 INPUT 链的第二条策略,允许指定主机通过 80 端口访问
执行如下:
添加策略,默认添加到最后
验证策略要求,拒绝主机 172.25.151.250 通过 80 端口访问
插入策略到指定位置
验证策略要求,拒绝主机 172.25.151.250 通过 22 端口访问
删除指定位置的策略
修改指定策略
验证策略要求,允许主机 172.25.151.250 通过 80 端口访问
2.3 iptables 规则链的添加与删除
[root@client ~]# iptables -N test # 添加名为 test 的链(默认在 filter 表中进行操作)
[root@client ~]# iptables -E test linux # 将 test 链重命名为 linux
[root@client ~]# iptables -X linux # 删除 linux 链
执行如下:
添加新链
修改链名称
删除指定链
2.4 iptables -m state –state 状态模组
iptables 的链表策略在执行时,是一条条的去进行识别,此时若是所要匹配的策略在最后,那么每次进行匹配时,就会过于浪费时间, iptables 状态模组可以解决这个问题,在第一次进行匹配时,进行指定策略的筛选,已经连接过,或正在连接的,下次访问时,直接访问,不用再次匹配策略
具体执行如下
[root@client ~]# iptables -A chain [-m state] [--state 状态]
选项与参数:
-m state :狀態模組
--state :一些封包的狀態,主要有:
INVALID :无效的封包,通常这些包被DROP
ESTABLISHED:该包属于某个已建立的连接
NEW :该包想要开始一个新的连接(重新连接或连接重定向)
RELATED :该包是属于某个已建立的连接所建立的新连接
例如:对 net 表的 POSTROUTING 设定策略,将已经连接的或连接过的封包都允许
[root@client ~]# iptables -t nat -I POSTROUTING 1 -m state --state
RELATED,ESTABLISHED -j ACCEPT
执行如下:
3. 通过 iptables 的端口转发及地址伪装
3.1 地址伪装
可以通过对 iptables 的 nat 表进行设置,实现主机的路由功能,借由让别的主机,借由本机进行外网连接(实际是客户端借由防火墙主机的身份去访问外界)
- 双网卡主机网卡及 IP 分别为:
eth0:172.25.151.50
eth1:192.168.1.1- 单网卡主机网卡及 IP :
eth0:192.168.1.151- 借由地址伪装操作,让单网卡主机可以通过双网卡主机访问与其不同网段的主机
操作如下
首先设单网卡主机网关为双网卡主机 eth1 IP
在双网卡主机进行 iptables 策略设置,并开启本机内核路由功能
[root@client ~]# iptables -t nat -A POSTROUTING -o eth0 -j SNAT
--to-source 172.25.151.50
-t nat:指定 nat 表
-A POSTROUTING:指定 POSTROUTING 链
POSTROUTING:可以在这里定义进行源NAT的规 则,系统在决定了数据包的路由以后在执行该链中的规则。
-O eth0:匹配从网络接口 eth0 出去
-j SNAT:进行源地址转换
--to-source:转发数据包的源地址
指定如下:
在双网卡主机进行 iptables 策略配置,允许数据通过本机的 eth0 网卡进行转发
开启内核路由功能(编辑配置文件,/etc/sysctl.conf)
在单网卡主机
配置网关:
添加策略之前无法ping 通不同网段
可以 ping 通不同网段的
通过 ssh 服务进行访问外界主机,可看到是以 172.25.151.50 主机身份进行访问的
3.2 端口转发
可以通过对 iptables 的 nat 表进行设置,使得在访问本机某些端口时,将数据转发到别的主机中
设置好单网卡主机网关,如 3.1 地址伪装所作
执行如下:
[root@client ~]# iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 22
-j DNAT --to-dest 192.168.1.151
-t nat:指定 nat 表
-A PREROUTING:指定 PREROUTING 链
PREROUTING:(外部访问内部)可以在这里定义进行 目的NAT的规则,因为路由
器进行路由时只检查数据包的目的ip地址,所以为了使数据包得以正确路由,我们必
须 在路由之前就进行目的NAT;
-i eth0:匹配从网络接口 eth0 进来
-p tcp:封包协议为 tcp 协议
--dport 22:目的端口为 22 端口
-j DNAT:进行目标地址转换
--to-dest:转发数据包的目的地址
执行如下:
本机有两张网卡,分别为eth0:172.15.151.50,eth1:192.168.1.1,其中eth0 可以连接外网
设定 iptables 策略,外界主机想通过 22 端口访问本机时,将数据转发到 192.168.1.151 主机
测试如下