最近一段时间用到了不少网络的知识,设计到防火墙的配置,数据包的路由等等。在此过程中主要使用到了linux自带的iptables来完成一些功能,同样是迷迷糊糊的。以下为学习iptables的一些笔记,以备以后复习。

通过对linux内核防火墙的配置便能够完成上面描述的防护功能。llinux防火墙的配置用iptables工具来配置完成。
iptables是netfilter项目的一部分,用于配置linux内核防火墙的命令。iptables用于配置ipv4ip6tables用于配置ipv6。
iptables可以检测、修改、转发、重定向和丢弃ipv4的数据包。
过滤ipv4数据包的代码已经内置于内核中,并且按照不同的目的被组织成表(tables)的集合。表由一组预先定义的链(chains)组成,链包含遍历顺序规则。每一条规则包含一个谓词的潜在匹配和相应的动作(目标),如果谓词为真,该动作会被执行。也就是说条件匹配。
iptables是用户工具,用于允许用户使用链和规则。数据在iptables中的流向如下图:

处理动作在iptables中被称为target,动作分为基本动作和扩展动作。以下为常用的动作。
ACCEPT:允许数据包通过
DROP:直接丢失数据包,不给任何的回应信息
REJECT:拒绝数据包,会给请求方发送一个拒绝的信息
SNAT:源地址转换,解决网内用户用同一个公网地址上网的问题
MASQUERAADE:是SNAT的一种特殊形式,适用于动态的、临时会变的ip上
DNAT:目标地址转换
REDIRECT:在本机做端口映射
LOG:在/var/log/message文件中记录日志信息,然后将数据包传递给下一条规则,就是对数据除记录外不做任何其他的操作
iptables包含5张表:
raw 用于配置数据包,raw中数据包不会被系统跟踪。
filter 是用于存放所有与防火墙相关操作的默认表
nat 用于网络地址转换(例如:端口转发)
mangle 用于对特定数据包的修改
security 用于强制访问控制网络规则(例如SElinux)
大部分情况下仅需要使用filter和nat。其他表用于更为复杂的情况,包括多路由和路由判定等

规则表的先后顺序:raw -> mangle -> nat ->filter
表由链组成,链是一些按顺序排列的规则的列表。默认的filter包括INPUT、OUTPUT和FORWARD3条内建的链,这3条链作用于数据包的过滤过程中的不同时间点,如下:

5种链的描述:

默认情况,任何链中都没有规则,需要自己加入。
规则链在不同的数据场景下先后的顺序是不一样的:
数据入站:PREROUTING ->INPUT
数据出站:OUTPUT->POSTROUTING
转发顺序:PREROUTING ->FORWARD ->POSTROUTING
数据包的过滤基于规则。规则由一个目标(数据包匹配所有条件后的动作)和很多匹配(导致该规则可以应用的数据包所满足的条件)指定。一个规则的典型匹配事项是数据包进入的端口(网卡适配器)、数据包的类型(ICMP,tcp,或者udp)和数据包的目的端口。
管理和设置iptables规则
| 参数 | 含义 |
|---|---|
| -A | 在指定链的末尾添加(append)一条新的规则 |
| -D | 删除(delete)指定链中的某一条规则,可以按规则序号和内容删除 |
| -I | 在指定链中插入(insert)一条新的规则,默认在第一行添加 |
| -R | 修改、替换(replace)指定链中的某一条规则,可以按规则序号和内容替换 |
| -L | 列出(list)指定链中所有的规则进行查看 |
| -E | 重命名用户定义的链,不改变链本身 |
| -F | 清空(flush) |
| -N | 新建(new-chain)一条用户自己定义的规则链 |
| -X | 删除指定表中用户自定义的规则链(delete-chain) |
| -P | 设置指定链的默认策略(policy) |
| -Z | 将所有表的所有链的字节和数据包计数器清零 |
| -n | 使用数字形式(numeric)显示输出结果 |
| -v | 查看规则表详细信息(verbose)的信息 |
| -V | 查看版本(version) |
目标使用-j或者–jump 选项指定。目标可以是用户定义的链(例如,如果条件匹配,跳转到之后的用户定义的链,继续处理)、一个内置的特定的目标或者一个目标扩展。
内置目标是ACCEPT、DROP、QUEUE和RETURN,目标扩展是REJECT和LOG。如果目标是内置目标,数据包的命运会立刻被决定并且在当前表的数据包的处理过程会停止。如果目标是用户定义的链,并且数据包成功穿过第二条链,目标将移动到原始链中的下一个规则。目标扩展可以被终止或者不终止。
数据过滤的规则使用的是filter表,filter表中3条链INPUT,OUTPUT,FORWARD分别对应的是对于主机来说进入适配器的数据,出适配器的数据和转发的数据。
iptables -F # 清空所有的防火墙规则
iptables -X # 删除用户自定义的空链
iptables -Z # 清空计数
iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT
# 22为你的ssh端口, -s 192.168.1.0/24表示允许这个网段的机器来连接,其它网段的ip地址是登陆不了你的机器的。 -j ACCEPT表示接受这样的请求
iptables -A INPUT -i lo -j ACCEPT
#本地圆环地址就是那个127.0.0.1,是本机上使用的,它进与出都设置为允许
iptables -A OUTPUT -o lo -j ACCEPT
iptables -P INPUT DROP # 配置默认的不让进
iptables -P FORWARD DROP # 默认的不允许转发
iptables -P OUTPUT ACCEPT # 默认的可以出去
iptables -A INPUT -p all -s 192.168.1.0/24 -j ACCEPT # 允许机房内网机器可以访问
iptables -A INPUT -p all -s 192.168.140.0/24 -j ACCEPT # 允许机房内网机器可以访问
iptables -A INPUT -p tcp -s 183.121.3.7 --dport 3380 -j ACCEPT # 允许183.121.3.7访问本机的3380端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT # 开启80端口,因为web对外都是这个端口
iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT # 允许被ping
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 已经建立的连接得让它进来
cp /etc/sysconfig/iptables /etc/sysconfig/iptables.bak # 任何改动之前先备份,请保持这一优秀的习惯
iptables-save > /etc/sysconfig/iptables
cat /etc/sysconfig/iptables
iptables -F INPUT # 清空指定链 INPUT 上面的所有规则
iptables -X INPUT # 删除指定的链,这个链必须没有被其它任何规则引用,而且这条上必须没有任何规则。
# 如果没有指定链名,则会删除该表中所有非内置的链。
iptables -Z INPUT # 把指定链,或者表中的所有链上的所有计数器清零。
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT #允许本地回环接口(即运行本机访问本机)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT #允许已建立的或相关连的通行
iptables -A OUTPUT -j ACCEPT #允许所有本机向外的访问
iptables -A INPUT -p tcp --dport 22 -j ACCEPT #允许访问22端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT #允许访问80端口
iptables -A INPUT -p tcp --dport 21 -j ACCEPT #允许ftp服务的21端口
iptables -A INPUT -p tcp --dport 20 -j ACCEPT #允许FTP服务的20端口
iptables -A INPUT -j reject #禁止其他未允许的规则访问
iptables -A FORWARD -j REJECT #禁止其他未允许的规则访问
iptables -A INPUT -p tcp -m tcp -s 192.168.0.8 -j DROP # 屏蔽恶意主机(比如,192.168.0.8
iptables -I INPUT -s 123.45.6.7 -j DROP #屏蔽单个IP的命令
iptables -I INPUT -s 123.0.0.0/8 -j DROP #封整个段即从123.0.0.1到123.255.255.254的命令
iptables -I INPUT -s 124.45.0.0/16 -j DROP #封IP段即从123.45.0.1到123.45.255.254的命令
iptables -I INPUT -s 123.45.6.0/24 -j DROP #封IP段即从123.45.6.1到123.45.6.254的命令是
只对 OUTPUT,FORWARD,POSTROUTING 三个链起作用。
iptables -A FORWARD -o eth0
nat是网络地址转换的缩写。
局域网内的封包数据的传送流程:
nat表的PREROUTING链;filter表的FORWARD链;nat主机的关键的流程在第1,4步骤,也就是nat表的两条重要的链:PREROUTING和POSTROUTING,这两条链分别修改数据包的源ip地址和目的ip地址。又被分别称为SNAT和DNAT。
能够让多个内网机器通过一个外网的ip地址上网,解决了ip资源匮乏的问题,如下图:

需要将内网ip192.168.10.10转换为111.196.211.212, iptables可以配置为下:
iptables -t nat -A POSTROUTING -s 192.168.10.10 -o eth0 -j SNAT --to-source 111.196.211.212
若外网的ip地址不稳定,是动态变化的话,需要使用MASQUEREAD,能够自动的寻找外网地址并改为当前正确的外网ip地址。
iptables -t nat -A POSTROUTING -s 192.168.10.10/24 -j MASQUEREAD
能够让外网用户访问内网不同的ip地址(相当于SANT的反向代理),同样的示例如下:
由上图所知:目标地址192.168.10.6在路由转换前就是61.240.149.149,需要在网关上运行iptables的命令,将地址进行转换,命令如下:
iptables -t nat -A PREROUTING -i eth0 -s 61.240.149.149 -d 61.240.149.149 -p tcp --dport 80 -j DNAT --to-destination 192.168.10.6:80
表示网卡eth0传入,将80端口的数据导向到内网192.168.10.6机器的80端口上。
将80端口的数据转递到8080端口,这种方法常用在ssh端口的转递上。
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
语法:iptables -D chain rulenum [options],表示删除(-D)链(chains[INPUT/OUTPUT/FORWARD])上编号(rulenum)的规则,使用iptables -L INPUT –line-numbers来显示INPUT链上的规则且附带行号,然后iptables -D INPUT 4删除第四行的规则。
iptables -L INPUT –line-numbers显示filter表(默认)的INPUT链上的规则,且每一个规则上都有行号,如下:
num target prot opt source destination
1 REJECT tcp — anywhere anywhere tcp dpt:microsoft-ds reject-with icmp-port-unreachable
2 REJECT tcp — anywhere anywhere tcp dpt:135 reject-with icmp-port-unreachable
3 REJECT tcp — anywhere anywhere tcp dpt:netbios-ssn reject-with icmp-port-unreachable
4 REJECT udp — anywhere anywhere udp dpt:microsoft-ds reject-with icmp-port-unreachable
5 REJECT udp — anywhere anywhere udp dpt:135 reject-with icmp-port-unreachable
根据行号删除对应的规则即可:
iptables -D INPUT 4,表示删除行号为4的规则
保存iptables规则:service iptables save,它能把规则自动保存在/etc/sysconfig/iptables中。
查看状态:service iptables status
重启:service iptables restart
启动:service iptables start
停止:service iptables stop
永久关闭:chkconfig iptables off
永久关闭后启用:chkconfig iptables on
iptables -L
iptables -S -t nat
参考链接:
https://wangchujiang.com/linux-command/c/iptables.html
https://wiki.archlinux.org/index.php/iptables_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)
https://man.linuxde.net/iptables
https://www.zsythink.net/archives/1199
https://wiki.archlinux.org/index.php/iptables_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)