iptables相关规则
一、表与链
filter表 | 主要和主机自身相关,真正负责主机防火墙功能的(过滤流入流出主机的数据包)filter表示iptbales默认使用的表,这个表定义了3个链(chains) |
---|---|
INPUT | 负责过滤所有目标地址是本机地址的数据包,就是过滤进入主机的数据包 |
FORWARD | 负责转发流经主机的数据包。起转发的作用。NAT模式,net.ipv4.ip_forward=0 |
OUTPUT | 处理所有源地址是本机地址的数据包,就是处理从主机发出去的数据包 |
NAT表:
负责网络地址转换的,即来源与目的IP地址和port的转换。 应用:和主机本身无关,一般用于局域网共享上网或者特殊的端口转换服务相 关。
使用场景:
- 用于企业路由(zebra)或网关(iptables),共享上网 (POSTROUTING)
- 做内部外部IP地址一对一映射(dmz),硬件防火墙映射IP到内部服务 器,ftp服务(PREROUTING)
- WEB,单个端口的映射,直接映射80端口(PREROUTING) 这个表定义 了3个链,nat功能相当于网络的acl控制。和网络交换机acl类似。
OUTPUT:
和主机放出去的数据包有关,改变主机发出数据包的目的地址。
PREROUTING:
在数据包到达防火墙时,进行路由判断之前执行的规则,作用是改变数据包的 目的地址、目的端口等
就是收信时,根据规则重写收件人的地址。 例如:把公网IP:xxx.xxx.xxx.xxx映射到局域网的xx.xx.xx.xx服务器上。 如果是web服务,可以报80转换为局域网的服务器9000端口上
10.0.0.61 8080(目标端口) —-nat—à 10.0.0.7 22
POSTROUTING:
在数据包离开防火墙时进行路由判断之后执行的规则,作用改变数据包的源地址,源端口等。
例如。默认笔记本和虚拟机都是局域网地址,在出网的时候被路由器将源地址改为了公网地址。
例如:局域网共享上网。
二、环境准备及命令
1、iptables 启动和关闭的命令
yum install -y iptables-services
[root@m01 ~]# rpm -ql iptables-services
/etc/sysconfig/ip6tables
/etc/sysconfig/iptables
/usr/lib/systemd/system/ip6tables.service
/usr/lib/systemd/system/iptables.service
防火墙相关模块 加载到内核中
modprobe ip_tables
modprobe iptable_filter
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ipt_state
[root@m01 ~]# lsmod |egrep 'filter|nat|ipt'
ipt_REJECT 12541 0
nf_reject_ipv4 13373 1 ipt_REJECT
nf_nat_ftp 12770 0
nf_conntrack_ftp 18638 1 nf_nat_ftp
iptable_filter 12810 1
xt_nat 12681 0
iptable_nat 12875 0
nf_nat_ipv4 14115 1 iptable_nat
nf_nat 26583 3 nf_nat_ftp,nf_nat_ipv4,xt_nat
nf_conntrack 137239 7 nf_nat_ftp,nf_nat,xt_state,nf_nat_ipv4,xt_conntrack,nf_conntrack_ftp,nf_conntrack_ipv4
ip_tables 27126 2 iptable_filter,iptable_nat
libcrc32c 12644 3 xfs,nf_nat,nf_conntrack
[root@m01 ~]# systemctl stop firewalld
[root@m01 ~]# systemctl disable firewalld
[root@m01 ~]# systemctl start iptables.service
[root@m01 ~]# systemctl enable iptables.service
Created symlink from
/etc/systemd/system/basic.target.wants/iptables.service to
/usr/lib/systemd/system/iptables.service.
[root@m01 ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP icmp -- 0.0.0.0/0 0.0.0.0/0 icmptype 8
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
2、iptables命令参数
-t:指定表 filter(默认) nat
-A:append 把规则追加到末尾
-I (大写字母I):insert 把规则插入到规则的第1条 (添加拒绝类规则的时候)
-p:protocal 指定协议:tcp /udp/icmp
–dport:destination port 目标端口
–sport:source port 源端口
-d:dest ip address 目标ip地址
-s:source ip address 源ip地址
-i:input 数据进来的时候通过的网卡
-o:output 数据出去的时候通过的网卡
-j:jump 方法 DROP(拒绝) ACCEPT(准许) REJECT(拒绝)
-F:清除链中所有的规则
-X:清空自定义链的规则
-Z:清空计数器
-n:不要把端口解析服务名字
-L:显示表中的规则
–line-number:给每个链中的规则加上行号
-D:删除规则 根据规则的号码进行删除 -D INPUT 2
3、配置filter表规则
[root@m01 ~]# iptables -F
[root@m01 ~]# iptables -X
[root@m01 ~]# iptables -Z
[root@m01 ~]# iptables -nL
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
4、禁止访问某个端口
[root@m01 ~]# iptables -I INPUT -p tcp --dport 22 -j DROP
删除规则 -D
[root@m01 ~]# iptables -D INPUT 1
[root@m01 ~]# iptables -nL
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
5、禁止网段连入(禁止10.0.0.0网段 8080端口)
#在m01已经将10.0.0.0网段的所有主机禁止8080端口连入
[root@m01 ~]# iptables -I INPUT -s 10.0.0.0/24 -p tcp --dport 8080 -j DROP
#可以看见web02已经连接不进去了
[root@web02 ~]# telnet 10.0.0.61 8080
Trying 10.0.0.61...
6、只允许指定网段连入(允许10.0.0.0网段)
[root@m01 ~]# iptables -I INPUT ! -s 10.0.0.0/24 -j DROP
7、指定多个端口
[root@m01 ~]# iptables -I INPUT -p tcp -m multiport ! --dport 80,443 -j DROP
[root@m01 ~]# iptables -I INPUT -p tcp ! --dport 1024:65535 -j DROP
8、匹配ICMP类型
ICMP(Internet Control Message Protocol)Internet控制报文协议
通过内核参数 控制 禁止被ping
[root@m01 ~]# cat /etc/sysctl.conf
# sysctl settings are defined through files in
# /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/.
#
# Vendors settings live in /usr/lib/sysctl.d/.
# To override a whole file, create a new file with the same in
# /etc/sysctl.d/ and put new settings there. To override
# only specific settings, add a file with a lexically later
# name in /etc/sysctl.d/ and put new settings there.
#
# For more information, see sysctl.conf(5) and sysctl.d(5).
net.ipv4.icmp_echo_ignore_all = 1
[root@m01 ~]# sysctl -p
net.ipv4.icmp_echo_ignore_all = 1
通过防火墙规则 控制 是否可以被ping
#在m01防火墙规则上禁止被ping
[root@m01 ~]# iptables -I INPUT -p icmp --icmp-type 8 -j DROP
[root@m01 ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP icmp -- 0.0.0.0/0 0.0.0.0/0 icmptype 8
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
#在web01上ping m01可以看到ping不通
[root@web02 ~]# ping 10.0.0.61
PING 10.0.0.61 (10.0.0.61) 56(84) bytes of data.
9、匹配网络状态(TCP/IP连接状态)
-m state –state NEW:已经或将启动新的连接 ESTABLISHED:已建立的连接 RELATED:正在启动的新连接 INVALID:非法或无法识别的 iptables -A INPUT -m state –state
ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -m state –state
ESTABLISHED,RELATED -j ACCEPT意思是允许进入的数据包只能是刚刚我发出去的数据包的回应,ESTABLISHED:已建立的链接状态。RELATED:该数据包与本机发出的数据包有关。
10、限制并发及速率
[root@m01 ~]# iptables -I INPUT -p icmp --icmp-type 8 -m limit --limit 6/min --limit-burst 5 -j ACCEPT
[root@m01 ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 icmptype 8 limit: avg 6/min burst 5
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
#-m limit --limit n/{second/minute/hour};
#解释:指定时间内的请求速率“n”为速率,后面为时间,分别为:秒 分 时
#--limit-burst [n]
#解释:在同一时间内允许通过的请求“n”为数字,不指定默认为5
11、防火墙规则的保存与恢复
root@m01 ~]# cat /etc/sysconfig/iptables
# sample configuration for iptables service
# you can edit this manually or use system-config-firewall
# please do not ask us to add additional ports/services to this default configuration
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
[root@m01 ~]# iptables-save > /etc/sysconfig/iptables
[root@m01 ~]# cat /etc/sysconfig/iptables
# Generated by iptables-save v1.4.21 on Wed Jul 24 21:00:17 2019
*filter
:INPUT ACCEPT [276:25808]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [209:23764]
-A INPUT -p icmp -m icmp --icmp-type 8 -m limit --limit 6/min -j ACCEPT
COMMIT
# Completed on Wed Jul 24 21:00:17 2019
# Generated by iptables-save v1.4.21 on Wed Jul 24 21:00:17 2019
*nat
:PREROUTING ACCEPT [394:32788]
:INPUT ACCEPT [9:616]
:OUTPUT ACCEPT [1:148]
:POSTROUTING ACCEPT [1:148]
COMMIT
# Completed on Wed Jul 24 21:00:17 2019
[root@m01 ~]# #恢复
[root@m01 ~]# #重启防火墙
[root@m01 ~]# iptables -F
[root@m01 ~]#
[root@m01 ~]# iptables -nL
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@m01 ~]# iptables-restore </etc/sysconfig/iptables
[root@m01 ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 icmptype 8 limit: avg 6/min burst 5
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
12、允许本机lo通讯规则
#允许本机回环lo接口数据流量流出与流入
[root@m01 ~]# iptables -A INPUT -i lo -j ACCEPT
[root@m01 ~]# iptables -A OUTPUT -o lo -j ACCEPT
# 意思就允许本地环回接口在INPUT表的所有数据通信,-i 参数是指定接口,接口是lo,lo就是Loopback(本地环回接口
13、配置默认规则及放行80 443 端口
[root@m01 ~]# iptables -P INPUT DROP
[root@m01 ~]# iptables -P FORWARD DROP
[root@m01 ~]# iptables -P OUTPUT ACCEPT
[root@m01 ~]# iptables -A INPUT -m multiport -p tcp --dport 443,80 -j ACCEPT
[root@m01 ~]# iptables -nL
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 multiport dports 443,80
Chain FORWARD (policy DROP)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
[root@m01 ~]# iptables -A INPUT -s 10.0.0.0/24 -j ACCEPT
[root@m01 ~]# iptables -A INPUT -s 172.16.1.0/24 -j ACCEPT
[root@m01 ~]# iptables -nL
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 multiport dports 443,80
ACCEPT all -- 10.0.0.0/24 0.0.0.0/0
ACCEPT all -- 172.16.1.0/24 0.0.0.0/0
Chain FORWARD (policy DROP)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
[root@m01 ~]# iptables-save
# Generated by iptables-save v1.4.21 on Wed Jul 24 21:45:21 2019
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [37:6212]
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m multiport --dports 443,80 -j ACCEPT
-A INPUT -s 10.0.0.0/24 -j ACCEPT
-A INPUT -s 172.16.1.0/24 -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
COMMIT
# Completed on Wed Jul 24 21:45:21 2019
# Generated by iptables-save v1.4.21 on Wed Jul 24 21:45:21 2019
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT
# Completed on Wed Jul 24 21:45:21 2019
二、nat设置
1、环境设置
[root@m01 ~]# iptables -P INPUT ACCEPT
[root@m01 ~]# iptables -P FORWARD ACCEPT
[root@m01 ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 multiport dports 443,80
ACCEPT all -- 10.0.0.0/24 0.0.0.0/0
ACCEPT all -- 172.16.1.0/24 0.0.0.0/0
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
2、实现把访问10.0.0.62:80的请求转发到172.16.1.7:80
[root@m01 ~]# iptables -A PREROUTING -t nat -d 10.0.0.62 -p tcp --dport 80 -j DNAT --to-destination 172.16.1.7:80
3、实现172.16.1.0/24段所有主机通过124.32.54.26外网IP共享上网。
iptables -A POSTROUTING -p tcp -s 172.16.1.0/24 -j SNAT --to-source 124.32.54.26
iptables -A POSTROUTING -p tcp -s 172.16.1.0/24 -j SNAT --to-source MASQUERADE