1.iptables
(1)什么是iptables?
iptables(网络 过滤器)是一个工作于用户空间的防火墙应用软件,是与3.5版本Linux内核集成的IP信息包过滤系统。如果Linux系统连接到因特网或LAN、服务器或连接LAN和因特网的代理服务器,则该系统有利于在Linux系统上更好地控制IP信息包过滤和防火墙配置。
(2)说明
Iptables是用来设置、维护和检查Linux内核的IP包过滤规则的。它可以定义不同的表,每个表都包含几个内部的链,也能包含用户定义的链。每个链都是一个规则列表,对对应的包进行匹配,每条规则指定应当如何处理与之相匹配的包。这被称作'target'(目标),也可以跳向同一个表内的用户定义的链。
-A-append:在所选择的链末添加一条或更多规则。当源(地址)或者/与目的(地址)转换为多个地址时,这条规则会加到所有可能的地址(组合)后面。
-D-delete:从所选链中删除一条或更多规则。这条命令可以有两种方法:可以把被删除规则指定为链中的序号(第一条序号为1),或者指定为要匹配的规则。
-R-replace:从选中的链中取代一条规则。如果源(地址)或者/与目的(地址)被转换为多地址,该命令会失败。规则序号从1开始。
-I-insert:根据给出的规则序号向所选链中插入一条或更多规则。所以,如果规则序号为1,规则会被插入链的头部。这也是不指定规则序号时的默认方式。
-L-list:显示所选链的所有规则。如果没有选择链,所有链将被显示。也可以和z选项一起使用,这时链会被自动列出和归零。精确输出受其它所给参数影响。
-F-flush:清空所选链。这等于把所有规则一个个的删除。
--Z-zero:把所有链的包及字节的计数器清空。它可以和-L配合使用,在清空前察看计数器,请参见前文。
-N-new-chain:根据给出的名称建立一个新的用户定义链。这必须保证没有同名的链存在。
-X-delete-chain:删除指定的用户自定义链。这个链必须没有被引用,如果被引用,在删除之前你必须删除或者替换与之有关的规则。如果没有给出参数,这条命令将试着删除每个非内建的链。
-P-policy:设置链的目标规则。
-E-rename-chain:根据用户给出的名字对指定链进行重命名,这仅仅是修饰,对整个表的结构没有影响。TARGETS参数给出一个合法的目标。只有非用户自定义链可以使用规则,而且内建链和用户自定义链都不能是规则的目标。
-p-protocal[!]protocol:规则或者包检查(待检查包)的协议。指定协议可以是tcp、udp、icmp中的一个或者全部,也可以是数值,代表这些协议中的某一个。当然也可以使用在/etc/protocols中定义的协议名。在协议名前加上"!"表示相反的规则。数字0相当于所有all。Protocolall会匹配所有协议,而且这是缺省时的选项。在和check命令结合时,all可以不被使用。
-s-source[!]address[/mask]:指定源地址,可以是主机名、网络名和清楚的IP地址。mask说明可以是网络掩码或清楚的数字,在网络掩码的左边指定网络掩码左边"1"的个数,因此,mask值为24等于255.255.255.0。在指定地址前加上"!"说明指定了相反的地址段。标志--src是这个选项的简写。
-d--destination[!]address[/mask]:指定目标地址,要获取详细说明请参见-s标志的说明。标志--dst是这个选项的简写。
-j--jumptarget:目标跳转
指定规则的目标;也就是说,如果包匹配应当做什么。目标可以是用户自定义链(不是这条规则所在的),某个会立即决定包的命运的专用内建目标,或者一个扩展(参见下面的EXTENSIONS)。如果规则的这个选项被忽略,那么匹配的过程不会对包产生影响,不过规则的计数器会增加。
-i-in-interface[!][name]:进入的(网络)接口[!][名称],这是包经由该接口接收的可选的入口名称,包通过该接口接收(在链INPUT、FORWORD和PREROUTING中进入的包)。当在接口名前使用"!"说明后,指的是相反的名称。如果接口名后面加上"+",则所有以此接口名开头的接口都会被匹配。如果这个选项被忽略,会假设为"+",那么将匹配任意接口。
-o--out-interface[!][name]:输出接口[名称],这是包经由该接口送出的可选的出口名称,包通过该口输出(在链FORWARD、OUTPUT和POSTROUTING中送出的包)那么将匹配所有任意接口。
-v--verbose:详细输出。这个选项让list命令显示接口地址、规则选项(如果有)和TOS(TypeofService)掩码。包和字节计数器也将被显示,分别用K、M、G(前缀)表示1000、1,000,000和1,000,000,000倍(不过请参看-x标志改变它),对于添加,插入,删除和替换命令,这会使一个或多个规则的相关详细信息被打印。
-n--numeric:数字输出。IP地址和端口会以数字的形式打印。默认情况下,程序试显示主机名、网络名或者服务(只要可用)。
-x-exact:精确扩展数字。显示包和字节计数器的精确值,代替用K,M,G表示的约数。这个选项仅能用于-L命令。
--line-numbers:当列表显示规则时,在每个规则的前面加上行号,与该规则在链中的位置相对应。
--to-destiontion[-][:port-port]:只用于nat表的POSTROUTING链。只能用于动态获取IP(拨号)连接:如果你拥有静态IP地址,你要用SNAT。伪装相当于给包发出时所经过接口的IP地址设置一个映像,当接口关闭连接会终止。这是因为当下一次拨号时未必是相同的接口地址(以后所有建立的连接都将关闭)。它有一个选项:
--to-ports[-port>]:指定使用的源端口范围(不指定的话,目标端口不会被修改。),覆盖默认的SNAT源地址选择(见上面)。这个选项只适用于指定了-ptcp或者-pudp的规则。
--source-port[port[,port]]:如果源端口是其中一个给定端口则匹配
--destination-port[port[,port]]:如果目标端口是其中一个给定端口则匹配
--port[port[,port]]:若源端口和目的端口相等并与某个给定端口相等,则匹配。
state:此模块,当与连接跟踪结合使用时,允许访问包的连接跟踪状态。
--state state:这里state是一个逗号分割的匹配连接状态列表。可能的状态是:INVALID表示包是未知连接,ESTABLISHED表示是双向传送的连接,NEW表示包为新的连接,否则是非双向传送的,而RELATED表示包由新连接开始,但是和一个已存在的连接在一起,如FTP数据传送,或者一个ICMP错误。
SNAT:这个目标只适用于nat表的POSTROUTING链。它规定修改包的源地址(此连接以后所有的包都会被影响),停止对规则的检查,它包含选项:
--to-source[-][:port-port]:源端口中512以下的(端口)会被安置为其他的512以下的端口;512到1024之间的端口会被安置为1024以下的,其他端口会被安置为1024或以上。如果可能,端口不会被修改。
2.实验环境搭建
(1)双网卡主机:
eth0:172.25.254.118
eth1:192.168.0.118
(2)测试机1:
ip:172.25.254.18
(3)测试机2:
ip:192.168.0.218
3.在双网卡主机中搭建iptables
步骤一:安装开启iptable服务,关闭火墙
yum list iptables-services
systemctl stop firewalld
systemctl disable firewalld
systemctl mask firewalld
systemctl start iptables.service
systemctl enable iptables.service
步骤二:查看iptable策略
iptables -nL
iptables -t filter -nL
iptables -t nat -nL
4.iptable(3表5链)的相关设置
参数 | 命令 | 说明 |
---|---|---|
-L | iptables -L | 查看策略,做解析,ip对应出域名(默认为filter表) |
-nL | iptables -nL | 查看火墙策略,不做解析(默认为filter表) |
-t | iptables -t nat -nL | 指定表 |
-F | iptables -F | 清除策略(刷新iptable服务后,原策略会恢复) |
service iptables save | 保存策略 | |
iptables-save | 保存策略 | |
-A | iptables -t filter -A INPUT -p tcp --dport 22 -j ACCEPT | 添加策略(按顺序添加,第一个符合行为后便不会读取第二个) |
-D | iptables -D INPUT 2 | 删除指定策略 |
-I | iptables -t filter -I INPUT -s 172.25.254.120 -p tcp --dport 22 -j REJECT | 插入(默认插入到第一个) |
-R | iptables -t filter -R INPUT 1 -s 172.25.254.120 -p tcp --dport 22 -j DROP | 修改(替换)策略 |
-s | 数据来源 | |
-p | 访问协议 | |
-j | 行为 | |
-S | iptables -S INPUT | 查看策略 |
-Z | iptables -Z INPUT | 清除数据包,将数据包状态从ESTABLISHED,RELATED转为NEW |
-N | iptables -N zxyos | 新建链 |
-E | iptables -E zxyos JAY | 重命名链 |
-X | iptables -X JAY | 删除链 |
-P | iptables -P INPUT DROP | 修改链的默认行为(只能修改为ACCEPT和DROP,先读取链的行为,再读取链下策略的行为) |
修改相关设置的操作如下:(双网卡主机中)
iptables -L /*查看策略,做解析,ip对应出域名*/
iptables -nL /*查看火墙策略,不做解析*/
iptables -t filter -nL /*查看指定表策略*/
iptables -t nat -nL
iptables -F /*清除策略(刷新iptable服务后,原策略会恢复)*/
iptables -nL
systemctl restart iptables.service
iptables -nL
保存策略(方式一):
iptables -F
service iptables save /*保存策略,策略被保存到/etc/sysconfig/iptables文件中*/
cat /etc/sysconfig/iptables
systemctl restart iptables.service
iptables -nL
保存策略(方式二):
iptables -F
iptables-save > /etc/sysconfig/iptables /*保存策略*/
systemctl restart iptables.service
iptables -nL
iptables -t filter -A INPUT -p tcp --dport 22 -j ACCEPT /*添加策略(按顺序添加,第一个符合行为后便不会读取第二个)*/
iptables -nL
iptables -t filter -A INPUT -s 172.25.254.120 -p tcp --dport 22 -j REJECT
iptables -nL
iptables -D INPUT 2 /*删除指定策略*/
iptables -nL
iptables -t filter -I INPUT -s 172.25.254.120 -p tcp --dport 22 -j REJECT /*插入策略(默认插入到第一个)*/
iptables -nL
iptables -t filter -R INPUT 1 -s 172.25.254.120 -p tcp --dport 22 -j DROP /*修改(替换)策略*/
iptables -nL
iptables -S INPUT /*查看策略*/
iptables -nL /*查看策略(以表格的形式查看)*/
iptables -Z INPUT
iptables -nL
iptables -N zxyos /*新建链*/
iptables -nL
iptables -E zxyos JAY /*重命名链*/
iptables -nL
iptables -X JAY /*删除指定链*/
iptables -nL
iptables -P INPUT DROP /*修改链的默认行为(只能修改为ACCEPT和DROP)*/
iptables -nL
iptables -P INPUT REJECT
iptables -P INPUT ACCEPT
iptables -nL
5.iptable的权限策略编写
e.g.:去电影院看电影,有票就可入场,若中途有事出了观影厅,在电影结束前还可以凭票根再次入场
编写iptable策略,实现以上所述权限,并允squid(3128)、dns(53)、ssh(22)服务:
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT /*建立过状态和建立过状态断开后重新连接的都允许*/
iptables -A INPUT -m state --state NEW -i lo -j ACCEPT /*通过回环接口的数据都允许,lo---回环接口*/
iptables -A INPUT -m state --state NEW -p tcp --dport 3128 -j ACCEPT /*squid服务允许*/
iptables -A INPUT -m state --state NEW -p tcp --dport 53 -j ACCEPT /*dns服务允许*/
iptables -A INPUT -m state --state NEW -p tcp --dport 22 -j ACCEPT /*ssh服务允许*/
iptables -A INPUT -j REJECT /*其他的都拒绝*/
iptables -nL
iptables-save /*保存策略*/
iptables-save > /etc/sysconfig/iptables /*永久保存策略*/
-m state(状态) --state 状态(ESTABLISHED | RELATED | NEW)
6.iptables的地址伪装(SNAT)和端口转发(DNAT)
(1)SNAT和DNAT(由连接发起者是谁来区分)
SNAT:源地址转换
内部地址要访问公网上的服务时(如web访问),内部地址会主动发起连接,由路由器或者防火墙上的网关对内部地址做个地址转换,将内部地址的私有IP转换为公网的公有IP,网关的这个地址转换称为SNAT,主要用于内部共享IP访问外部。
DNAT:目的地址转换
当内部需要提供对外服务时(如对外发布web网站),外部地址发起主动连接,由路由器或者防火墙上的网关接收这个连接,然后将连接转换到内部,此过程是由带有公网IP的网关替代内部服务来接收外部的连接,然后在内部做地址转换,此转换称为DNAT,主要用于内部服务对外发布。
该实验在nat表中进行,192.168.0.218测试机网关设为192.168.0.118
(2)POSTROUTING—地址伪装(源地址转换)
192.168.0.218虚拟机测试:
ping 172.25.254.18 /*ping不通*/
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 172.25.254.118 /*把要从eth0出去的数据的原地址改为172.25.254.118*/
iptables -t nat -nL
192.168.0.218虚拟机测试:
ping 172.25.254.18 /*可ping通*/
(3)PREROUTING—端口转发(目的地址转换)
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 22 -j DNAT --to-dest 192.168.0.218:22 /*从eth0的22端口进来的数据,目的地转为 192.168.0.218的22端口*/
iptables -t nat -nL
172.25.254.18测试
ssh root@172.25.254.118
ifconfig eth0 /*ip为 192.168.0.218*/