iptables命令介绍(二)
iptables man手册: https://linux.die.net/man/8/iptables iptables中文文档: https://www.frozentux.net/iptables-tutorial/cn/iptables-tutorial-cn-1.1.19.html 备用链接: https://soulchild.cn/iptables
一、iptables命令行语法格式
格式: iptables [-t table] command [match] [target]
-t table
: 指定表名,不指定默认是filter表COMMAND
: 告诉iptables我们要做什么,比如添加规则、删除规则、替换规则、修改规则、插入规则等等match
: 要对哪些数据包做操作,可以指定包的来源IP地址,网络接口,端口,协议类型等等来选择数据包target
: 指定要执行的操作,比如DROP、ACCEPT、SNT、DNAT。(可在中文文档6.5部分查阅)
下图引自: https://www.cnblogs.com/kevingrace/p/6265113.html
二、iptables的COMMAND(https://soulchild.cn/iptables/#COMMANDS)
-A chain
: 在指定的链中追加规则(尾部)-I chain [rulenum]
: 在指定的链中插入规则(默认在首部,可以指定规则编号)-D chain [rulenum]
: 删除指定链中的规则(默认删除最后一个)-R chain [rulenum]
: 替换指定链中的规则-F
: 清除指定的链中的规则(如果未指定链,则清除表中的所有链的规则)-N
: 自定义新链-X
: 删除自定义链(必须是空链)-L
: 列出所选链中的所有规则- -n以数字显示端口信息
- -v|-vv显示规则的详细信息(包括每个规则匹配到的数据包数量)
- –line 显示规则编号
Z
: 将指定表中的所有链的字节和数据包计数器清零-P
: 修改指定链中的默认规则,所有规则不能匹配的时候会使用默认规则
三、matches(匹配条件https://soulchild.cn/iptables/#MATCHES)
介绍一些常用的
-p, --protocol
: 匹配协议,不同协议有不同的匹配参数.不指定协议默认为所有协议
- tcp和udp协议
--tcp-flags
: 此选项是tcp协议的。 该选项有两个列表类型的参数。- 第一个列表指定我们要检查的标志位。
- 第二个列表指定 在第一个列表中出现过的且必须被设为1的标志位,第一个列表中其他的标志位必须置0
- 比如:
-p tcp --tcp-flags SYN,ACK,FIN SYN,ACK
,这里匹配的是SYN和ACK为1,FIN为0的数据包
-m multiport
: 让下面的选项支持匹配多个端口,写法22,53,80,110。并且支持--ports
参数,--ports
代表了源和目的端口--sport, --source-port
: 源端口--dport, --destination-port
: tcp包的目的端口
-s, --src, --source
: 匹配源地址
-d, --dst, --destination
: 匹配目标地址
-i, --in-interface
: 匹配从网络接口进来的数据包,只能用于INPUT,FORWARD和 PREROUTING这三个链
-o, --out-interface
: 匹配从网络接口出去的数据包
-f, --fragment
: 用来匹配一个被分片的包的第二片或及以后的部分。
-m --state
: 指定要匹配包的的状态,有4种状态可用:INVALID,ESTABLISHED,NEW和RELATED。
INVALID
: 意味着这个包没有已知的流或连接与之关联,也可能是它包含的数据或包头有问题。ESTABLISHED
: 意思是包是完全有效的,而且属于一个已建立的连接,这个连接的两端都已经有数据发送。NEW
: 表示包将要或已经开始建立一个新的连接RELATED
: 说明包正在建立一个新的连接,这个连接是和一个已建立的连接相关的。比如FTP-data和FTP-control就是RELATED
关系
四、target( 执行的动作https://soulchild.cn/iptables/#TARGETS )
target决定符合条件的包到何处去,语法是--jump target
或-j target
。
我们在filter表中建一个名为tcp_packets的链:iptables -N tcp_packets
然后再把它作为jump的target:iptables -A INPUT -p tcp -j tcp_packets
这样我们就会从INPUT链跳入tcp_packets链,开始在tcp_packets中的旅行。如果到达了tcp_packets链后,未被链中的任何规则匹配,则会退到INPUT链的下一条规则继续它的旅行。如果在子链(tcp_packets)中被ACCEPT了,也就相当于在父链中被ACCEPT了,那么它不会再经过父链中的其他规则。但要注意这个包能被其他表的链匹配,过程可以参考表的优先级。
target指定我们要对包做的操作,比如DROP和ACCEPT等等,下面介绍一些常用的。
-j ACCEPT
: 放行
-j DROP
: 丢弃
-j REJECT
: 与DROP
的区别是,REJECT就向客户端响应一个错误信息,可以通过--reject-with
选项来控制(默认port-unreachable
),可用选项如下
icmp-net-unreachable
: 网络不可达icmp-host-unreachable
: 主机不可达icmp-port-unreachable
: 端口不可达icmp-proto-unreachable
: 协议不可达icmp-net-prohibited
: 目的网络被强制禁止icmp-host-prohibited
: 目的主机被强制禁止
-j LOG
: LOG只会记录包的相关信息.可以在/var/log/messages中查看。(详细介绍https://soulchild.cn/iptables/#LOGTARGET)
-j ULOG
: 支持将LOG写到数据库中
-j DNAT
: 目的网络地址转换。通常用于外部访问内部。
- 例如:
iptables -t nat -A PREROUTING -d 15.45.23.67 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.1-192.168.1.10
。 - 需要注意:数据包发向内部主机后,会向源地址响应,但是客户端请求的是iptables主机,这样的话tcp无法握手成功。需要将内部主机的网关指向iptables主机。或者在加一条SNAT规则将源地址改为本地IP(
iptables -t nat -A POSTROUTING -p tcp --dport 80 -j SNAT --to-source 192.168.1.150
)
-j SNAT
: 源网络地址转换。通常用于内部访问外部
- 例如:
iptables -t nat -A POSTROUTING -p tcp --dport 80 -j SNAT --to-source 192.168.10.150
-j MASQUERADE
: 和SNAT的作用是一样的,区别就是它不需要指定–to-source。而是自动获取网卡的IP地址,如果条件允许建议使用SNAT
-j REDIRECT
: 将数据包的端口重定向到本机另一个端口(适用于本地端口的转发(效率高),DNAT适合外部主机的转发)。
- 例如:
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
-j RETURN
: 它使包返回上一层,顺序是:子链——>父链——>默认策略。具体地说,就是若包在子链中遇到了RETURN
,则返回父链的下一条规则继续进行条件的比较,若是在父链(或称主链,比如INPUT)中遇到了RETURN,就要应用默认的策略(一般是ACCEPT或DROP)。
-j NOTRACK
: 对指定的包不做状态追踪
- 例如:
iptables -t raw -I PREROUTING -p tcp --dport 22 -j NOTRACK
iptables -t raw -I OUTPUT -p tcp --dport 22 -j NOTRACK
五、常用的例子
放行80端口
iptables -I INPUT -p tcp --dport 80 -j ACCEPT
将filter表的INPUT、OUTPUT链默认规则改为DROP
|
|
开放本地回环地址
iptables -I INPUT -i lo -j ACCEPT
DNS服务器配置
|
|
允许内部ping外部,禁止外部ping内部
- 类型参考https://soulchild.cn/iptables/#TABLE.ICMPTYPES
0
: icmp应答包8
: icmp请求包
|
|