将 iptables 链从基于端口更改为基于 ip

将 iptables 链从基于端口更改为基于 ip

我正在努力限制访问新的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

相关内容