iptables教程

 1 iptables安装

1.1 iptables和iptables-service的关系

iptables 是基于内核的,和 iptables-services 没有关系,不用安装任何工具包就可以使用 iptable 命令添加的防火墙规则,

但是iptables添加的规则是临时的,基于内存的,在系统重启后会消失,所以需要 iptables.service 服务来对添加的规则进行保存,

这样在系统重启后重载对应的防火墙规则。

1.2 安装iptables和iptables-service

第一步:1、关闭防火墙
[root@localhost ~]# systemctl status firewalld
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld

第二步:查看 iptables 是否安装,安装iptables-services
[root@localhost ~]# rpm -qa iptables
iptables-1.4.21-34.el7.x86_64                              # 系统默认装有 iptables
[root@localhost ~]# yum install iptables                   # 有新版本会安装最新版本
[root@localhost ~]# rpm -qa iptables
iptables-1.4.21-35.el7.x86_64
[root@localhost ~]# yum install iptables-services          # 安装 iptables-services 
[root@localhost ~]# rpm -qa iptables-services
iptables-services-1.4.21-35.el7.x86_64

第三步:启动iptables
[root@localhost ~]# systemctl enable iptables.service        # 设置 iptables 开机启动
[root@localhost ~]# systemctl start iptables                 # 开启 iptables
[root@localhost ~]# systemctl status iptables                # 查看 iptables 状态
● iptables.service - IPv4 firewall with iptables
   Loaded: loaded (/usr/lib/systemd/system/iptables.service; disabled; vendor preset: disabled)
   Active: active (exited) since Fri 2023-10-06 13:05:53 CST; 2s ago
   
第四步:#防火墙相关模块 加载到内核中,写入到开机自启动.
cat >> /etc/rc.local <<EOF
modprobe ip_tables
modprobe iptable_filter
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ipt_state 
EOF
sysctl -p

2 什么是iptables

iptables是Linux的防火墙管理工具而已,真正实现防火墙功能的是Netfilter,我们配置了iptables规则后Netfilter通过这些规则来进行防火墙过滤等操作

Netfilter模块:

它是主要的工作模块,位于内核中,在网络层的五个位置(也就是防火墙四表五链中的五链)注册了一些钩子函数,用来抓取数据包;把数据包的信息拿出来匹配各个各个链位置在对应表中的规则:匹配之后,进行相应的处理ACCEPT、DROP等等。

2.1 iptables的工作流程

  1. 防火墙是层层过滤的,实际是按照配置规则的顺序从上到下,从前到后进行过滤的。
  2. 如果匹配成功规则,即明确表示是拒绝(DROP)还是接收(ACCEPT),数据包就不再向下匹配新的规则。
  3. 如果规则中没有明确表明是阻止还是通过的,也就是没有匹配规则,向下进行匹配,直到匹配默认规则得到明确的阻止还是通过。
  4. 防火墙的默认规则是所有规则都匹配完才会匹配的。

3 具体的四表五链

3.1 四表五链定义

四表:filter、nat、managle、raw,默认是filter表。表的处理优先级:raw>managle>nat>filter

四表

filter

过滤数据包

nat

网络地址转换(端口映射、地址映射等。)

mangle

用于对特定数据报的修改。

raw

优先级最高,设置raw时一般是为了不再让iptables做数据报的链接跟踪处理,提高性能。

五链

PREROUTING

数据包进入路由表之前,对数据包做路由选择前应用此链路中的规则,所有的数据包进来的时候都先由这个链处理

INPUT

通过路由表后目的为本机,进来的数据报应用此规则链上的策略

FORWARD

通过路由表后,目标地址不为本机,做转发数据报时应用此规则链上的策略

OUTPUT

由本机产生的外出的数据包向外转发时,应用此规则链中的策略

POSTROUTING

数据报做路由选择后发送后到网卡接口之前应用此链中的规则,所有的数据包出来的时候都先由这个链处理

3.2 表与链之间的包含关系:

filter

INPUT、FORWARD、OUTPUT

nat

PREROUTING(DNAT)、OUTPUT、POSTROUTING(SNAT)

mangle

PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING

raw

PREROUTING、OUTPUT

3.3 数据包在4张表和5条链的流向:

4. iptables规则介绍

iptables [-t TABLE] COMMAND CHAIN [num] 匹配标准 -j 处理办法

-t:说明,不指定的时候,默认就是filter表
添加删除替换规则:
-A:附加一条规则,添加在链的尾部
-I CHAIN [num]:插入一条规则,插入为对应CHAIN上的第num条,不指定默认为第一条
-D CHAIN [num]:删除指定链中的第num条规则
-R CHAIN [num]:替换指定的规则
    例: iptables -A INPUT -p tcp --dport 22 -j ACCEPT  #放行访问本机22端口(ssh)
------------------------------------------------------------------------------------------------------------------------
管理规则链:
-F [CHAIN]:flush,情况指定规则链,如果省略CHAIN,则可以实现删除对应表中的所有链
-P CHAIN:设定指定链的默认策略    
-N:自定义一个新的空链
-X:删除一个自定义的空链
-Z:置零指定链中所有规则的计数器
-E:重命名自定义的链
    例: iptables -t nat -F       #清空NAT表中所有链上的规则
    例: iptables -t nat -F PREROUTING   #清空NAT表中PREROUTING链上的规则
    例: iptables -P INPUT ACCEPT   #指定filter表INPUT链默认策略是放行
    例: iptables -t nat -X   #删除NAT表中所有链上的规则
    -N案例(一个抵御洪水攻击的方案):
        1.在filter表中建一个名为tcp_packets的链:
        iptables -N syn-flood
        2.然后可以在自定义链中添加规则:
        iptables -A syn-flood -m limit --limit 100/s --limit-burst 150 -j RETURN
        iptables -A syn-flood -j DROP
        3.然后再把它作为jump的目标,这样我们就会从INPUT链跳入syn-flood链:
        #iptables -I INPUT -j syn-flood 
------------------------------------------------------------------------------------------------------------------------
查看规则:
-L:显示指定表中的规则
-n:以数字格式显示主机地址和端口号
-v:显示链及规则的详细信息
-x:显示计数器的精确值
--line-numbers:显示规则号码
    例: iptables -t nat -nL  --line-numbers     #查看NAT表中所有链上的规则,并显示规则序号
------------------------------------------------------------------------------------------------------------------------
通用匹配:
-s,--src :指定源地址
-d,--dst :指定目标地址
-p{tcp|udp|icmp} :指定协议
-i interface :指定数据报文流入的接口(eth0)
可用于定义标准的链:PREROUTING,INPUT,FORWARD
-o interface :指定数据报文流出的接口
可用于标准定义的链:OUTPUT,POSTROUTING,FORWARD
    例: iptables -t filter -A INPUT -s 192.168.1.1 -d 192.168.1.2 -p icmp -j DROP     #禁止源地址为192.168.1.1 ping 目的地址192.168.1.2
------------------------------------------------------------------------------------------------------------------------
隐含扩展匹配:不用特别指明由哪个模块进行的扩展,因为此时使用{tcp|udp|icmp}
-p tcp
     --sport PORT[-PORT]: 源端口
     --dport PORT[-PORT]: 目标端口
     --tcp-flags mask comp: 只检查mask指定的标志位,是逗号分隔的标志位列表;comp:
                               此列表中出现的标记位必须为1,comp中没出现,而mask中出现的,必须为0;
       --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN     
             第一部分表示:我们需要匹配报文tcp头中的哪些标志位,这6个标志位分别为为”SYN、ACK、FIN、RST、URG、PSH”。
             第二部分表示:第二部分为SYN,则表示,第一部分需要匹配的标志位列表中,SYN标志位的值必须为1,其他标志位必须为0 
     --syn
    例: iptables -t filter -A INPUT -s 192.168.1.1 -d 192.168.1.2 -p tcp --dport 22 -j DROP     #禁止源地址为192.168.1.1 ping 目的地址192.168.1.2
    例: iptables -A INPUT -p tcp --dport 18:80 -j DROP #拒绝访问本机端口18到80之间的所有端口
-p icmp  (ping)
     --icmp-type 
        0: echo-reply   ping应答
        8: echo-request ping请求        
    例: iptables -A INPUT -p icmp --icmp-type 8 -s 192.168.239.0/24 -j DROP 
    例: iptables -A INPUT -p icmp --icmp-type any -s 192.168.239.0/24 -j DROP
-p udp
     --sport
     --dport
      例: iptables -A INPUT -p udp --dport 45 -j DROP  #不允许访问本机udp45端口
 ------------------------------------------------------------------------------------------------------------------------   
  显示扩展匹配:使用额外的匹配机制,必须指明由哪个模块进行的扩展,在iptables 中使用-m选型可完成此功能
  -m state:状态扩展
     结合ip_conntrack追踪会话状态
     NEW:新连接请求
     ESTABLISHED:已建立的链接
     INVALID:非法链接
     RELATED:相关联的 (ftp,需要加载模块) 
    例: iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT   #允许连接状态为ESTABLISHED,RELATED的连接进入
    例: iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT  ##允许连接状态为ESTABLISHED,RELATED的连接出去
-m multiport:离散的多端口匹配扩展
     --source-ports
     --destination-ports
     --ports
     -m multiport --destination-ports 21,22,80 -j ACCEPT            
    例: iptables -A INPUT -p tcp -m multiport --destination-ports 21,22,80 -j ACCEPT    #允许访问本机21,22,80端口
-m iprange   指定范围
     --src-range
     --dst-range
    例: iptables -A INPUT -p tcp -m iprange --src-range 172.16.100.3-172.16.100.100 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
-m connlimit  作用:用于限制每一个客户端ip的并发连接数
     --connlimit-above n    //超过n个并发连接数
     ! --connlimit-above n  //未超过n个并发连接数     
    iptables -I INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 100 -j REJECT      #同一IP超过100以上并发时,就拒绝连接
    iptables -I INPUT -p tcp --syn --dport 80 -m connlimit ! --connlimit-above 100 -j ACCEPT    #同一IP未超过100以上并发时,就接受连接(和上面一个意思)


-m limit  限制并发及速率
    --limit rate[/second|/minute|/hour|/day] 指定要隔多长时间才能签发一个新的通行证。
    --limit-burst number    the default is 5 指定刚开始时有多少通行证可用,不指定默认为5
        --limit 5/minute --limit-burst 3 意思是开始时有3个通行证,用完之后,1分钟只生成5个令牌,即每12秒生成一个,
        这期间没有剩余令牌的时候,到来的封包,无法匹配此条规则,就会继续往下匹配其他规则,如果有令牌了,则新到的封包就会匹配此条规则          
    例: iptables -A INPUT -d 192.168.2.102 -p tcp --dport 80 -m limit --limit 5/minute --limit-burst 3 -j ACCEPT 

-m string                
    --string pattern:指定要匹配的字符串。
    ! --string pattern:反向匹配。
    --algo:指定匹配的查询算法,有bm和kmp两种算法。                  
    String模块的作用是来匹配请求报文中指定的字符串,经常应用于拦截用户访问某些网站的场景,将防火墙当做路由器使用,例如上班时间不允许用户访问淘宝网站等等场景
    例: iptables -t filter -I OUTPUT -p tcp -m string --string "taobao.com" --algo bm -j DROP #拒绝数据包中包含taobao.com内容的数据包。
------------------------------------------------------------------------------------------------------------------------
动作(target):
-j 
ACCEPT:放行
DROP:丢弃
REJECT:拒绝
DNAT:目标地址转换
SNAT:源地址转换
REDIRECT:端口重定向
MASQUERADE:地址伪装
LOG:日志     --log-prefix  prefix
MARK:打标记

-j SNAT 
    --to-source ipaddr[-ipaddr][:port[-port]]
    例: iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -j SNAT --to-source 172.16.100.1  #(共享上网方案)把数据包中源地址是192.168.2.0/24转变为172.16.100.1

-j DNAT
    --to-destination [ipaddr][-ipaddr][:port[-port]]
    例: iptables -t nat -A PREROUTING -d 172.16.100.7 -p tcp --dport 80 -j DNAT --to-destination 192.168.100.7:8080  #(端口映射)把数据包中目的地址是172.16.100.7:80转变为192.168.100.7:8080    

-j MASQUERADE (外网地址动态获取时使用)
    例: iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -j MASQUERADE  #(共享上网方案)把数据包中源地址是192.168.2.0/24转变为MASQUERADE,效果和SNAT一样
------------------------------------------------------------------------------------------------------------------------
-P 设置默认策略
iptables [-t table] -P [INPUT,OUTPUT,FORWARD] [ACCEPT,DROP]
-P 选项用来定义默认策略(Policy)。注意,这是大写字母 P。ACCEPT 表示接受数据包,DROP 表示丢弃数据包。
一般情况下,我们会把 filter 表的 INPUT 链的默认策略制订的严格一些,比如设为 DROP。而 FORWARD 和 OUTPUT 可以宽松些,设为 ACCEPT。比如我们可以通过下面的命令把 filter 表的 INPUT 链的默认策略设置为 DROP:
    例: iptables -P INPUT DROP

5.规则保存与恢复:

注意,我们通过 iptables 命令设置的规则都保存在内存中,也就是说系统重启的话所有的配置都会丢失。
我们可以通过 iptables-save 命令把 iptables 的配置保存到文件中:
$ sudo iptables-save > /etc/sysconfig/iptables
在需要时再通过 iptables-restore 命令把文件中的配置信息导入:
$sudo iptables-restore < /etc/sysconfig/iptables

6.生产环境中iptables的设置

#把三个表清空,把自建的规则清空。默认规则(iptables -F命令会把所有规则情况,但是不会修改默认规则,如果默认规则当前是DROP,执行iptables -F会导致立马无法连接机器,因为所有数据包都被拒绝了)
iptables -t filter -F
iptables -t filter -X
iptables -t mangle -F
iptables -t mangle -X
iptables -t nat -F
iptables -t nat -X
#1.允许本机回环lo接口数据流量流出与流入
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
#2.允许ssh连接
iptables -A INPUT -p tcp --dport ssh -j ACCEPT
#3.允许访问本机80,443端口
iptables -A INPUT -m multiport -p tcp --dport 80,443 -j ACCEPT
#4.修改INPUT链默认的规则为拒绝(如果要把默认策略设置为DROP的时候,一定要先放行远程登录等一系列权限后再设置为DROP,否则就会立马断开远程连接,也无法再次远程连接)
iptables -P INPUT DROP
#5.内存里规则保存到默认的规则文件里
iptables-save > /etc/sysconfig/iptables

7.iptables NAT实现共享上网和端口映射

7.1 NAT实现为内部服务器提供上网功能(共享上网)

iptables -t nat -A POSTROUTING  -s 172.16.1.7   -j SNAT  --to-source 10.0.0.61

1. 指定nat表,配置POSTROUTING链

2. 源ip是172.16.1.7这台主机进行共享上网,如果是多台(-s 172.16.1.0/24)

3. 指定使用SNAT功能,源地址转换.

4. 通过SNAT功能把数据包中的源ip地址改为防火墙公网的ip地址.(10.0.0.61)

5.如果公网ip不固定, -j SNAT --to-source 10.0.0.61 可以写为 -j MASQUERADE 伪装成公网ip.

环境介绍:

172.16.1.7 想要上网的机器,有2个网卡,eth0为外围,eth1为内网

172.16.1.61 实现NAT功能的防火墙机器,eth0为外围,eth1为内网

172.16.1.7 操作步骤

1.把机器上能上网的网卡关闭

sed -i 's/ONBOOT=yes/ONBOOT=no/' /etc/sysconfig/network-scripts/ifcfg-eth0

2.把不能上网的这张网卡配一个网关地址,地址为实现NAT的防火墙机器IP

vim eth1

GATEWAY=172.16.1.61

3.重启network

systemctl restart network

172.16.1.61操作步骤

1.由于是要把数据从eth1网卡转发到eth1,所以要开启ip_forward功能(内核转发功能)

echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf

sysctl -p

2.防火墙转发规则配置

iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j MASQUERADE

测试:

172.16.1.7 上ping 8.8.8.8看能不能通

7.2 NAT实现外部访问本机端口请求转发到内部其他机器特定的端口(端口映射)

iptables -t nat -A PREROUTING -p tcp --dport 6666 -j DNAT --to-destination 172.16.1.7:80

只要访问本机的6666端口,就会把请求转发到 172.16.1.7:80端口

  • 50
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值