![将 iptables 链从基于端口更改为基于 ip](https://linux22.com/image/621568/%E5%B0%86%20iptables%20%E9%93%BE%E4%BB%8E%E5%9F%BA%E4%BA%8E%E7%AB%AF%E5%8F%A3%E6%9B%B4%E6%94%B9%E4%B8%BA%E5%9F%BA%E4%BA%8E%20ip.png)
我正在努力限制访问新的XenServer 6.2安装。盒子上的默认 iptables 规则有一个RH-Firewall-1-INPUT
向外界暴露相当多信息的链。
无需逐一添加并添加-s <ip range>
到每条规则(有很多),有没有办法默认将 IP 范围添加到所有规则中?
过去,我使用 INPUT DROP 和 FORWARD DROP 构建 iptables,然后将所有内容开放到内部网络,然后-j REJECT
忽略其余部分。Xen服务器规则似乎有点复杂,而且有一个无意的iptables 锁定将是一件坏事。
答案1
类似这样的方法应该可以奏效。我突然想到,我已经有一段时间没有使用 iptables 了。
# Create a whitelist chain
iptables -N whitelist
# Add some ip's to it
iptables -A whitelist -s 1.2.3.4/32 -j RETURN
iptables -A whitelist -s 2.3.4.5/32 -j RETURN
iptables -A whitelist -s 3.4.5.6/32 -j RETURN
# etc
# default drop on whitelist, no match - drop
iptables -P whitelist DROP
# Jump to the whitelist chain by default which will jump back if we get a match
iptables -A INPUT -j whitelist
# now back at your input chain
# All the normal rules follow
答案2
-j JUMP
如果 IP 符合您的范围,您可以制定一条规则,将该规则应用到另一条链,否则就放弃所有内容。
答案3
仅供参考,这些是默认的 XenServer 6.2 规则 - 基本上是常规的 RedHat 规则,因为 XenServer 基于 RedHat:
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT 47 -- * * 0.0.0.0/0 0.0.0.0/0
499M 1226G RH-Firewall-1-INPUT all -- * * 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 RH-Firewall-1-INPUT all -- * * 0.0.0.0/0 0.0.0.0/0
Chain OUTPUT (policy ACCEPT 187M packets, 1105G bytes)
pkts bytes target prot opt in out source destination
Chain RH-Firewall-1-INPUT (2 references)
pkts bytes target prot opt in out source destination
312K 429M ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
15842 1331K ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmp type 255
0 0 ACCEPT esp -- * * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT ah -- * * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT udp -- * * 0.0.0.0/0 224.0.0.251 udp dpt:5353
0 0 ACCEPT udp -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:631
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:631
0 0 ACCEPT udp -- xenapi * 0.0.0.0/0 0.0.0.0/0 udp dpt:67
497M 1223G ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
0 0 ACCEPT udp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW udp dpt:694
1 60 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
3 180 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:80
10474 543K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:443
1883K 2404M REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
因此,如果您想限制对已知范围的访问(例如192.168.0.0/24
),您可以执行以下操作:
iptables -I INPUT -s ! 192.168.0.0/24 -j REJECT
这将拒绝任何不来自该源地址的内容,因此其余规则仅适用于该源范围。
如果您有多个受信任的来源,则需要使用像@Matt所说的新链(尽管您应该使用-j RETURN
而不是-j INPUT
)