iptables 用于检查、修改、转发、重定向和丢弃 IP 数据包。
过滤 IP 数据包的代码已经内置在内核中,并被组织成一组表,每个表都有特定的用途。
每个规则由一个潜在匹配的谓词和一个对应的操作(称为目标)组成。
iptables允许用户使用这些链和规则
小写是表,大写是链。
所有(无论内部外部)进入网卡的IP数据包都必须经历这个流程!
netfilter位于内核空间,是真正的防火墙框架。
iptables在用户空间,可以控制安全框架。
常用的表为filter和nat。
表由链组成,链是按顺序遵循的规则列表。
缺省情况下,没有一个链包含规则。将规则附加到想要使用的链上由用户自己决定。
链有一个默认策略,通常将其设置为ACCEPT,但如果希望确保没有任何东西能通过规则集,则可以将其重置为DROP。
使用-j或–jump选项指定目标。
/etc/iptables/iptables.rules
中安装了一组空的规则,当你第一次启动iptables.service单元时将加载这些规则。IPv6的iptables规则默认保存在
/etc/iptables/ip6tables.rules
中,由ip6tables.service读取。
iptables-save -f /etc/iptables/iptables.rules
iptables-restore /etc/iptables/iptables.rules
student@6858-v20:~$ sudo iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
student@6858-v20:~$ sudo iptables -nvL
Chain INPUT (policy ACCEPT 1059 packets, 89762 bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 1051 packets, 88652 bytes)
pkts bytes target prot opt in out source destination
如果输出像上面那样,那么在默认的过滤表中没有规则(即没有阻塞)。
可以使用-t选项指定其他表。
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -t raw -F
iptables -t raw -X
iptables -t security -F
iptables -t security -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP
Dropbox的局域网同步功能每30秒向它能看到的所有计算机广播数据包。如果我们碰巧与Dropbox客户端在局域网中,并且没有使用该功能,那么我们可能会希望拒绝这些数据包。
iptables -A INPUT -p tcp --dport 17500 -j REJECT --reject-with icmp-port-unreachable
student@6858-v20:~$ sudo iptables -nvL --line-numbers
Chain INPUT (policy ACCEPT 67 packets, 5771 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 REJECT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:17500 reject-with icmp-port-unreachable
Chain FORWARD (policy DROP 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 55 packets, 5174 bytes)
num pkts bytes target prot opt in out source destination
注意:这里我们使用REJECT而不是DROP,因为RFC 1122要求主机尽可能地返回ICMP错误,而不是丢弃数据包。这一页解释了为什么拒绝包几乎总是比DROP包更好。
iptables -R INPUT 1 -p tcp --dport 17500 ! -s 10.0.0.85 -j REJECT --reject-with icmp-port-unreachable
student@6858-v20:~$ sudo iptables -nvL --line-numbers
Chain INPUT (policy ACCEPT 21 packets, 1849 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 REJECT tcp -- * * !10.0.0.85 0.0.0.0/0 tcp dpt:17500 reject-with icmp-port-unreachable
我们现在已经用一个允许10.0.0.85访问17500端口的规则替换了原来的规则。
iptables -I INPUT -p tcp --dport 17500 -s 10.0.0.85 -j ACCEPT -m comment --comment "Friendly Dropbox"
student@6858-v20:~$ sudo iptables -nvL --line-numbers
Chain INPUT (policy ACCEPT 19 packets, 1857 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 ACCEPT tcp -- * * 10.0.0.85 0.0.0.0/0 tcp dpt:17500 /* Friendly Dropbox */
2 0 0 REJECT tcp -- * * !10.0.0.85 0.0.0.0/0 tcp dpt:17500 reject-with icmp-port-unreachable
Chain FORWARD (policy DROP 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 16 packets, 1892 bytes)
num pkts bytes target prot opt in out source destination
iptables -R INPUT 2 -p tcp --dport 17500 -j REJECT --reject-with icmp-port-unreachable
student@6858-v20:~$ sudo iptables -nvL --line-numbers
Chain INPUT (policy ACCEPT 19 packets, 1656 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 ACCEPT tcp -- * * 10.0.0.85 0.0.0.0/0 tcp dpt:17500 /* Friendly Dropbox */
2 0 0 REJECT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:17500 reject-with icmp-port-unreachable
Chain FORWARD (policy DROP 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 15 packets, 2224 bytes)
num pkts bytes target prot opt in out source destination
ipset create upnp hash:ip,port timeout 3
timeout是接受客户端响应的时间窗口。
iptables -A OUTPUT -d 239.255.255.250/32 -p udp -m udp -j SET --add-set upnp src,src --exist
iptables -A INPUT -p udp -m set --match-set upnp dst,dst -j ACCEPT
LOG目标可以用来记录命中规则的数据包。与其他目标(如ACCEPT或DROP)不同,包在命中LOG目标后将继续在链中移动。
创建链
iptables -N logdrop
iptables -A logdrop -m limit --limit 5/m --limit-burst 10 -j LOG
iptables -A logdrop -j DROP
limit和limit-burst选项解释如下。
iptables -A INPUT -m conntrack --ctstate INVALID -j logdrop
/var
分区)。iptables -A logdrop -m limit --limit 5/m --limit-burst 10 -j LOG
journalctl -k --grep="IN=.*OUT=.*"
# Replace
filter f_everything { level(debug..emerg) and not facility(auth, authpriv); };
# To
filter f_everything { level(debug..emerg) and not facility(auth, authpriv) and not filter(f_iptables); };
这将停止将iptables输出记录到
/var/log/everything.log
。
/var/log/iptables.log
的文件中,可以简单地改变目标d_iptables的文件值(仍然在syslog-ng.conf中):destination d_iptables { file("/var/log/iptables.log"); };
> 这将停止将iptables输出记录到`/var/log/everything.log`。
* 如果你也想让iptables记录到不同于`/var/log/iptables.log`的文件中,可以简单地改变目标d_iptables的文件值(仍然在syslog-ng.conf中):
```bash
destination d_iptables { file("/var/log/iptables.log"); };