[TOC]
# 前提
首先你家里寬帶要分配公網ip
我們用路由跟蹤命令查看下
~~~
traceroute baidu.com
~~~
mac是traceroute,linux和windows自己百度路由跟蹤命令
可以看出你電腦去百度經過的ip
一般家庭的路由器ip是192.168.0.1或者192.168.1.1
如果分配了公網ip就往下看
## ios開啟ipv6
ios-APN文件
https://www.v2ex.com/amp/t/474539
安卓和電信
https://www.youtube.com/watch?v=09QOuRrYCC0&app=desktop
# 進行端口映射
首先我們在外部分配公網ip的那個路由器中設置端口映射
轉發規則-虛擬服務器

由于我家里里面又接入了一個路由器,所以我還有一個路由器要設置端口映射
(建議自己電腦設置靜態ip,在路由器那邊設置,DHCP)

把上層路由器的端口再映射到我的mac上
# ip分析
~~~
http://ip.koolcenter.com/all
~~~
# 查詢公網ip接入
## ipv4
試了發現有用的,有可能會沒響應
~~~
curl members.3322.org/dyndns/getip
curl http://v4.ipv6-test.com/api/myip.php
curl http://ip.koolcenter.com
curl ipecho.net/plain
curl www.trackip.net/i # 可能需要正則切割下
curl icanhazip.com
curl ipinfo.io/ip
curl ipecho.net/plain
~~~
暫時沒響應,有時有響應
~~~
curl curlmyip.com
curl ifconfig.me
curl ip.appspot.com
~~~
或者你可以curl路由器,然后正則切割把路由器中的公網ip提取出來
## ipv6
~~~
http://v6.ipv6-test.com/api/myip.php
~~~
## 成品
~~~
支持ipv6
https://github.com/NewFuture/DDNS
~~~
## ip地址查詢
~~~
<?php
$ip = @file_get_contents("http://ip.taobao.com/service/getIpInfo.php?ip=".$_GET["ip"]);
$ip = json_decode($ip,true);
?>
~~~
其他的
~~~
api.help.bj.cn/apis/ip?ip=xx.xx.xx.xx
~~~
http://ip-api.com/json/?fields=520191&lang=zh-CN 獲取的數據默認語言可以隨便設置,較精確,但是沒有城市行政代碼
http://pv.sohu.com/cityjson?ie=utf-8 搜狐這個接口很穩定,也會返回城市代碼500000,但是有時用4G或者其他情況返回的城市代碼為CN,城市名為CHINA,不夠精確
# php獲取公網ip
~~~
/**
* 參數:
*
* @param string $proxy_override, [true|false], 是否優先獲取從代理過來的地址
* @return string
*
*/
function get_client_ip_from_ns($proxy_override = false)
{
if ($proxy_override) {
/* 優先從代理那獲取地址或者 HTTP_CLIENT_IP 沒有值 */
$ip = empty($_SERVER["HTTP_X_FORWARDED_FOR"]) ? (empty($_SERVER["HTTP_CLIENT_IP"]) ? NULL : $_SERVER["HTTP_CLIENT_IP"]) : $_SERVER["HTTP_X_FORWARDED_FOR"];
} else {
/* 取 HTTP_CLIENT_IP, 雖然這個值可以被偽造, 但被偽造之后 NS 會把客戶端真實的 IP 附加在后面 */
$ip = empty($_SERVER["HTTP_CLIENT_IP"]) ? NULL : $_SERVER["HTTP_CLIENT_IP"];
}
if (empty($ip)) {
$ip = $_SERVER['REMOTE_ADDR'];
}
/* 真實的IP在以逗號分隔的最后一個, 當然如果沒用代理, 沒偽造IP, 就沒有逗號分離的IP */
if ($p = strrpos($ip, ",")) {
$ip = substr($ip, $p+1);
}
return trim($ip);
}
$rel = get_client_ip_from_ns();
var_dump($rel);
~~~
# 保持存活機制
## 在linux下使用TCP的keepalive
tcp_keepalive_time
一個連接需要TCP開始發送keepalive探測數據包之前的空閑時間。以秒為單位
tcp_keepalive_probes
發送TCP keepalive探測數據包的最大數量,默認是9.如果發送9個keepalive探測包后對端仍然沒有響應,就關掉這個連接
tcp_keepalive_intvl
發送兩個TCP keepalive探測數據包的間隔時間,默認是75秒
~~~
$ cat /proc/sys/net/ipv4/tcp_keepalive_time
7200
$ cat /proc/sys/net/ipv4/tcp_keepalive_probes
9
$ cat /proc/sys/net/ipv4/tcp_keepalive_intvl
75
~~~
可以通過echo臨時修改
~~~
echo "300" > /proc/sys/net/ipv4/tcp_keepalive_time
~~~
也可以通過修改/etc/sysctl.conf永久生效
~~~
$ grep net.ipv4.tcp_keepalive_time /etc/sysctl.conf
net.ipv4.tcp_keepalive_time = 300
$ sysctl -p|grep net.ipv4.tcp_keepalive_time
net.ipv4.tcp_keepalive_time = 300
~~~
## ssh的keepalive
SSH連接總是隔一段時間沒有輸入時就斷開,解決辦法如下:
**服務端配置**
~~~
sudo vim /etc/ssh/sshd_config
ClientAliveInterval 60 #服務端主動向客戶端請求響應的間隔,數值是秒
ClientAliveCountMax 10 #服務器發出請求后客戶端沒有響應的次數達到一定值就自動斷開
sudo restart ssh
~~~
**客戶端配置 **
~~~
sudo vi /etc/ssh/ssh_config #或~/.ssh/config
~~~
客戶端主動向服務端請求響應的間隔
ServerAliveInterval
~~~
ServerAliveInterval 60
TCPKeepAlive=yes
~~~
或
~~~
ssh -i <key-file> -o StrictHostKeyChecking=no -o TCPKeepAlive=yes -o ServerAliveInterval=30 ubuntu@<ip>
~~~
上面方式任選一種,我選客戶端配置方式。
# mac端口轉發
找個端口轉發工具就可以,我這邊用的是rinetd
brew下載rinetd,可能需要翻墻
~~~
brew install rinetd
~~~
修改配置文件`/usr/local/etc/rinetd.conf`
~~~
# 設置允許訪問的ip地址信息
allow *
# 9503轉發到本機的ssh
0.0.0.0 9503 127.0.0.1 22
# 日志
logfile /usr/local/var/log/rinetd.log
~~~
啟動
~~~
rinetd
~~~
我這邊設置9503端口轉發到ssh的22
# mac設置開啟ssh端口
系統設置中共享
遠程登錄打鉤,選所有人

# ssh指定端口
~~~
ssh 到指定端口 ssh -p xx user@ip xx 為 端口號 user為用戶名 ip為要登陸的ip
~~~
# shell
要有curl,里面查公網ip用的是一個url
~~~
#!/bin/sh
#By h46incon
#Dependences: bind-dig, curl, openssl-util, tr, sort
## ----- Setting -----
AccessKeyId="testid"
AccessKeySec="testsecret"
DomainRecordId="00000"
# DomainRR, use "@" to set top level domain
DomainRR="www"
DomainName="example.com"
DomainType="A"
# DNS Server for check current IP of the record
# Perferred setting is your domain name service provider
# Leave it blank if using the default DNS Server
DNSServer="dns9.hichina.com"
# The server address of ALi API
ALiServerAddr="alidns.aliyuncs.com"
# A url provided by a third-party to echo the public IP of host
MyIPEchoUrl="http://members.3322.org/dyndns/getip"
# MyIPEchoUrl="http://icanhazip.com"
# the generatation a random number can be modified here
#((rand_num=${RANDOM} * ${RANDOM} * ${RANDOM}))
rand_num=$(openssl rand -hex 16)
## ----- Log level -----
_DEBUG_=true
_LOG_=true
_ERR_=true
## ===== private =====
## ----- global var -----
# g_pkey_$i # param keys
# g_pval_$key # param values
g_pn=0 # number of params
_func_ret=""
## ----- Base Util -----
_debug() { ${_DEBUG_} && echo "> $*"; }
_log() { ${_LOG_} && echo "* $*"; }
_err() { ${_ERR_} && echo "! $*"; }
reset_func_ret()
{
_func_ret=""
}
## ----- params -----
# @Param1: Key
# @Param2: Value
put_param()
{
eval g_pkey_${g_pn}=$1
eval g_pval_$1=$2
g_pn=$((g_pn + 1))
}
# This function will init all public params EXCLUDE "Signature"
put_params_public()
{
put_param "Format" "JSON"
put_param "Version" "2015-01-09"
put_param "AccessKeyId" "${AccessKeyId}"
put_param "SignatureMethod" "HMAC-SHA1"
put_param "SignatureVersion" "1.0"
# time stamp
local time_utc=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
_debug time_stamp: ${time_utc}
put_param "Timestamp" "${time_utc}"
# random number
_debug rand_num: ${rand_num}
put_param "SignatureNonce" "${rand_num}"
}
# @Param1: New IP address
put_params_UpdateDomainRecord()
{
put_param "Action" "UpdateDomainRecord"
put_param "RR" "${DomainRR}"
put_param "RecordId" "${DomainRecordId}"
put_param "Type" "${DomainType}"
put_param "Value" "${1}"
}
put_params_DescribeDomainRecords()
{
put_param "Action" "DescribeDomainRecords"
put_param "DomainName" ${DomainName}
}
pack_params()
{
reset_func_ret
local ret=""
local key key_enc val val_enc
local i=0
while [ $i -lt ${g_pn} ]
do
eval key="\$g_pkey_${i}"
eval val="\$g_pval_${key}"
rawurl_encode "${key}"
key_enc=${_func_ret}
rawurl_encode "${val}"
val_enc=${_func_ret}
ret="${ret}${key_enc}=${val_enc}&"
i=$((++i))
done
#delete last "&"
_func_ret=${ret%"&"}
}
# ----- Other utils -----
get_my_ip()
{
reset_func_ret
local my_ip=$(curl ${MyIPEchoUrl} --silent --connect-timeout 10)
#echo ${my_ip}
_func_ret=${my_ip}
}
get_domain_ip()
{
reset_func_ret
local full_domain=""
if [ -z "${DomainRR}" ] || [ "${DomainRR}" == "@" ]; then
full_domain=${DomainName}
else
full_domain=${DomainRR}.${DomainName}
fi
local ns_param=""
if [ -z "${DNSServer}" ] ; then
ns_param=""
else
ns_param="@${DNSServer}"
fi
_func_ret=$(dig "$ns_param" "${full_domain}" +short)
}
# @Param1: Raw url to be encoded
rawurl_encode()
{
reset_func_ret
local string="${1}"
local strlen=${#string}
local encoded=""
local pos c o
pos=0
while [ ${pos} -lt ${strlen} ]
do
c=${string:$pos:1}
case "$c" in
[-_.~a-zA-Z0-9] ) o="${c}" ;;
* ) o=$(printf "%%%02X" "'$c")
esac
encoded="${encoded}${o}"
pos=$(($pos + 1))
done
_func_ret="${encoded}"
}
calc_signature()
{
reset_func_ret
local sorted_key=$(
i=0
while [ $i -lt ${g_pn} ]
do
eval key="\$g_pkey_$i"
echo "${key}"
i=$((++i))
done | LC_COLLATE=C sort
)
local query_str=""
for key in ${sorted_key}
do
eval val="\$g_pval_${key}"
rawurl_encode "${key}"
key_enc=${_func_ret}
rawurl_encode "${val}"
val_enc=${_func_ret}
query_str="${query_str}${key_enc}=${val_enc}&"
done
query_str=${query_str%'&'}
_debug Query String: ${query_str}
# encode
rawurl_encode "${query_str}"
local encoded_str=${_func_ret}
local str_to_signed="GET&%2F&"${encoded_str}
_debug String to Signed: ${str_to_signed}
local key_sign="${AccessKeySec}&"
_func_ret=$(/bin/echo -n ${str_to_signed} | openssl dgst -binary -sha1 -hmac ${key_sign} | openssl enc -base64)
}
send_request()
{
# put signature
calc_signature
local signature=${_func_ret}
put_param "Signature" "${signature}"
# pack all params
pack_params
local packed_params=${_func_ret}
local req_url="${ALiServerAddr}/?${packed_params}"
_debug Request addr: ${req_url}
local respond=$(curl -3 ${req_url} --silent --connect-timeout 10 -w "HttpCode:%{http_code}")
echo ${respond}
}
describe_record()
{
put_params_public
put_params_DescribeDomainRecords
send_request
}
update_record()
{
# get ip
get_my_ip
local my_ip=${_func_ret}
# Check if need update
_debug My IP: ${my_ip}
if [ -z "${my_ip}" ]; then
_err Could not get my ip, exitting...
exit
fi
get_domain_ip
local domain_ip=${_func_ret}
_debug Current Domain IP: ${domain_ip}
if [ "${my_ip}" == "${domain_ip}" ]; then
_log Need not to update, current IP: ${my_ip}
exit
fi
# init params
put_params_public
put_params_UpdateDomainRecord ${my_ip}
send_request
}
main()
{
describe_record
#update_record
}
main
~~~
# 判斷主機是否支持
### **進入BIOS**
當電腦開機啟動時,通過反復按鍵盤“DELETE”鍵或“F2”鍵,進入到主板BIOS設置界面。更多啟動主板BIOS設置界面幫助,參考[百度經驗](http://jingyan.baidu.com/article/b24f6c82c11ad286bfe5da23.html)。
### **開啟喚醒功能**
通常到“Power Managment(電源管理)”下尋找如下列選項:
"Boot on LAN";
"Wake on LAN";
"PME Event WakeUp",;
"Resume by MAC LAN";
"Wake-Up by PCI card";
"Wake Up On PCI PME";
"Power On by PCI Card";
"WakeUp by PME of PCI";
"Power On By PCI Devices";
"WakeUp by Onborad LAN";
"Resume By PCI or PCI-E Ddevice"或類似的東西,并可以啟用它。
可視圖形化的UEFI BIOS,可參考下列方式設置:
高級 > 高級電源管理(APM)> 開啟**Resume By PCI or PCI-E Ddevice**(由pci/pcie設備喚醒)選項
**聯想主板**
進入**Power——Automatic Power ON**——**Wake On LAN**設為**Enabled**

**華碩主板**
進入高級——高級電源管理——開啟由PCI/PCIE設備喚醒選項

**技嘉**
進入BIOS功能——網絡啟動——選擇Legacy First或UEFI First選項

## 關閉節電功能
遠程開機需要網卡保持待機,關機后網卡燈不亮,請檢查主板是否開啟節能模式。因各廠商對此功能名稱定義不一,常見的節電功能選項:
1. 假如有**Low Power Mode**選項,一定要設置為**Off**

2. 或者是**ErP**和**EuP**選項,設置為**Disabled**

# 斷電后自動開機
wakeonlan怕非正常關機, 如果非正常關機, wakeonlan會失效, 用這個代替wakeonlan失效

# linux系統設置喚醒
檢查網卡是否支持喚醒功能,輸入命令**ethtool eth0**打印出網卡的信息

Supports Wake-on 值為g,表示網卡支持遠程開機;若為d,則不支持。
Wake-on值為g,表示網卡已開啟遠程喚醒功能;
若為d,則輸入命令 ethtool -s eth0 wol g 開啟。
命令執行后,輸入ethtool eth0,檢測是否成功開啟wake on lan功能
- 云主機和vps的區別
- Mac上的開發工具匯總
- brew
- openssl
- php
- apache
- 窗口快捷鍵
- 允許任何來源
- nginx
- sublime
- shadowsocks
- beyond compare
- 開機自啟
- 環境變量
- iterm2
- 改變 Launchpad
- Mac小技巧
- Mac安裝 GNU 軟件包
- Mac斷網
- 關閉isp保護機制
- charles
- redisdesktop
- vnc連接windows
- say
- go2shell
- zsh
- 創建加密文件夾
- u盤格式化為ext4
- sequalpro
- kernel_task過高
- 錄屏添加聲音
- 一些軟件的安裝和使用
- java
- vagrant
- 多機器創建
- supervisor
- ubuntu配置https證書
- rinetd端口映射轉發
- 安裝中文man
- frp內網穿透
- 樹莓派
- windows燒寫系統
- 如何讓樹莓派支持中文
- 裝系統完全指南
- 使用raspi-config配置樹莓派
- 換源
- frp 隨時隨地訪問自己的樹莓派
- 安裝php和swoole
- 安裝docker
- 安裝mysql和redis
- 音響配置
- 文字轉語音
- 通過usb聲卡錄音和播放
- 視頻監控
- ssh安裝
- 安裝ss
- 安裝teamview
- 安裝TensorFlow
- 掛載U盤
- sd卡拷貝
- 備份系統
- 終端翻墻
- jenkins
- jumpserver
- inotify+rsync
- lnmp一鍵安裝包
- markdown自動生成導航欄
- dnsmasq
- 服務器之間文件同步
- samba
- cmder
- notepad++去除BOM
- wireshark
- proxifier
- fish
- chocolatey
- AutoHotkey
- 遠程喚醒
- win10子系統和卓越性能
- win10創建計劃任務
- 谷歌云免費一年
- windows優化
- windows開機關機腳本
- aliyun DDNS
- BestTrace
- wireguard
- PAC
- telegram
- google voice
- bbr,銳速
- aliyun和tencent云卸載監控
- 通過微博圖片的鏈接找到發圖的人
- Socat端口轉發
- iso制作
- win10關閉自動更新
- youtube-dl
- vscode
- docker
- 簡介
- 網絡
- 常用命令
- 命令細解釋
- docker架構
- centos安裝
- dockerfile
- 使用
- copy
- ADD
- 詳解
- 多階段構建
- docker swarm
- routing mesh
- 清理Docker占用的磁盤空間
- 網絡命名空間
- ETCD
- 簡介
- 部署集群
- 網絡層實現
- docker machine
- 發布
- docker compose
- kubernetes
- 簡介
- pod
- services
- 詳解
- 日志
- 手寫docker
- 基礎技術
- namespace
- cgroups
- 簡介
- 常用命令
- scp
- rpm
- sftp
- vim
- find
- more分屏顯示
- ln
- grep
- init
- nohup
- htop
- top
- w
- ssh
- firewalld
- sudo
- lrzsz
- lsof
- systemctl
- rsync
- screen
- tar打包
- ss
- history
- vmstat
- 基礎知識
- 目錄
- 權限
- 用戶和組
- 防火墻
- crontab
- ps 進程
- 開機自啟
- 信號
- 一些資料
- 同步/異步,阻塞/非阻塞區別
- 添加swap
- 查看硬件資源信息
- 文本相關
- zabbix監控
- sql
- 數字簽名
- 虛擬內存
- rsyslog
- tcp優化
- 避免rm
- ulimit
- rc.local開機自啟
- 文件時間戳
- 文本處理工具
- nginx
- 優點
- 安裝
- 配置文件
- 常用命令
- nginx模塊
- stub_status模塊
- random_index
- sub_module
- secure_link_module模塊
- geoip_module
- 請求限制
- 訪問控制
- 靜態資源web服務
- 防盜鏈
- 代理服務
- 負載均衡
- 緩存服務
- 動靜分離
- rewrite規則
- HTTPS
- nginx+lua
- 常見異常
- 配置文件詳解
- keepalived
- keepalived服務說明
- keepalived部署
- 腦裂
- 多實例配置
- 提高安全性的配置
- 日志配置
- SO_REUSEPORT
- 網絡管理
- ISO/OSI七層模型
- TCP/IP四層模型
- DNS
- 網頁加載慢
- 網關
- IP配置
- NGINX + SSH Tunnel 內網穿透
- 測速
- 防御DDOS
- 屏蔽指定國家所有的IP
- 一鍵安裝桌面環境和RDP
- vps dd win
- iftop監控服務器
- Debian/Ubuntu上使用rclone掛載OneDrive網盤
- 基于serverchan微信推送
- vps dd linux
- ssh端口轉發
- ssh設置代理
- lvs
- 服務管理
- 服務分類
- 服務與端口
- RPM包服務管理
- 源碼包服務管理
- 總結
- yum
- apt
- Linux VPS一鍵更換軟件源腳本
- pgsql安裝
- shell
- shell簡介
- echo命令
- 基礎
- 運算符
- 環境變量
- 正則表達式
- cut命令
- printf
- 分析服務器日志
- sed和awk
- 流程控制
- 函數
- 批處理
- wc
- sort和uniq
- git
- 配置
- git四個區五種狀態
- git常用命令
- 倉庫管理
- 分支管理
- 查看管理
- 操作管理
- 恢復管理
- 其他命令
- 總結
- git fetch & git pull
- 各種后悔藥
- 儲藏
- 標簽管理
- 常見問題
- 刪除大文件
- 設置緩沖區大小
- fork別人的項目
- git rebase 命令的原理和缺陷
- 改寫提交
- git 倉庫的子目錄獨立成新倉庫
- git高級用法
- 回滾 reset
- emoji
- git二分法
- stash
- 刪除Git記錄中的大文件的過程
- git reflog
- 恢復已刪除分支
- reset和revert
- git同時push代碼到github、碼云等多個平臺
- .git秘密
- commit,tree,blob關系
- 暫存區的作用
- git diff
- 安全
- 系統掃描
- 無痕后門Redsails
- iptables
- openresty
- 常用架構
- lua
- twemproxy+redis
- 智能DNS
- bind服務安裝
- DNS解析記錄分類
- bind配置演示
- postman
- zookeeper
- zookeeper簡介
- 集群部署
- 核心工作機制
- zookeeper命令行操作
- zookeeper客戶端API
- 感知服務器動態上下線
- 分布式共享鎖
- 原理
- FastDFS
- 簡介
- 家里的電腦,外界訪問
- centos7和centos6的變化
- centos7顯示中文
- .user.ini
- 設置cookie
- ipv6
- L2TP
- linux性能優化
- socket優化