Linux系统防火墙iptables

2018-08-02  本文已影响0人  Net夜风

详述iptables五链

防火墙程序是工作在内核的TCP/IP的网络协议栈的框架之上,通过网络过滤可以实现入侵检测及入侵防御的功能。
凡是到达本机内部来的数据包我们都将其按照某种规则进行转发,凡是要从本机内部出去的将其按照另外一种规则进行转发,另外凡是经过本机转发的我们按照对应的转发规则转发的机制就是防火墙框架。
防火墙的框架就是在内核的TCP/IP协议栈中精心设置了几个卡点,对于数据包必流经的位置设置了几个钩子函数:这些卡点的位置如进口或出口处,如有一个人要进入我们的领域,我们在大门口放一台钩机,进来之前先用钩机将其钩起,然后一条一条的进行规制匹配,匹配通过了就放进来,匹配不通过的就直接扔掉。
Linux系统上的防火墙是由iptables/netfilter组成,其中iptables是规则的制定工具,netfilter在内核协议框架中定义了5个卡点位置,并在这5个位置通过钩子函数对进出的数据包进行过滤,从而达到防火墙的功能。iptables工具工作在用户控件,他可以制定一些规则然后送到内核空间,然后结合netfilter的钩子函数及处理方法对数据包进行放行或者拒绝处理。

iptables /netfilter规则:

iptables命令:

高度模块化,由诸多扩展模块实现其检查条件或处理动作的定义;其扩展模块路径:/usr/lib64/xtables; IPv4的模块为libipt_,libxt_;
IPv6的模块为libip6t_;
规则格式:
iptables [-t table] COMMAND chain [-m matchname [per-match-options]] -j targetname [per-target-options]

>   raw, mangle, nat, [filter]默认
   #多端口匹配mulitport示例:
   #放行ssh服务端口22,以便xshell可以连接到服务器
  [root@localhost ~]# iptables -A INPUT  -s 192.168.1.0/24 -d 192.168.1.106 -p tcp --dport 22 -j ACCEPT
  [root@localhost ~]# iptables -A OUTPUT -s 192.168.1.106 -d 192.168.1.0/24 -p tcp --sport 22 -j ACCEPT 
   #设置默认规则为拒绝
  [root@localhost ~]# iptables -A INPUT -d 192.168.1.106 -j REJECT
  [root@localhost ~]# iptables -A OUTPUT -s 192.168.1.106 -j REJECT 
   #多端口匹配示例
  [root@localhost ~]#  iptables -I INPUT 1 -d 192.168.1.106 -p tcp -m multiport --dports 21,53,80,139,445 -j ACCEPT
  [root@localhost ~]#  iptables -I OUTPUT 1 -s 192.168.1.106 -p tcp -m multiport --sports 21,53,80,139,445 -j ACCEPT
    #在另外一台192.168.1.107主机上测试本机开放的端口80
  [root@localhost ~]#   curl http://192.168.1.106
    <h1>192.168.1.106</h1>
    hello gay

...

    #iprange使用示例:
    [root@localhost ~]#iptables -I INPUT 3 -d 192.168.1.106 -p tcp --dport 23 -m iprange --src-range 192.168.1.107-192.168.1.110 -j ACCEP
     [root@localhost ~]#iptables -I OUTPUT 3 -s 192.168.1.106 -p tcp --sport 23 -m iprange --dst-range 192.168.1.107-192.168.1.110 -j ACCEP
     
     #使用192.168.1.107的主机telnet测试服务器
     [root@localhost ~]# telnet 192.168.1.106 23
     Trying 192.168.1.106...
     Connected to 192.168.1.106.
     Escape character is '^]'.
     Kernel 3.10.0-693.el7.x86_64 on an x86_64
     localhost login: 

...

     #time示例:
     [root@localhost ~]# iptables -R INPUT 3 -d 192.168.1.106 -p tcp -m iprange --src-range 192.168.1.107-192.168.1.110 -m time --timestart 10:00:00 --timestop 16:00:00 --weekdays 1,2,3,4,5 --kerneltz -j ACCEPT
     [root@localhost ~]# iptables -R OUTPUT 3 -s 192.168.1.106 -p tcp -m iprange --dst-range 192.168.1.107-192.168.1.110 -m time --timestart 10:00:00 --timestop 16:00:00 --weekdays 1,2,3,4,5 --kerneltz -j ACCEPT
     
     #使用192.168.1.107telnet测试
     [root@localhost ~]# telnet 192.168.1.106 23
     Trying 192.168.1.106...

...

    #string示例:(只对明文编码的生效)
    [root@localhost ~]# curl http://192.168.1.106
    <h1>192.168.1.106</h1>
    hello gay
    #添加规则过滤gay
    [root@localhost ~]# iptables -I OUTPUT -s 192.168.1.106 -m string --algo kmp --string "gay" -j REJECT
    #添加规则后重新访问被拒绝
    [root@localhost ~]# curl http://192.168.1.106
    |

...

    #connlimit并发连接限制:
    [root@localhost ~]# iptables -I INPUT 2 -s 192.168.0.0/16 -d 192.168.1.106 -p tcp --dport 3306 -j ACCEPT
    [root@localhost ~]# iptables -I OUTPUT 2 -d 192.168.0.0/16 -s 192.168.1.106 -p tcp --sport 3306 -j ACCEPT
    #先放行3306端口后修改此条规则,限制并发访问数量为2
    [root@localhost ~]# iptables -R INPUT 2 -s 192.168.0.0/16 -d 192.168.1.106 -p tcp --dport 3306 -m connlimit --connlimit-upto 2 -j ACCEPT
    [root@localhost ~]# iptables -R OUTPUT 2 -d 192.168.0.0/16 -s 192.168.1.106 -p tcp --sport 3306 -m connlimit --connlimit-upto 2 -j ACCEPT
    #分别使用192.168.1.107-192.168.1.109三台主机测试,前2台连接mysql数据库正常
    [root@localhost ~]# mysql -utest -h192.168.1.106 -pmagedu
    Welcome to the MariaDB monitor.  Commands end with ; or \g.
    ...
    MariaDB [(none)]> 
    #使用192.168.1.109主机已经连接不上
    [root@localhost ~]# mysql -utest -h192.168.1.106 -pmagedu
    ERROR 2003 (HY000): Can't connect to MySQL server on '192.168.1.106' (110)

...

    #limit 速率限制示例:
    [root@localhost ~]# iptables -I INPUT 3 -d 192.168.1.106 -s 192.168.1.0/24 -p icmp --icmp-type 8 -m limit --limit-burst 5 --limit 20/minute -j ACCEPT
    [root@localhost ~]# iptables -R OUTPUT 3 -s 192.168.1.106 -d 192.168.1.0/24 -p icmp -m state --state ESTABLISHED -j ACCEPT
    #使用107的主机ping测试
    [root@localhost ~]# ping 192.168.1.106
    PING 192.168.1.106 (192.168.1.106) 56(84) bytes of data.
    64 bytes from 192.168.1.106: icmp_seq=1 ttl=64 time=31.1 ms
    64 bytes from 192.168.1.106: icmp_seq=2 ttl=64 time=1.56 ms
    64 bytes from 192.168.1.106: icmp_seq=3 ttl=64 time=0.903 ms
    64 bytes from 192.168.1.106: icmp_seq=4 ttl=64 time=0.837 ms
    64 bytes from 192.168.1.106: icmp_seq=5 ttl=64 time=1.88 ms
    64 bytes from 192.168.1.106: icmp_seq=8 ttl=64 time=0.751 ms
    64 bytes from 192.168.1.106: icmp_seq=11 ttl=64 time=0.869 ms
    64 bytes from 192.168.1.106: icmp_seq=14 ttl=64 time=2.81 ms

...

    #state报文状态匹配示例:
    #放行22,23,80,139,445的tcp端口,和123,323 ,137,138的udp端口
    [root@localhost ~]# iptables -A INPUT -d 192.168.1.106 -p tcp -m multiport --dports 22:23,80,139,445,3306 -m state --state NEW -j ACCEPT
    [root@localhost ~]# iptables -I INPUT -d 192.168.1.106 -m state --state ESTABLISHED -j ACCEPT
    [root@localhost ~]# iptables -A OUTPUT -s 192.168.1.106 -m state --state ESTABLISHED -j ACCEPT
    [root@localhost ~]# iptables -A INPUT -d 192.168.1.106 -j REJECT
    [root@localhost ~]# iptables -A OUTPUT -s 192.168.1.106 -j REJECT
    [root@localhost ~]# iptables -I INPUT 2 -d 192.168.1.106 -p udp --dport 137:138 -m state --state NEW -j ACCEPT
    [root@localhost ~]# iptables -I OUTPUT 2 -s 192.168.1.106 -p udp -m multiport --dports 123,323 -m state --state NEW -j ACCEPT
     #放行FTP,装载连接追踪
    [root@localhost ~]# iptables -R INPUT 3 -d 192.168.1.106 -p tcp -m multiport --dports 21:23,80,139,445,3306 -m state --state NEW -j ACCEPT
    [root@localhost ~]# iptables -R INPUT 1 -d 192.168.1.106 -m state --state ESTABLISHED,RELATED -j ACCEPT
     #访问ftp服务测试
     [root@localhost ~]# lftp 192.168.1.106
     lftp 192.168.1.106:~> ls                
     drwxr-xr-x    2 0        0               6 Aug 03  2017 pub
     lftp 192.168.1.106:/> 

iptables/netfilter网络防火墙:

实验:按下图配置网关主机实现客户端访问服务器,演示网络防火墙功能

nat实验.png
  1. 按上图配置好三台虚拟机,并按图中ip配置好,开启网关主机的核心转发功能

     [root@localhost ~]# sysctl -w net.ipv4.ip_forward=1
     net.ipv4.ip_forward = 1 
     #在客户端添加默认路由条目
     [root@localhost ~]# route add default gw 192.168.10.254
     #在服务端添加路由
     [root@localhost ~]# route add -net 192.168.10.0/24 gw 192.168.1.107
     #至此客户端和服务端之间连接建立,在客户端192.168.10.2上访问服务器192.168.1.106的web服务
     [root@localhost ~]# curl http://192.168.1.106
     <h1>192.168.1.106</h1>
     hello gay
    
  2. 在网关主机192.168.106上的FORWARD链上添加规则

     #添加默认规则,拒绝访问
     [root@localhost ~]# iptables -A FORWARD -j REJECT
     #使用客户端测试web服务
     [root@localhost ~]# curl http://192.168.1.106
     curl: (7) couldn't connect to host
     #是用ping命令测试客户端和服务端之间连接被拒绝
     [root@localhost ~]# ping 192.168.10.2
     PING 192.168.10.2 (192.168.10.2) 56(84) bytes of data.
     From 192.168.1.107 icmp_seq=1 Destination Port Unreachable
     From 192.168.1.107 icmp_seq=2 Destination Port Unreachable
     #放行服务器的80端口,使客户端可以访问web服务
     [root@localhost ~]#  iptables -I FORWARD -s 192.168.10.0/24 -d 192.168.1.106 -p tcp --dport 80 -j ACCEPT
     [root@localhost ~]# iptables -I FORWARD -m state --state ESTABLISHED -j ACCEPT
     #使用客户机访问测试成功
     [root@localhost ~]# curl http://192.168.1.106
     <h1>192.168.1.106</h1>
     hello gay
     #单方向放行服务端到客户端的所有访问
     [root@localhost ~]#  iptables -D FORWARD 2 
     [root@localhost ~]# iptables -I FORWARD 2 -d 192.168.10.0/24 -m state --state NEW -j ACCEPT
    

...

  1. 实现SNAT,DNAT

     SNAT:
     #清空FORWARD链上的所有规则
     [root@localhost ~]# iptables -F FORWARD
     #隐藏服务器IP地址去访问外网(SNAT)在网关主机192.168.1.107主机上添加规则
     [root@localhost ~]# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 192.168.10.254
     #使用192.168.1.106访问192.168.10.2的http服务正常
     [root@localhost ~]# curl http://192.168.10.2
     <h1>192.168.10.2</h1>
     #在192.168.10.2主机上抓包分析可以看到服务器IP地址已经被隐藏,显示的是192.168.10.254的IP地址
     [root@localhost ~]# tcpdump -i ens33 -nn tcp port 80
     tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
     listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes
     17:30:16.081283 IP 192.168.10.254.40290 > 192.168.10.2.80: Flags [S], seq 854561726, win 29200, options [mss 1460,sackOK,TS val 11762377 ecr 0,nop,wscale 7], length 0
     17:30:16.081410 IP 192.168.10.2.80 > 192.168.10.254.40290: Flags [S.], seq 2274859692, ack 854561727, win 28960, options [mss 1460,sackOK,TS val 4762953 ecr 11762377,nop,wscale 7], length 0
     17:30:16.085611 IP 192.168.10.254.40290 > 192.168.10.2.80: Flags [.], ack 1, win 229, options [nop,nop,TS val 11762382 ecr 4762953], length 0
     17:30:16.085658 IP 192.168.10.254.40290 > 192.168.10.2.80: Flags [P.], seq 1:77, ack 1, win 229, options [nop,nop,TS val 11762382 ecr 4762953], length 76: HTTP: GET / HTTP/1.1
     17:30:16.085735 IP 192.168.10.2.80 > 192.168.10.254.40290: Flags [.], ack 77, win 227, options [nop,nop,TS val 4762957 ecr 11762382], length 0
     17:30:16.090704 IP 192.168.10.2.80 > 192.168.10.254.40290: Flags [P.], seq 1:264, ack 77, win 227, options [nop,nop,TS val 4762962 ecr 11762382], length 263: HTTP: HTTP/1.1 200 OK
     17:30:16.110303 IP 192.168.10.254.40290 > 192.168.10.2.80: Flags [.], ack 264, win 237, options [nop,nop,TS val 11762391 ecr 4762962], length 0
     17:30:16.112405 IP 192.168.10.254.40290 > 192.168.10.2.80: Flags [F.], seq 77, ack 264, win 237, options [nop,nop,TS val 11762392 ecr 4762962], length 0
     17:30:16.113445 IP 192.168.10.2.80 > 192.168.10.254.40290: Flags [F.], seq 264, ack 78, win 227, options [nop,nop,TS val 4762985 ecr 11762392], length 0
     17:30:16.117007 IP 192.168.10.254.40290 > 192.168.10.2.80: Flags [.], ack 265, win 237, options [nop,nop,TS val 11762413 ecr 4762985], length 0
    

...

    DNAT:
    #在192.168.1.107的网关主机上清空nat表上所有规则
    [root@localhost ~]# iptables -t nat -F
    #使用DNAT目标地址转换实现:隐藏服务器ip,仅开放有限协议有限服务的端口
    [root@localhost ~]# iptables -t nat -A PREROUTING -d 192.168.1.106 -p tcp --dport 80 -j DNAT --to-destination 192.168.10.254
    #使用192.168.10.2主机访问192.168.1.106的http服务
    [root@localhost ~]# curl http://192.168.1.106
    <h1>192.168.1.106</h1>
    hello gay
    #在192.168.1.106主机上抓包测试
    [root@localhost ~]# tcpdump -i ens33 -nn tcp port 80

....

上一篇下一篇

猜你喜欢

热点阅读