首页
Search
1
360v6路由器TFTP刷OpenWRT教程 分享不死uboot和扩容大分区文件
1,364 阅读
2
256MB内存小鸡DD Debian11系统的方法
1,154 阅读
3
单IP PVE配置虚拟机NAT联网 端口映射iptables
967 阅读
4
WAP.AC 美国 月付1刀 GIA+9929+CMIN2 VPS评测
794 阅读
5
Akile 台湾 月付6.66元 VPS评测
541 阅读
全部文章
硬件
软件
登录
Search
标签搜索
VPS
VPS评测
mjj
hostloc
美国VPS
dd系统
reinstall
zgocloud
荷兰VPS
新加坡VPS
wap.ac
9929
iptables
pve
AI
ChatGPT
Docker技巧
Linux脚本
Github
OpenWRT
百密一疏
累计撰写
21
篇文章
累计收到
16
条评论
首页
栏目
全部文章
硬件
软件
页面
搜索到
2
篇与
的结果
2023-11-27
单IP PVE配置虚拟机NAT联网 端口映射iptables
前提背景前些天买了个Colo99刀洛杉矶杜甫。E3 1240v3+16G+500G SSD。性价比很高。美中不足的是该机器只有一个IP。想跑PVE开虚拟机,必须要涉及到NAT,开始漫长查找资料,发现了一个大佬给出的方案参考:https://blog.csdn.net/god_sword_/article/details/128052598做了一些修改,可以完美实现功能大体的思路为,1.配置好NAT联网 2.iptables实现端口转发 3.配置开机自动恢复iptables配置一、配置好NAT联网PVE网络配置官方文档:https://pve.proxmox.com/wiki/Network_Configuration配置桥接网卡,使Proxmox VE(PVE)可以同时创建NAT虚拟机和独立IP虚拟机,同时可以使用脚本映射NAT虚拟机的端口到外网。1、开启ipv4、ipv6转发vim /etc/sysctl.conf文件最后加入如下配置net.ipv4.ip_forward=1 net.ipv4.conf.all.rp_filter=1 net.ipv4.icmp_echo_ignore_broadcasts=1 net.ipv4.conf.default.forwarding=1 net.ipv4.conf.default.proxy_arp = 0 net.ipv4.conf.default.send_redirects = 1 net.ipv4.conf.all.send_redirects = 0 net.ipv6.conf.eno1.autoconf=0 net.ipv6.conf.eno1.accept_ra=2 net.ipv6.conf.default.forwarding=1 net.ipv6.conf.all.forwarding=1 net.ipv6.conf.default.proxy_ndp=1 net.ipv6.conf.all.proxy_ndp=1配置Proxmox VE网卡文件信息 vim /etc/network/interfaces配置如下,我是一个单IP的杜甫,两个网口,正在使用的是eno1,后面还有个eno2,没有插网线,故不配置 auto lo iface lo inet loopback iface eno1 inet manual auto vmbr0 iface vmbr0 inet static address 198.46.xxx.xxx/30 gateway 198.46.xxx.xxx bridge-ports eno1 bridge-stp off bridge-fd 0 #物理网卡配置一般不做改动,系统模板都是配置好的。 #为虚拟机新建一个虚拟网桥 #内网地址,虚拟机的网关 auto vmbr1 iface vmbr1 inet static address 192.168.1.1 netmask 255.255.255.0 bridge-ports none bridge-stp off bridge-fd 0 post-up echo 1 > /proc/sys/net/ipv4/ip_forward post-up echo 1 > /proc/sys/net/ipv4/conf/eno1/proxy_arp #转发IPv4流量到虚拟机,使虚拟机与外网联通。 post-up iptables -t nat -A POSTROUTING -s '192.168.1.1/24' -o vmbr0 -j MASQUERADE post-down iptables -t nat -D POSTROUTING -s '192.168.1.1/24' -o vmbr0 -j MASQUERADE iface eno2 inet manual重启sudo service networking restart3、 搭建DHCP服务器(这个我没弄)此处使用的是ubuntu做dhcp服务器参考地址:https://blog.csdn.net/god_sword_/article/details/128055326二、配置端口转发4、 内外网端口映射转发#新增 iptables -t nat -A PREROUTING -p tcp -m tcp --dport 10022 -j DNAT --to-destination 10.10.10.100:22 #删除 (即把新增映射的-A改成-D) iptables -t nat -D PREROUTING -p tcp -m tcp --dport 10022 -j DNAT --to-destination 10.10.10.100:22 #查看NAT规则,并显示行号 iptables -t nat --list --line-number #删除指定行号的iptables规则 iptables -t nat -D POSTROUTING 10--------------------------------------------------------以下到分割线结尾本人没有使用,我手动敲上面的命令配的端口转发---------------------------------------------------------------4.1 使用ufwLinux原始的防火墙工具iptables由于过于繁琐,所以ubuntu系统默认提供了一个基于iptable之上的防火墙工具ufw。而UFW支持图形界面操作,只需在命令行运行ufw命令即能看到一系列的操作UFW 全称为Uncomplicated Firewall,是Ubuntu 系统上默认的防火墙组件, 为了轻量化配置iptables 而开发的一款工具。 UFW 提供一个非常友好的界面用于创建基于IPV4,IPV6的防火墙规则。 Linux 2.4内核以后提供了一个非常优秀的防火墙工具:netfilter/iptables,他免费且功能强大,可以对流入、流出的信息进行细化控制,它可以 实现防火墙、NAT(网络地址翻译)和数据包的分割等功能。netfilter工作在内核内部,而iptables则是让用户定义规则集的表结构。但是iptables的规则稍微有些“复杂”,因此ubuntu提供了ufw这个设定工具,以简化iptables的某些设定,其后台仍然是 iptables。ufw 即uncomplicated firewall的简称,参考地址:https://blog.csdn.net/god_sword_/article/details/1280887284.2 使用iptables端口映射可以使用iptables来完整,已经有大佬写了方便的脚本;脚本名称 iptables.sh#! /bin/bash PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH #ConfFile iptablesconf='/root/iptables.config.sh' function rootness(){ if [[ $EUID -ne 0 ]]; then echo "脚本需要以ROOT权限运行!" exit 1 fi } function conf_list(){ cat $iptablesconf } function conf_add(){ if [ ! -f $iptablesconf ];then echo "找不到配置文件!" exit 1 fi echo "请输入虚拟机的内网IP" read -p "(Default: Exit):" confvmip [ -z "$confvmip" ] && exit 1 echo echo "虚拟机内网IP = $confvmip" echo while true do echo "请输入虚拟机的端口:" read -p "(默认端口: 22):" confvmport [ -z "$confvmport" ] && confvmport="22" expr $confvmport + 0 &>/dev/null if [ $? -eq 0 ]; then if [ $confvmport -ge 1 ] && [ $confvmport -le 65535 ]; then echo echo "虚拟机端口 = $confvmport" echo break else echo "输入错误,端口范围应为1-65535!" fi else echo "输入错误,端口范围应为1-65535!" fi done echo while true do echo "请输入宿主机的端口" read -p "(默认端口: 8899):" natconfport [ -z "$natconfport" ] && natconfport="8899" expr $natconfport + 0 &>/dev/null if [ $? -eq 0 ]; then if [ $natconfport -ge 1 ] && [ $natconfport -le 65535 ]; then echo echo "宿主机端口 = $natconfport" echo break else echo "输入错误,端口范围应为1-65535!" fi else echo "输入错误,端口范围应为1-65535!" fi done echo "请输入转发协议:" read -p "(tcp 或者 udp ,回车默认操作: 退出):" conftype [ -z "$conftype" ] && exit 1 echo echo "协议类型 = $conftype" echo iptablesshell="iptables -t nat -A PREROUTING -i vmbr0 -p $conftype --dport $natconfport -j DNAT --to-destination $confvmip:$confvmport" if [ `grep -c "$iptablesshell" $iptablesconf` != '0' ]; then echo "配置已经存在" exit 1 fi get_char(){ SAVEDSTTY=`stty -g` stty -echo stty cbreak dd if=/dev/tty bs=1 count=1 2> /dev/null stty -raw stty echo stty $SAVEDSTTY } echo echo "回车继续,Ctrl+C退出脚本" char=`get_char` echo $iptablesshell >> $iptablesconf runreturn=`$iptablesshell` echo $runreturn echo '配置添加成功' } function add_confs(){ rootness conf_add } function del_conf(){ echo while true do echo "请输入宿主机的端口" read -p "(默认操作: 退出):" confserverport [ -z "$confserverport" ] && exit 1 expr $confserverport + 0 &>/dev/null if [ $? -eq 0 ]; then if [ $confserverport -ge 1 ] && [ $confserverport -le 65535 ]; then echo echo "宿主机端口 = $confserverport" echo break else echo "输入错误,端口范围应为1-65535!" fi else echo "输入错误,端口范围应为1-65535!" fi done echo iptablesshelldel=`cat $iptablesconf | grep "dport $confserverport"` if [ ! -n "$iptablesshelldel" ]; then echo "配置文件中没有该宿主机的端口" exit 1 fi iptablesshelldelshell=`echo ${iptablesshelldel//-A/-D}` runreturn=`$iptablesshelldelshell` echo $runreturn sed -i "/$iptablesshelldel/d" $iptablesconf echo '配置删除成功' } function del_confs(){ printf "你确定要删除配置吗?操作是不可逆的(y/n) " printf "\n" read -p "(默认: n):" answer if [ -z $answer ]; then answer="n" fi if [ "$answer" = "y" ]; then rootness del_conf else echo "配置删除操作取消" fi } action=$1 case "$action" in add) add_confs ;; list) conf_list ;; del) del_confs ;; *) echo "参数错误! [${action} ]" echo "用法: `basename $0` {add|list|del}" ;; esac脚本配置文件名称 iptables.config.sh#!/usr/bin/env bash上传iptables.sh和iptables.config.sh 脚本到宿主机root目录,或者直接在root目录下创建赋予iptables.config.sh可执行权限xxx自行更改,为配置文件的路径chmod +x /xxx/iptables.config.sh在 iptables.sh目录下执行一下命令根据提示进行添加或删除端口映射 #添加端口映射 bash iptables.sh add #删除端口映射 bash iptables.sh del 4.3 使用brook 进行统一控制这样,访问服务器10022端口就会自动转发到虚拟机10.10.10.100的22端口上,实现了外网通过ssh登陆虚拟机的目的。但是,这样做有一个问题,ProxmoxVE自带防火墙,iptables开放22端口,相当于在防火墙上面开了一个洞,而且这个洞不受防火墙的控制,如果需要做安全防护,你还需要单独配置iptables,不是很方便。于是想到一个折中办法,用brook做端口转发,同时利用ProxmoxVE的防火墙进行统一控制。获取brook,项目地址#version 版本 wget -O /root/brook https://github.com/txthinking/brook/releases/download/{version}/brook/brook_linux_xxx wget -O /root/brook https://github.com/txthinking/brook/releases/download/v20221212/brook_linux_amd64将brook移动到你想要放的地方赋予执行权限brook路径 需要自行修改chmod +x /brook路径/brook启动端口转发 from 宿主机端口。to 虚拟机的ip+端口#前台运行退出终端及结束转发 nohup /root/brook relay --from :10022 --to 10.10.10.100:22 #设置为后台运行 nohup /root/brook relay --from :10022 --to 10.10.10.100:22 > output 2>&1 &利用命令ps -ef|grep brook来查看转发是否生效,同时在ProxmoxVE防火墙中开放或者关闭10022端口来控制外网对虚拟机的访问。KVM虚拟机的配置是类似的,创建时选择桥接vmbr0,不论安装的是Linux系统还是windows系统,都需要手动输入IPv4和IPv地址,同时在主机配置IPv6信息和添加端口转发。若想实现开机自动启动端口映射,可以将上边命令写成shell脚本,并加入系统守护进程,写成service服务。brook开机自动执行端口转发命令创建brookforward.shvim /root/brookforward.sh写入以下命令#! /bin/sh nohup /root/brook relay --from :10022 --to 10.10.10.100:22 > output 2>&1赋予brookforward.sh执行权限chmod +x brookforward.sh!!! 注意若要使用systemD 将brookforward.sh实现开机自启动,以及服务自启。在.sh文件中nohup命令不能在最后加上&,让nohup命令保持后台运行,加上了该brookforward.service将会启动失败。创建 SystemD service 配文件vim /etc/systemd/system/brookforward.service写入以下信息# /etc/systemd/system/brookforward.service [Unit] Description=brookforward After=syslog.target After=network.target [Service] Type=simple ExecStart=/root/brookforward.sh Restart=always RestartSec=5 [Install] WantedBy=multi-user.targetReload SystemD 以加载新的配置文件:systemctl daemon-reload启动 brookforward 服务并设置开机自启:systemctl enable --now brookforward查看运行状态:systemctl status brookforward实现开机自启还可以将上边的brookforward.sh文件写入/etc/rc.local中,进行开机启动,但是不能实现服务自动重启。实现开机自启和服务自动重启还可以借助supervisor, Supervisor是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启。它是通过fork/exec的方式把这些被管理的进程当作supervisor的子进程来启动,这样只要在supervisor的配置文件中,把要管理的进程的可执行文件的路径写进去即可。也实现当子进程挂掉的时候,父进程可以准确获取子进程挂掉的信息的,可以选择是否自己启动和报警。supervisor还提供了一个功能,可以为supervisord或者每个子进程,设置一个非root的user,这个user就可以管理它对应的进程。有需要可以自行研究,参考以下操作因为没有开启ipv6,没有实操,仅供给有需要的参考这样,一个同时开启了NAT和IPv6的虚拟机就创建好了,但是,还有个问题,IPv6的配置和端口转发是会随着主机重启而失效,我们需要在主机上启动开机自启服务,保证每次开机的时候,虚拟机器都能正常工作。需要在PVE中开启开机自启服务,创建/etc/rc.local。#!/bin/sh -e # # rc.local # # This script is executed at the end of each multiuser runlevel. # Make sure that the script will "exit 0" on success or any other # value on error. # # In order to enable or disable this script just change the execution # bits. # # By default this script does nothing. exit 0赋予执行权限chmod +x /etc/rc.local启动服务systemctl start rc-local这样,我们只需要将需要执行的命令写在/etc/rc.local的exit 0前面,就可以在开机后自动执行。-----------------------------------------------------分割线-------------------------------------------------------三、母鸡iptables重启恢复如上操作完成之后,母鸡重启后,iptables配置会全部丢失,进行如下设置配置持久化使用iptables保存机制在设置好了iptables规则后,下次重启后还是会被清除,所以我们需要把它保存起来,使用 iptables-save 命令来进行备份。保存现有iptables规则到 /etc/iptables-rulesiptables-save > /etc/iptables-rules重启后恢复iptables规则修改网卡文件,当网卡重启的时候自动执行恢复命令nano /etc/network/interfaces找到vmbr1的那一节,在最后载入恢复命令pre-up iptables-restore < /etc/iptables-rules配置文件整体如下:auto lo iface lo inet loopback iface eno1 inet manual auto vmbr0 iface vmbr0 inet static address 198.46.147.254/30 gateway 198.46.147.253 bridge-ports eno1 bridge-stp off bridge-fd 0 #物理网卡配置一般不做改动,系统模板都是配置好的。 #为虚拟机新建一个虚拟网桥 #内网地址,虚拟机的网关 auto vmbr1 iface vmbr1 inet static address 192.168.1.1 netmask 255.255.255.0 bridge-ports none bridge-stp off bridge-fd 0 post-up echo 1 > /proc/sys/net/ipv4/ip_forward post-up echo 1 > /proc/sys/net/ipv4/conf/eno1/proxy_arp #转发IPv4流量到虚拟机,使虚拟机与外网联通。 post-up iptables -t nat -A POSTROUTING -s '192.168.1.1/24' -o vmbr0 -j MASQUERADE post-down iptables -t nat -D POSTROUTING -s '192.168.1.1/24' -o vmbr0 -j MASQUERADE iface eno2 inet manual查看备份规则cat /etc/iptables-rules清理当前iptables规则,⚠️ 注意要在已经备份完成的时候进行删除iptables -F iptables -X iptables -Z iptables重启当前主机,看会不会重置规则iptables -L -n --line-numbersiptables的规则会在重启或者开机的时候,会自动载入规则,新增iptables规则后建议也执行iptables-save > /etc/iptables-rules
2023年11月27日
967 阅读
1 评论
0 点赞
2023-11-27
解决Dabian下iptable重启后规则丢失
最近折腾完成pve的虚拟机环境后,也部署了几个虚拟机,昨天给软路由升级一下硬盘。升级完成后,重新开机后完成硬盘的分区,并把硬盘虚拟给了群晖。今天发现登录不上群晖的IP,经过好几次排查,检查发现iptebles的规则已经全部没有了。没办法只好重新设置一次,防止下次重启后再丢失NAT规则,我尝试使用以下方法。使用iptables保存机制在设置好了iptables规则后,下次重启后还是会被清除,所以我们需要把它保存起来,使用 iptables-save 命令来进行备份。保存现有iptables规则到 /etc/iptables-rulesiptables-save > /etc/iptables-rules重启后恢复iptables规则修改网卡文件,当网卡重启的时候自动执行恢复命令vim /etc/network/interfaces找到网卡eth0的那一节,在节后末尾加上载入恢复命令pre-up iptables-restore < /etc/iptables-rules查看备份规则cat /etc/iptables-rules清理当前iptables规则,⚠️ 注意要在已经备份完成的时候进行删除iptables -Fiptables -Xiptables -Ziptables重启当前主机,看会不会重置规则iptables -L -n --line-numbersiptables的规则会在重启或者开机的时候,会自动载入规则,新增iptables规则后建议也执行 iptables-save > /etc/iptables-rules直接写在网卡配置文件表达 含义pre-up 网卡启用前的动作up 启用时候的动作post-up 启用后的动作pre-down 关闭前的动作down 关闭时动作post-down 关闭后动作编辑网卡文件,在末尾写上相关iptables规则vim /etc/network/interfaces直接写在网卡的配置,每次重启的时候就自动加载规则post-up echo 1 > /proc/sys/net/ipv4/ip_forwardpost-up iptables -t nat -A POSTROUTING -s '10.10.10.0/24' -o esn5 -j MASQUERADEpost-down iptables -t nat -D POSTROUTING -s '10.10.10.0/24' -o ens5 -j MASQUERADEiptables NATpost-up iptables -t nat -A PREROUTING -p tcp -m multiport --dport 113 -j DNAT --to-destination 10.10.10.10:22post-up iptables -t nat -A PREROUTING -p tcp -m multiport --dport 1000:1099 -j DNAT --to-destination 10.10.10.10post-up iptables -t nat -A PREROUTING -p tcp -m multiport --dport 223 -j DNAT --to-destination 10.10.10.11:22post-up iptables -t nat -A PREROUTING -p tcp -m multiport --dport 1100:1199 -j DNAT --to-destination 10.10.10.11这个方法有两个弊端每条转发规则都要配置2行,分别是post-up时添加规则和post-down时删除规则。好像不写 post-down 也没有事情,应该是防止多条规则覆盖。特别是使用了iptables-persistent 这个软件包。修改转发规则后,必须执行 service networking restart 重启网卡才能使修改生效。而重启网卡会导致整机瞬间断网,如果有需要保持长连接的业务,会受到严重影响。最终我选择第一个方法,第二个方法在测试的时候,修改了网卡文件然后重启了网卡,但是iptables规则并没有生效,要重启母鸡才可以。
2023年11月27日
319 阅读
0 评论
0 点赞