第一步:启用IPv4转发功能

echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p

第二步:开启firewall伪装(此步骤非常重要)

firewall-cmd --add-masquerade --permanent

第三步:添加转发端口和远程IP以及端口

firewall-cmd --add-forward-port=port=本地端口:proto=tcp:toport=远程端口:toaddr=远程IP --permanent

都添加完以后,最后一步重载防火墙使其生效

firewall-cmd --reload


附赠一个转发小脚本

#!/bin/bash
#install firewall and forward port
# 颜色
red='\033[0;31m'
green='\033[0;32m'
yellow='\033[0;33m'
plain='\033[0m'

addForwardPort() {
  while true
  do
  read -p "请输入本地端口:" local_port
  local_ports=($(firewall-cmd --list-forward-ports | awk '{print $1}'|tr 'n' " "))
  spResult=0
  for ((i=1;i<=${#local_ports[@]};i++ )); do
      local_p="${local_ports[$i-1]}"
      port_str=${local_p%%:proto*}
      port_str=$(echo ${port_str} | tr -cd "[0-9]")
      if [ "$local_port" -eq "$port_str" ]; then
          spResult=1
          echo -e "[${red}错误:${plain} 该端口已经存在,规则如下]"
          echo -e "[${green}${local_p}${plain}]"
          break
      fi
  done
  if [ "$spResult" -eq 1 ]; then
    continue
  fi
  read -p "请输入NAT IP:" nat_ip
  read -p "请输入NAT端口:" nat_port

  firewall-cmd --permanent --add-forward-port=port=${local_port}:proto=tcp:toaddr=${nat_ip}:toport=${nat_port} > /dev/null
  firewall-cmd --permanent --add-forward-port=port=${local_port}:proto=udp:toaddr=${nat_ip}:toport=${nat_port} > /dev/null
  firewall-cmd --permanent --add-port=${local_port}/tcp > /dev/null
  firewall-cmd --permanent --add-port=${local_port}/udp > /dev/null
  firewall-cmd --reload > /dev/null
  echo -e "   ${green}设置成功!${plain}"
  break
  done
}
removeForwardPort() {
  local_ports=($(firewall-cmd --list-forward-ports | awk '{print $1}'|tr 'n' " "))
  while true
  do
  echo -e "请选择一个端口进行删除:"
  for ((i=1;i<=${#local_ports[@]};i++ )); do
      local_p="${local_ports[$i-1]}"
      echo -e "${green}${i}${plain}) ${local_p}"
  done
  read -p "请输入序号(默认: 1):" input_number
  [ -z "$input_number" ] && input_number=1
  expr ${input_number} + 1 &>/dev/null
  if [ $? -ne 0 ]; then
      echo -e "[${red}错误:${plain}] 请输入一个数字"
      continue
  fi
  if [[ "$input_number" -lt 1 || "$input_number" -gt ${#local_ports[@]} ]]; then
      echo -e "[${red}错误:${plain}] 请输入一个数字 1 - ${#local_ports[@]}"
      continue
  fi
  remove_content=${local_ports[$input_number-1]}
  firewall-cmd --permanent --remove-forward-port=${remove_content} > /dev/null
  port_str=${remove_content%%:proto*}
  port_str=$(echo ${port_str} | tr -cd "[0-9]")
  [[ $remove_content =~ "tcp" ]] && firewall-cmd --permanent --remove-port=${port_str}/tcp > /dev/null
  [[ $remove_content =~ "udp" ]] && firewall-cmd --permanent --remove-port=${port_str}/udp > /dev/null
  firewall-cmd --reload > /dev/null
  echo -e "   ${green}删除成功!${plain}"
  break
  done
}
showForwardPort() {
  local_ports=($(firewall-cmd --list-forward-ports | awk '{print $1}'|tr 'n' " "))
  for ((i=1;i<=${#local_ports[@]};i++ )); do
      local_p="${local_ports[$i-1]}"
      echo -e "${green}${i}${plain}) ${local_p}"
  done
}
while true
do
echo -e "   ${green}1:${plain}添加一个端口转发"
echo -e "   ${green}2:${plain}删除一个端口转发"
echo -e "   ${green}3:${plain}查看所有已开启规则"
read -p "请输入序号:" input_port
if [ "$input_port" -eq 1 ]; then
    addForwardPort
    break
fi
if [ "$input_port" -eq 2 ]; then
    removeForwardPort
    break
fi
if [ "$input_port" -eq 3 ]; then
    showForwardPort
    break
fi
echo -e "[${red}输入有误,请重新输入${plain}]"
done