iptables

68 篇文章 0 订阅
42 篇文章 0 订阅

iptables简述

Iptables和ip6tables是通过Linux kernel设置、维护、以及检测IPv4和IPv6数据包过滤规则表的工具。有多种规则表可以被定义,每一张表都包含了一系列内建的链或者用户自定义的链,每一个链都是由一列规则组成,并且匹配一组数据包,每一个规则明确指出了对应匹配的包进行什么操作,这种方式叫做目标选择

iptables摘要

   iptables [-t table] {-A|-C|-D} chain rule-specification

   ip6tables [-t table] {-A|-C|-D} chain rule-specification

   iptables [-t table] -I chain [rulenum] rule-specification

   iptables [-t table] -R chain rulenum rule-specification

   iptables [-t table] -D chain rulenum

   iptables [-t table] -S [chain [rulenum]]

   iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]

   iptables [-t table] -N chain

   iptables [-t table] -X [chain]

   iptables [-t table] -P chain target

   iptables [-t table] -E old-chain-name new-chain-name

   rule-specification = [matches...] [target]

   match = -m matchname [per-match-options]

   target = -j targetname [per-target-options]

iptables命令详解

1.链管理命令

    -P :设置默认策略的(设定默认门是关着的还是开着的)
    默认策略一般只有两种
    iptables -P INPUT (DROP|ACCEPT)  默认是关的/默认是开的
    比如:
    iptables -P INPUT DROP 这就把默认规则给拒绝了。并且没有定义哪个动作,所以关于外界连接的所有规则包括Xshell连接之类的,远程连接都被拒绝了。
    -F: FLASH,清空规则链的(注意每个链的管理权限)
    iptables -t nat -F PREROUTING
    iptables -t nat -F 清空nat表的所有链
    -N:NEW 支持用户新建一个链
        iptables -N inbound_tcp_web 表示附在tcp表上用于检查web的。
    -X: 用于删除用户自定义的空链
        使用方法跟-N相同,但是在删除之前必须要将里面的链给清空昂了
    -E:用来Rename chain主要是用来给用户自定义的链重命名
        -E oldname newname
     -Z:清空链,及链中默认规则的计数器的(有两个计数器,被匹配到多少个数据包,多少个字节)
        iptables -Z :清空

2.规则管理命令

     -A:追加,在当前链的最后新增一个规则
     -I num : 插入,把当前规则插入为第几条。
        -I 3 :插入为第三条
     -R num:Replays替换/修改第几条规则
        格式:iptables -R 3 …………
     -D num:删除,明确指定删除第几条规则

3.查看管理命令 “-L”

附加子命令
-n:以数字的方式显示ip,它会将ip直接显示出来,如果不加-n,则会将ip反向解析成主机名。
-v:显示详细信息
-vv
-vvv :越多越详细
-x:在计数器上显示精确值,不做单位换算
--line-numbers : 显示规则的行号
-t nat:显示所有的关卡的信息

4.详解 -j ACTION

常用的ACTION:
DROP:悄悄丢弃
    一般我们多用DROP来隐藏我们的身份,以及隐藏我们的链表
REJECT:明示拒绝
ACCEPT:接受
    custom_chain:转向一个自定义的链
DNAT
SNAT
MASQUERADE:源地址伪装
REDIRECT:重定向:主要用于实现端口重定向
MARK:打防火墙标记的
RETURN:返回
    在自定义链执行完毕后使用返回,来返回原规则链。

5.SNAT基于原地址的转换

基于原地址的转换一般用在我们的许多内网用户通过一个外网的口上网的时候,这时我们将我们内网的地址转换为一个外网的IP,我们就可以实现连接其他外网IP的功能。
所以我们在iptables中就要定义到底如何转换:
定义的样式:
比如我们现在要将所有192.168.10.0网段的IP在经过的时候全都转换成172.16.100.1这个假设出来的外网地址:
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT --to-source 172.16.100.1
这样,只要是来自本地网络的试图通过网卡访问网络的,都会被统统转换成172.16.100.1这个IP.
那么,如果172.16.100.1不是固定的怎么办?
我们都知道当我们使用联通或者电信上网的时候,一般它都会在每次你开机的时候随机生成一个外网的IP,意思就是外网地址是动态变换的。这时我们就要将外网地址换成 MASQUERADE(动态伪装):它可以实现自动寻找到外网地址,而自动将其改为正确的外网地址。所以,我们就需要这样设置:
     iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j MASQUERADE
     这里要注意:地址伪装并不适用于所有的地方。

6.DNAT目标地址转换

对于目标地址转换,数据流向是从外向内的,外面的是客户端,里面的是服务器端通过目标地址转换,我们可以让外面的ip通过我们对外的外网ip来访问我们服务器不同的服务器,而我们的服务却放在内网服务器的不同的服务器上。

如何做目标地址转换呢?:
    iptables -t nat -A PREROUTING -d 192.168.10.18 -p tcp --dport 80 -j DNAT --todestination 172.16.100.2
    目标地址转换要做在到达网卡之前进行转换,所以要做在PREROUTING这个位置上

7.基于状态的匹配扩展 (连接跟踪)

每个网络连接包括以下信 息:源地址、目标地址、源端口、目的端口,称为套
接字对(socket pairs);协议类型、连接状态(TCP协议)和超时时间等。防火墙
把这些信息称为状态(stateful)。状态包过 滤防火墙能在内存中维护一个跟踪状态
的表,比简单包过滤防火墙具备更大的安全性,命令格式如下:iptables -m state --state
»NEW: 该包想要开始一个新的连接(重新连接或连接重定 向)
»RELATED:该 包是属于某个已建立的连接所建立的新连接。举例:FTP的
数据传输连接和控制连 接之间就是RELATED关系。
»ESTABLISHED:该包属于某个已建立的连接。
»INVALID:该 包不匹配于任何连接,通常这些包被DROP。
示例:iptables -A INPUT -i lo -j ACCEPT (lo表示本机回环)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j
ACCEPT
(允许已建立的连接接收数据)
iptables -A INPUT -m state --state NEW -p tcp --dport 53 -j
ACCEPT
iptables -A INPUT -m state --state NEW -p udp --dport 53 -j
ACCEPT
iptables -A INPUT -m state --state NEW -p tcp --dport 21 -j
ACCEPT
iptables -A INPUT -m state --state NEW -p tcp --dport 22 -j
ACCEPT
iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j
ACCEPT
(iptables -A INPUT -p tcp -m multiport --ports 80,53,21,22 -j
ACCEPT)
iptables -A INPUT -m state --state NEW -j REJECT
iptables -P INPUT DROP

8.控制规则的存放以及开启

注意:你所定义的所有内容,当你重启的时候都会失效,要想我们能够生效,需要使用一个命令将它保存起来
1.service iptables save 命令
    它会保存在/etc/sysconfig/iptables这个文件中
2.iptables-save 命令
    iptables-save > /etc/sysconfig/iptables

3.iptables-restore 命令
        开机的时候,它会自动加载/etc/sysconfig/iptabels
        如果开机不能加载或者没有加载,而你想让一个自己写的配置文件(假设为iptables.2)手动生效的话:
        iptables-restore < /etc/sysconfig/iptables.2
        则完成了将iptables中定义的规则手动生效

9.网关策略配置
(内网主机地址为172.25.254.36)

iptables -t nat -F:(清空nat策略)
vi /etc/sysctl.conf
net.ipv4.ip_forward = 1echo "1" » /proc/sys/net/ipv4/ip_forward
modprobe ip_nat_ftp(因ftp除使用21端口外,还要使用关联的22端口,因
此需要加载ftp模块)
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source
192.168.0.10( 内部网络访问外部时使用192.168.0.10,即公网地址)
(adsl 网络:iptables -t nat -A POSTROUTING -o ppp0 -s 192.168.0.0/
24 -j MASQUERADE)
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT -
-to-dest 172.25.254.36(外部网络可以访问内部的http服务器)
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 81 -j DNAT -
-to-dest 172.25.254.36:80(端口映射)
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 21 -j DNAT -
-to-dest 172.25.254.36(外部网络可以访问内部的ftp服务器)
限制内网用户:
iptables -A FORWARD -s 192.168.1.4 -j DROP
iptables -A FORWARD -m mac --mac 00:19:D1:63:AC:15 -j DROP
iptables -A FORWARD -d www.163.com -j REJECT
#星期一到星期六的8:00-12:30禁止qq通信
iptables -I FORWARD -p udp --dport 53 -m string --string "tencent"
-m time --timestart 8:15 --timestop 12:30 --days
Mon,Tue,Wed,Thu,Fri,Sat -j DROP
iptables -I FORWARD -p udp --dport 53 -m string --string
"TENCENT" -m time --timestart 8:15 --timestop 12:30 --days
Mon,Tue,Wed,Thu,Fri,Sat -j DROP
#星期一到星期六的8:00-12:30禁止qq网页
iptables -I FORWARD -s 192.168.0.0/24 -m string --string "qq.com"
-m time --timestart 8:15 --timestop 12:30 --days
Mon,Tue,Wed,Thu,Fri,Sat -j DROP
#禁止宽频影院,色情,广告网页连接
iptables -I FORWARD -d 192.168.0.0/24 -m string --string "宽频影院"
-j DROP
iptables -I FORWARD -s 192.168.0.0/24 -m string --string "色情" -j
DROP
iptables -I FORWARD -p tcp --sport 80 -m string --string "广告" -j
DROP
#禁止BT连接
iptables -A FORWARD -m ipp2p --edk --kazaa --bit -j DROP
iptables -A FORWARD -p tcp -m ipp2p --ares -j DROP
iptables -A FORWARD -p udp -m ipp2p --kazaa -j DROP#限制并发连接数
iptables -A FORWARD -p tcp --syn --dport 80 -m connlimit --
connlimit-above 15 --connlimit-mask 24 -j DROP
打开主机的22号端口,允许远程管理
iptables -A INPUT -i eth0 -s 192.168.1.104 -d 192.168.1.111 -p tcp
--dport 22 -j ACCEPT
iptables -A OUTPUT -o eth0 -d 192.168.1.111 -s 192.168.1.104 -p
tcp --sport 22 -j ACCEPT
iptables-save » /etc/iptables.up.rules
iptables-restore « /etc/iptables.up.rules
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp -i eth0 --dport 22 -j ACCEPT
iptables -A INPUT -p tcp -i eth0 --dport 80 -j ACCEPT
iptables -A INPUT -j DROP
iptables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables
denied: " --log-level 7: (将被丢弃的报文记录到syslog中) 每分钟通过5个数据包
技巧:
iptables -A OUTPUT -s 192.168.1.100 -p tcp --dport 80 -j REJECT(不可
访问web)
iptables -A OUTPUT -s 192.168.1.100 -d www.163.com -p tcp --dport
80 -j REJECT
iptables -A OUTPUT -m owner --uid-owner 1000 -j REJECT (特定用户)
iptables -A OUTPUT -m owner --gid-owner 501:
iptables -A OUTPUT -m owner --pid-owner 50: 

iptables用法示例

iptables -vnL
 #查看详细的管理命令
iptables -A INPUT -s 172.25.254.36 -p tcp --dport 23 -j REJECT
 #明确拒绝172.25.254.36主机对23端口的访问
iptables -A INPUT -s 172.25.254.36 -p tcp --dport 23 -j DROP
 #悄悄丢弃172.25.254.36主机对23端口的访问,无任何提示
iptables -F:刷新策略
iptables -I INPUT 2 -p tcp --dport 23 -j DROP
 #插入到第二条策略
iptables -E oldname newname
 #修改规则链名称
 iptables -D INPUT 3
 #删除filter表中的第三条规则
iptables -D INPUT -s 172.25.254.36 -j DROP
 #按内容删除规则
iptables -R INPUT 3 -j ACCEPT
 #将原来编号为3的规则内容替换为-j
iptables -t nat -F
 #清空nat策略, -F 仅仅是清空链中规则,并不影响 -P 设
置的默认规则
iptables -t nat -nL
 #查看nat策略
iptables -t nat -L PREROUTING
 #查看nat表PREROUTING链的规则
iptables -N redhat
 #添加自定义链名
iptables -D redhat 1
 #删除自定义链下的策略
iptables -X redhat
 #删除自定义链
iptables -A INPUT -s !172.25.254.36 -p tcp --dport 23 -j REJECT
 #只允许172.25.254.36主机的连接
 -i eth0:匹配从网络接口 eth0 进来
-o eth0:匹配从网络接口 eth0 出去
-s 172.25.254.36 匹配来自 192.168.0.1 的数据包
-s 172.25.254.0 /24 匹配来自 172.25.254.0/24 网络的数据包 
-d 172.25.254.36匹配去往 172.25.254.36 的数据包
-d 172.25.0.0/16 匹配去往 172.25.0.0/16 网络的数据包
-d www.abc.com:匹配去往域名 www.abc.com
-p tcp,udp
-p icmp --icmp-type 8(ping)
--sport 1000:匹配源端口是 1000 的数据包
--sport 1000:3000 匹配源端口是 1000-3000 的数据包(含1000 、 3000
)
--sport :3000:匹配源端口是 3000 以下的数据包(含 3000 )
--sport 1000: 匹配源端口是 1000 以上的数据包(含 1000 )
-s 172.25.254.36 -d www.abc.com -p tcp --dport 80:匹配来自
172.25.254.36 ,去www.abc.com 的 80 端口的 TCP 协议数据包
iptables -A OUTPUT -m owner --uid-owner 500:匹配特定使用者的包
iptables -A OUTPUT -m owner --gid-owner 501:
iptables -A OUTPUT -m owner --pid-owner 50:
iptables -A OUTPUT -m owner --sid-owner 5:是否为某特定联机
(session id)的封包
iptables -A FORWARD -m mac --mac xx:xx:xx:xx:xx:xx -j DROP:阻
断来自某 MAC 地址的数据包,通过本机
iptables -A INPUT -m mac --mac 00:19:D1:63:AC:15 -p tcp --dport
21 -j DROP(禁止访问本机的ftp)
-j ACCEPT DROP REJECT REDIRECT MASQUERADE LOG DNAT SNAT
MIRROR QUEUE RETURN MARK
POSTROUTING:可以在这里定义进行源NAT的规 则,系统在决定了数据包的路
由以后在执行该链中的规则。
 #在进行地址伪装和端口转化的时候要开启内核路由功能
[root@issic-server ~]# sysctl -a | grep forward
net.ipv4.ip_forward = 0
[root@issic-server ~]# vim /etc/sysctl.conf 
net.ipv4.ip_forward = 1
[root@issic-server ~]#sysctl -p
DNAT示例:
INBOUND(进入)
Iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --todest 172.25.254.36
OUTBOUD(输出,带有端口重定向)
iptables -t nat -A OUTPUT -p tcp --dport 80 -j DNAT --to--
dest 172.25.254.36:3128
SNAT示例:
Iptables -t nat -A POSTROUTING -j SNAT --to-source
172.25.254.36
MASQUERADE(地址伪装)
Iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 172.25.0.0/24 -j MASQUERADE --
to-ports 1024-31000:将源地址是172.25.0.0/24的包的地址改写为防火墙的
NIC ip,并指定端口范围
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值