2024年4月25日 星期四 更新 firewalld 端口转发并限制连接ip
CUSTOMPORT=$(netstat -tlpn | grep 0.0.0.0.*ssh | cut -d: -f2 | cut -f1 -d\ )
SOURCE_IP=1.2.3.4
firewall-cmd --zone=public --permanent --query-masquerade
firewall-cmd --zone=public --permanent --add-masquerade
firewall-cmd --zone=public --permanent --add-rich-rule="rule family=\"ipv4\" source address=\"${SOURCE_IP}\" forward-port port=\"22\" protocol=\"tcp\" to-port=\"${CUSTOMPORT}\""
firewall-cmd --reload
# 添加规则
firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=10.17.16.17 forward-port port=3102 protocol=tcp to-port=3389 to-addr=192.168.56.102'
# 删除规则
firewall-cmd --permanent --remove-rich-rule='rule family=ipv4 source address=10.17.16.17 forward-port port=3102 protocol=tcp to-port=3389 to-addr=192.168.56.102'
参考https://serverfault.com/questions/756138/how-to-port-forward-with-firewalld-depending-on-source-ip
如果 ubuntu 上没有 firewall-cmd 就安装一个,卸载原有的 uwf 防火墙管理工具 卸载 uwf
sudo apt remove ufw
安装 firewalld
sudo apt update
sudo apt install firewalld
# 启动
sudo systemctl start firewalld
# 设置开机自启动
sudo systemctl enable firewalld
# 永久放开 80 端口
sudo firewall-cmd --zone=public --add-port=80/tcp --permanent
# 重启防火墙生效
firewall-cmd --reload
如果此时放开的端口不起作用,设置一下 iptables 允许所有流量通过
sudo iptables -P INPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -P OUTPUT ACCEPT
sudo iptables -t nat -F
sudo iptables -t mangle -F
sudo iptables -F
sudo iptables -X
设置默认策略为所有流量通过
sudo iptables -P INPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -P OUTPUT ACCEPT
保存规则
sudo iptables-save > /etc/sysconfig/iptables
重启服务
sudo systemctl restart iptables
查看规则
sudo iptables -L -v -n
状态:# systemctl status firewalld 或者 firewall-cmd --state(查看防火墙开启关闭状态)
启动:# systemctl start firewalld
停止:# systemctl stop firewalld
自启动:# systemctl enable firewalld (可让防火墙开机自启动,防火墙默认开机不启动的,需手动启动)
禁用:# systemctl disable firewalld
首先开启IP转发功能,默认是关闭的。 临时修改:
echo 1 >/proc/sys/net/ipv4/ip_forward 修改过后就马上生效,但如果系统重启后则又恢复为默认值0。
# 找到下面的值并将0改成1
vi /etc/sysctl.conf
# sysctl -p(使之立即生效)
net.ipv4.ip_forward = 1
firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080 --permanent # 将80端口的流量转发至8080
firewall-cmd --add-forward-port=port=80:proto=tcp:toaddr=192.168.1.0.1 --permanent # 将80端口的流量转发至192.168.0.1
firewall-cmd --add-forward-port=port=80:proto=tcp:toaddr=192.168.0.1:toport=8080 --permanent # 将80端口的流量转发至192.168.0.1的8080端口
firewall-cmd --add-forward-port=port=58888:proto=tcp:toaddr=47.97.184.137:toport=80 --permanent # 将58888端口的流量转发至47.97.184.137的80端口
要删除之前设置的转发规则,把以上命令中的--add-forward-port改为--remove-forward-port运行一次即可。
firewall-cmd --permanent --zone=public --remove-forward-port=port=58888:proto=tcp:toaddr=47.97.184.137:toport=8888
firewall-cmd --reload
firewall-cmd --list-all #查询所有配置
参考https://www.fzxm.cn/help/20210419213836001.html
使用Portproxy模式下的Netsh命令即能实现Windows系统中的端口转发,转发命令如下:
netsh interface portproxy add v4tov4 listenaddress=[localaddress] listenport=[localport] connectaddress=[destaddress]
listenaddress – 等待连接的本地ip地址 listenport – 本地监听的TCP端口(待转发) connectaddress – 被转发端口的本地或者远程主机的ip地址 connectport – 被转发的端口
举个例子,服务器内网IP是172.16.0.4,需要将8080端口转发到国外服务器104.104.104.104的9999端口,那么命令如下:
netsh interface portproxy add v4tov4 listenaddress=172.16.0.4 listenport=8080 connectaddress=104.104.104.104 connectport=9999
上面这条命令有时不起作用,需要改为 0.0.0.0
netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=8080 connectaddress=104.104.104.104 connectport=9999
下面的命令是用来展示系统中的所有转发规则:
netsh interface portproxy show v4tov4
删除刚才创建的那个转发的命令:
netsh interface portproxy delete v4tov4 listenaddress=172.16.0.4 listenport=8080
该命令的常用参数如下:
netstat -ano | find listenport 查看是否启动成功 netsh interface portproxy show all 显示系统中的转发规则列表 netsh interface portproxy dump 查看portproxy设置 netsh interface portproxy delete v4tov4 listenport=localport listenaddress=localaddress netsh interface portproxy reset 清除所有端口转发规则
参考https://kekxv.github.io/2021/08/07/Port%20forwarding%20that%20comes%20with%20Windows/