iptables防火墙 只允许某IP访问某端口、访问特定网站

<think>我们参考用户提供的引用和之前的问题,用户希望配置Linux服务器只允许特定IP访问22端口(SSH服务)。根据引用[1]和[2],我们可以使用firewalld(适用于CentOS 7等系统)或sshd配置(通过AllowUsers/DenyUsers)来实现。根据引用[3]和[4],也可以使用iptables(适用于Ubuntu等系统)来实现。 考虑到用户可能使用不同的Linux发行版,我们提供两种主流方法:firewalld(适用于使用systemd的现代发行版)和iptables(通用方法)。另外,也可以考虑通过配置sshd服务来实现(但这种方法通常用于限制用户而非IP,且如果IP变化则不够灵活,因此不作为首选)。 注意:在操作前,请确保已经有一个允许IP地址可以访问服务器,以免在配置过程中失去连接。 方法一:使用firewalld(推荐用于CentOS/RHEL 7+) 步骤: 1. 移除默认的SSH服务规则(因为默认规则允许所有IP访问22端口): sudo firewall-cmd --permanent --remove-service=ssh 2. 添加新的规则,允许特定IP(例如192.168.0.11)访问22端口: sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.0.11" port port="22" protocol="tcp" accept' 3. 重新加载防火墙: sudo firewall-cmd --reload 4. 验证规则: sudo firewall-cmd --list-all 方法二:使用iptables(通用,适用于大多数Linux发行版) 步骤: 1. 首先禁止所有IP访问22端口: sudo iptables -A INPUT -p tcp --dport 22 -j DROP 2. 然后允许特定IP(例如192.168.0.11)访问22端口: sudo iptables -I INPUT -s 192.168.0.11 -p tcp --dport 22 -j ACCEPT 注意:规则的顺序很重要,因为iptables按顺序匹配。这里使用-I(插入)将允许规则放在DROP规则之前,确保特定IP的包先被允许。也可以先添加允许规则再添加拒绝规则,这样允许规则会先被匹配。 3. 保存iptables规则(不同发行版保存方式不同): - 对于使用iptables-persistent的Ubuntu/Debian: sudo netfilter-persistent save 或 sudo /etc/init.d/iptables save - 对于CentOS/RHEL 6及以下: service iptables save - 对于CentOS/RHEL 7+,需要安装iptables-services并启用: sudo yum install iptables-services sudo systemctl enable iptables sudo service iptables save 方法三:通过配置sshd服务(/etc/ssh/sshd_config) 在配置文件中可以使用AllowUsers或DenyUsers来限制用户登录的源IP,例如: AllowUsers root@192.168.0.11 user1@192.168.1.0/24 这表示允许root用户从192.168.0.11登录,user1用户从192.168.1.0/24网段登录。 然后重启sshd服务:sudo systemctl restart sshd 注意:这种方法限制的是用户和IP的组合,如果只想限制IP而不限制用户,可能需要为每个用户指定IP,或者使用类似TCP Wrappers(hosts.allow和hosts.deny)的方法。但这种方法不如防火墙直接,且如果用户很多则配置繁琐。 根据用户需求,我们推荐使用防火墙(firewalld或iptables)来实现。 重要提示:在配置防火墙规则时,请确保当前会话不会因为规则生效而断开。建议在操作前打开另一个会话测试配置,或者使用允许IP进行配置,并在配置后立即测试。 现在,我们按照用户要求生成相关问题。</think>### 配置Linux服务器仅允许特定IP访问SSH端口(22) 以下是两种主流方法实现IP访问限制,操作前请**确保当前SSH会话不会中断**(建议在服务器本地操作或保持多个连接): --- #### 方法一:使用 `firewalld`(推荐用于CentOS/RHEL 7+) ```bash # 1. 移除默认SSH规则(允许所有IP) sudo firewall-cmd --permanent --remove-service=ssh # 2. 添加特定IP规则(将192.168.0.11替换为实际IP) sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.0.11" port port="22" protocol="tcp" accept' # 3. 应用配置 sudo firewall-cmd --reload # 4. 验证规则 sudo firewall-cmd --list-all | grep 'rule.*22' # 应显示: rule source ipv4 address="192.168.0.11" port port="22" protocol="tcp" accept ``` > **关键说明**: > - 使用 `--permanent` 确保重启后规则保留 > - 允许多个IP时重复执行步骤2 > - 允许IP段使用CIDR格式如 `192.168.1.0/24` --- #### 方法二:使用 `iptables`(通用方法) ```bash # 1. 清空现有规则(谨慎操作!) sudo iptables -F # 2. 设置默认策略(拒绝所有输入) sudo iptables -P INPUT DROP # 3. 允许特定IP访问22端口 sudo iptables -A INPUT -p tcp -s 192.168.0.11 --dport 22 -j ACCEPT # 4. 允许本地回环 sudo iptables -A INPUT -i lo -j ACCEPT # 5. 保存规则(依系统而定) # Ubuntu/Debian: sudo apt install iptables-persistent sudo netfilter-persistent save # CentOS/RHEL: sudo service iptables save ``` --- #### 验证配置是否生效 ```bash # 从允许IP测试 ssh user@server_ip # 应正常连接 # 从其他IP测试(使用-n阻止实际登录) ssh -n -v -o ConnectTimeout=5 user@server_ip # 预期输出: Connection timed out ``` --- ### ⚠️ 重要注意事项 1. **防锁定策略**:操作前在本地终端添加临时规则允许当前IP: ```bash sudo iptables -I INPUT -p tcp -s $(who | awk '{print $5}') --dport 22 -j ACCEPT ``` 2. **配置备份**: ```bash # firewalld sudo cp /etc/firewalld/zones/public.xml /backup/ # iptables sudo iptables-save > ~/iptables_backup.rules ``` 3. **替代方案**:通过SSH配置文件限制(`/etc/ssh/sshd_config`): ```config AllowUsers *@192.168.0.11 # 允许IP所有用户 DenyUsers * # 拒绝其他所有 ``` 重启服务:`sudo systemctl restart sshd` > 引用来源:[1][2][4] --- ### 相关问题 1. **如何测试防火墙规则是否生效而不中断当前连接?** 2. **配置错误导致SSH锁定时,如何通过服务器控制台恢复访问?** 3. **如何设置允许动态公网IP(如家庭宽带)访问SSH端口?** 4. **除22端口外,如何限制其他服务端口(如80/443)的IP访问?** 5. **firewalld和iptables规则冲突时如何排查解决?**
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值