Linux中使用iptables进行端口转发

在日常的运维工作中,比如有好几台云服务器,但只有一台带有公网IP,其余内网直连,但是针对特殊场景需要把不带有公网IP的某些端口通过带有公网IP的进行转发,实现端口转发的工具或者软件有很多,比如rinetd、nginx等,或者使用iptables的内核转发功能也可以实现,本文主要是使用iptables来实现自动添加、删除、查看端口号

#!/bin/bash

# 检查内核是否已启用 IP 转发
if [[ $(cat /proc/sys/net/ipv4/ip_forward) -ne 1 ]]; then
    echo "IP 转发没有开启,现在开启它。"
    sudo echo 1 > /proc/sys/net/ipv4/ip_forward
fi

# 检查是否安装了 lsof
if ! command -v lsof &> /dev/null; then
    echo "lsof 未安装,正在尝试安装..."

    # 检测操作系统类型并安装 lsof
    if [[ -f /etc/os-release ]]; then
        . /etc/os-release

        case $ID in
            debian|ubuntu)
                sudo apt-get update
                sudo apt-get install -y lsof
                ;;
            centos|rhel|fedora)
                sudo yum install -y lsof
                ;;
            *)
                echo "不支持的操作系统类型。请手动安装lsof。"
                exit 1
                ;;
        esac
    else
        echo "无法检测操作系统类型。请手动安装lsof。"
        exit 1
    fi
fi

# 添加端口转发的函数
add_nat() {
    echo "请输入本机的端口:"
    read LOCAL_PORT

    # 检查端口是否已经被占用
    if lsof -i :$LOCAL_PORT > /dev/null; then
        echo "端口 $LOCAL_PORT 在这台机器上已经被占用。"
        exit 1
    fi

    echo "请输入目标 IP:端口(例如 192.168.1.10:22):"
    read DEST

    # 检查输入格式
    if [[ ! $DEST =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+:[0-9]+$ ]]; then
        echo "目标 IP 或端口格式不正确。"
        exit 1
    fi

    # 添加到 iptables
    sudo iptables -t nat -A PREROUTING -p tcp --dport $LOCAL_PORT -j DNAT --to-destination $DEST
    echo "端口转发已添加。"
}

# 删除端口转发的函数
delete_nat() {
    echo "请输入要删除的本机端口:"
    read LOCAL_PORT

    echo "请输入目标的IP和端口 (如 192.168.0.18:6379):"
    read DEST

    # 检查规则是否存在并删除
    if sudo iptables -t nat -L PREROUTING -n -v | grep "dpt:$LOCAL_PORT" | grep "$DEST" > /dev/null; then
        sudo iptables -t nat -D PREROUTING -p tcp --dport $LOCAL_PORT -j DNAT --to-destination $DEST
        echo "端口转发已删除。"
    else
        echo "未找到相应的规则。"
    fi
}

# 显示现有端口转发的函数
list_nat() {
    echo "当前的端口转发规则:"
    sudo iptables -t nat -L PREROUTING -n -v | grep DNAT
}

# 主逻辑
case "$1" in
    add) add_nat ;;
    del) delete_nat ;;
    list) list_nat ;;
    *) echo "使用方式:$0 {add|del|list}" ;;
esac

使用方法:bash nat.sh add 添加  list、查看、del删除

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux系统,可以使用iptables命令实现端口转发iptables是用于实现防火墙、数据转发等功能的工具。iptables具有不同的表(tables),每个表都包含多个链(chains),每条链都包含一个或多个规则(rules)。 要在Linux系统进行端口转发,可以使用以下命令: 1. 端口转发到本地其他端口iptables -t nat -A PREROUTING -p tcp --dport [源端口号] -j REDIRECT --to-port [目标端口号] 例如,要将本机的2222端口转发到本机的22端口,可以使用以下命令: iptables -t nat -A PREROUTING -p tcp --dport 2222 -j REDIRECT --to-port 22 2. 端口转发到其他机器: iptables -t nat -A PREROUTING -d [本机IP地址] -p tcp --dport [源端口号] -j DNAT --to-destination [目标IP地址]:[目标端口号] iptables -t nat -A POSTROUTING -d [目标IP地址] -p tcp --dport [目标端口号] -j SNAT --to [本机IP地址] 例如,要将本机的192.168.172.130的8000端口转发到192.168.172.131的80端口,可以使用以下命令: iptables -t nat -A PREROUTING -d 192.168.172.130 -p tcp --dport 8000 -j DNAT --to-destination 192.168.172.131:80 iptables -t nat -A POSTROUTING -d 192.168.172.131 -p tcp --dport 80 -j SNAT --to 192.168.172.130 注意,以上命令只是示例,实际使用时需要根据实际情况进行相应的修改。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Linux端口转发的几种常用方法](https://blog.csdn.net/u010680373/article/details/124779749)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [iptables学习笔记:端口转发之“外网访问内网”](https://blog.csdn.net/subfate/article/details/52659446)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值