LinuxNetwork 网络管理 iptables
2021-04-04
命令参数
iptables -[ACD] chain rule-specification [options]
iptables -I chain [rulenum] rule-specification [options]
iptables -R chain rulenum rule-specification [options]
iptables -D chain rulenum [options]
iptables -[LS] [chain [rulenum]] [options]
iptables -[FZ] [chain] [options]
iptables -[NX] chain
iptables -E old-chain-name new-chain-name
iptables -P chain target [options]
链相关
--new -N [chain] 链:创建
--delete-chain -X [chain] 链:删除
--rename-chain -E old-chain new-chain 链:更名
--list -L [chain [rulenum]] 列出指定链或所有链中的所有规则(表格形式)
--list-rules -S [chain [rulenum]] 同上,不过是按照规则定义的格式列出 很好用
--flush -F [chain] 清空规则
--zero -Z [chain [rulenum]] 计数器清零(数据包计数器,流量计数器)
--policy -P chain target 修改策略
规则相关
--append -A chain rule-specification 附加规则
--check -C chain rule-specification 检查规则是否存在
--delete -D chain rule-specification 删除匹配规则
--delete -D chain rulenum 删除 指定序号的 规则
--insert -I chain [rulenum] 插入到指定位置(默认插入到第一个)
--replace -R chain rulenum 替换 指定序号的 规则
规则说明
常用命令
查看
sudo iptables -S
sudo iptables -t nat -S POSTROUTING
sudo iptables -nL
sudo iptables -nL INPUT
sudo iptables -nL --line-numbers
sudo iptables -Z
sudo iptables -Z INPUT
sudo iptables -Z INPUT 1
# 如果是这么定义的话:
# -A INPUT -m conntrack --ctstate INVALID -j DROP
sudo iptables -D INPUT -m conntrack --ctstate INVALID -j DROP
sudo iptables -D INPUT 3
访问拦截
# 对指定端口放行
sudo iptables -I INPUT -p tcp --dport 1022 -j ACCEPT
# 禁止来自无线网络的流量访问某端口(突发奇想的一个小例子)
sudo iptables -A PREROUTINE -i wlp6s0 --dport 22 -j DROP
NAT
iptables -t nat -A POSTROUTING -d 192.168.0.102 -j SNAT --to 192.168.0.1
iptables -t nat -A PREROUTING -d 202.202.202.2 -j DNAT --to-destination 192.168.0.102
iptables -t nat -D PREROUTING -p tcp --dport 8080 -i eth2.2 -j REDIRECT --to 80
对指定流量打标记
内核可以给这个包加上一个标记(可能存在包的数据结构中,总之,只对本地环境有效),可以实现流量的统计、限制等其他复杂的控制。
标记值最大可以到 2^32
iptables -t mangle -A PREROUTING -s 192.168.1.3 -j MARK --set-mark 60
iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 2
//打标记
iptables -t mangle -A PREROUTING -j MARK --set-mark 33
//匹配标记
iptables -t nat -A PREROUTING -m mark --mark 33 -j ACCEPT
//or-mark
iptables -t mangle -A PREROUTING -j MARK --or-mark 0x400
//掩码匹配
iptables -t nat -A PREROUTING -m mark --mark 0x400/0x400 -j ACCEPT
iptables -t mangle -A INPUT -m state --state NEW -j MARK --set-mark 1
iptables -t mangle -A INPUT -j CONNMARK --save-mark
iptables -t mangle -A INPUT -j CONNMARK --restore-mark
iptables -t mangle -A PREROUTING -mttl --ttl-eq 64 -j MARK --set-mark 10
iptables -t mangle -A PREROUTING -mttl --ttl-eq 123 -j MARK --set-mark 20
iptables -t filter -A FORWARD -m mark--mark 10 -j ACCEPT
iptables -t filter -A FORWARD -m mark--mark 20 -j DROP
iptables -t mangle -A QOS_MARK_FORWARD_eth1 -j CONNMARK --restore-mark --nfmask 0xfffff --ctmask 0xfffff
iptables -t mangle -A QOS_MARK_FORWARD_eth1 -m mark --mark 0x0/0xfffff -j QOS_RULES_FORWARD_eth1
iptables -t mangle -A QOS_RULES_FORWARD_eth1 -j CONNMARK --save-mark --nfmask 0xfffff --ctmask 0xfffff
iptables -t mangle -A POSTROUTING -m iprange --src-range 192.168.0.2-192.168.0.200 -j MARK --or-mark 0x1
-m mark
-m connmark
-j MARK
-j CONNMARK
-j CONNSECMARK
-j SECMARK
--set-mark value 设置nfmark值
--and-mark value nfmark与value与运算
--or-mark value nfmark与value或运算
匹配
iptables -t mangle -A INPUT -m mark --mark 1
限速
思路:hashlimit 模块
屏蔽指定网站
利用 string 模块 (xt_string.ko) 做域名匹配:
sudo iptables -A OUTPUT -m string --string baidu.com --algo bm -j LOG --log-prefix "iptables-test:blocked:baidu.com: "
sudo iptables -A OUTPUT -m string --string baidu.com --algo bm -j DROP
sudo iptables -vnL
curl https://www.baidu.com/
tail -f /var/log/syslog | grep "iptables-test"
sudo iptables -F OUTPUT
sudo iptables -A FORWARD -m string --string baidu.com --algo bm -j LOG --log-prefix "iptables-test:blocked:baidu.com: "
sudo iptables -A FORWARD -m string --string baidu.com --algo bm -j DROP
HTTPS 居然也可以生效,其原理我还不清楚,到底是匹配到了包的哪一部分包含了 baidu.com 呢?
提示:
- 这个规则也可以放到 INPUT 链上。
- 如果加上
-p tcp –dport 80 可能更加精确,免得别的什么包里面包含了 baidu.com 被拦截。
- 可以加多个 string 参数。
如果是 HTTP 的话,在我的理解范围之内,可以做到更细致的匹配,比如匹配到路径,甚至 Cookie。
string match options:
--from Offset to start searching from
--to Offset to stop searching
--algo Algorithm
--icase Ignore case (default: 0)
[!] --string string Match a string in a packet
[!] --hex-string string Match a hex string in a packet
algo 的选项:bm, kmp,参考 man iptables-extensions。
参考资料与拓展阅读
LinuxNetwork 网络管理 iptables
2021-04-03
iptables 的历史变更,发展趋势,和其他技术的关联我也曾花了不少时间去了解,可以说还是很不全面,就不献丑了(或者以后再来说说)。
这里就单单讲一下 iptables。
基本思想
在网络数据传输过程中有几个关键点埋上钩子,每个钩子上绑定了一个规则链(CHAIN)。
我们在这些链上注册一些处理规则(RULE),也就是 条件 加 操作。
网络包走到埋点的地方时,内核会逐个规则检查,如果符合条件就会执行预定操作。
此外:
- 这些处理规则按照不同类型,分成了五类,存在五张不同的表中。
- 每个规则链可以设置一个预定的操作(文档中称之为:策略 Policy)。
五个点
PREROUTING 路由:内核收到网络包之后,判断该包是否是自己的,应该给哪个程序
INPUT 用户程序收到包之前(内核判断是自己的包之后,传输到用户程序)
OUTPUT 程序往外发包
FORWARD 这个包不是自己的,然后需要中转出去
POSTROUTING 路由:系统判断该包应该怎么发出
PS:可以自定义新的链,然后再别的链中引用。我所处理的任务都没有到需要创建新链的地步,所以没有接触过。
五张表
应该说是五个功能。
- filter 过滤,即判断这个包。默认
- nat 地址转换
- mangle 数据包修改,日常网络管理应该不会用到
- raw 数据包修改(在内核处理之前)
- security unknown
操作类型
ACCEPT 放行
DROP 拦截
REJECT 拦截,但是告知对方
MARK 加标记
NAT
SNAT 源地址转换
DNAT 目的地址转换
REDIRECT 端口转换
参考资料与拓展阅读
Golang
2021-04-01
类似代码:
for _, f := range files {
fp, err := os.Open(f)
if err != nil {
panic(err)
}
defer fp.Close()
// do something
}
Goland 提示:possible resource leak,'defer' is called in the 'for' loop
defer 是在最后函数退出时执行,但是变量已经经过循环覆盖,可能会导致内存泄漏。
似乎 Golang 的 defer 还是不够聪明。
换种写法:
for _, f := range files {
func () {
fp, err := os.Open(f)
if err != nil {
panic(err)
}
defer fp.Close()
// do something
}()
}
Golang
2021-03-30
- GORM
- ent
- Xorm 转到Gitea
- Bun
- Reform
- GoRose
GitHub 搜索结果
- go-gorm/gorm

The fantastic ORM library for Golang, aims to be developer friendly
- ent/ent

An entity framework for Go
- geektutu/7days-golang

7 days golang programs from scratch (web framework Gee, distributed cache GeeCache, object relational mapping ORM framework GeeORM, rpc framework GeeRPC etc) 7 天用 Go 动手写/从零实现系列
- gogf/gf

GoFrame is a modular, powerful, high-performance and enterprise-class application development framework of Golang.
- sqlc-dev/sqlc

Generate type-safe code from SQL
- go-xorm/xorm

Simple and Powerful ORM for Go, support mysql,postgres,tidb,sqlite3,mssql,oracle, Moved to https://gitea.com/xorm/xorm
- volatiletech/sqlboiler

Generate a Go ORM tailored to your database schema.
- go-pg/pg

Golang ORM with focus on PostgreSQL features and performance
- go-gorp/gorp

Go Relational Persistence - an ORM-ish library for Go
- xo/xo

Command line tool to generate idiomatic Go code for SQL databases supporting PostgreSQL, MySQL, SQLite, Oracle, and Microsoft SQL Server
- upper/db

Data access layer for PostgreSQL, CockroachDB, MySQL, SQLite and MongoDB with ORM-like features.
- uptrace/bun

SQL-first Golang ORM
- xxjwxc/gormt

database to golang struct
- steebchen/prisma-client-go

Prisma Client Go is an auto-generated and fully type-safe database client
- xormplus/xorm

xorm 是一个简单而强大的 Go 语言 ORM 库,通过它可以使数据库操作非常简便。本库是基于原版 xorm 的定制增强版本,为 xorm 提供类似 ibatis 的配置文件及动态 SQL 支持,支持 AcitveRecord 操作
- go-reform/reform

A better ORM for Go, based on non-empty interfaces and code generation.
- gobuffalo/pop

A Tasty Treat For All Your Database Needs
- bobohume/gonet

go 分布式服务器,基于内存 mmo
- unionj-cloud/go-doudou

go-doudou(doudou pronounce /dəudəu/)is OpenAPI 3.0 (for REST) spec and Protobuf v3 (for grpc) based lightweight microservice framework. It supports monolith service application as well.
- gohouse/gorose

GoRose(go orm), a mini database ORM for golang, which inspired by the famous php framwork laravle's eloquent. It will be friendly for php developer and python or ruby developer. Currently provides six major database drivers: mysql,sqlite3,postgres,oracle,mssql, Clickhouse.
- huandu/go-sqlbuilder

A flexible and powerful SQL string builder library plus a zero-config ORM.
Golang
2021-03-29
httpbin 是我练手的一个非常简单的小项目,功能就是:
1. HTTP POST 请求 (POST /) 提交一个字符串,服务器返回一个 ID。
1. HTTP GET 请求 (GET /xxxx),返回 ID 对应的字符串。
计算机网络 Linux
2021-03-15
早几年前,Linux 系统的网卡名称都是 eth0、wlan0,后来都变了个风格,就拿我的电脑举例:enp7s0, wlp6s0。
这到底是是什么原因呢?
最近突然好奇,去查了资料才知道为什么。
在 Fedora 的技术资料中找到,这个和 Systemd 有关,然后又在 freedesktop 官网 Systemd 的手册中找到了详细的说明。
现在的命名方案有好长一段,估计要看个半个小时(如果感兴趣可以仔细阅读一下),解开我的疑问却不需要那么复杂。
Linux DEB
2021-03-13
输出 dot 格式的包依赖关系图,可以用 graphviz 生成图片。
个人
2021-03-11

开发工具 密码学 OTP Auth 信息安全
2021-03-08
基础概念
身份验证器
Authenticator
密码就算是身份验证器。
加密密钥,比如 SSH 的公钥私钥(密钥对)
动态密码
One-time Password, 缩写: OTP, 又叫做一次性密码
我们常用的的短信验证码就是一种非常方便快捷的动态密码形式。
早些年一些网络服务,比如谷歌、网易通行证等,可能会提供一个动态口令表,包含十几个密码,可以保存为图片,或者纯文本,上面的密码可以逐个使用,每个密码只能用一次。
- RFC4226 HOTP: An HMAC-Based One-Time Password Algorithm
- RFC6238 TOTP: Time-Based One-Time Password Algorithm
HOTP 基于 HMAC 算法
简单来说就是根据密钥和计数器来生成一个一次性密码。
除了记住密钥之外,你还要记住这是第几次使用。
- HOTP value = HOTP(K, C) mod 10d
- HOTP(K, C) = truncate(HMACH(K, C))
- truncate(MAC) = extract31(MAC, MAC[(19 × 8) + 4:(19 × 8) + 7] × 8)
MAC[(19 × 8) + 4:(19 × 8) + 7] × 8
取第十九字节的后四位(小端序), 转成一个有符号整型数(小端序),作为截取 MAC 的位置
- extract31(MAC, i) = MAC[i × 8 + 1:i × 8 + (4 × 8) − 1]
MAC[i × 8 + 1:i × 8 + (4 × 8) − 1]
从上一步得到的位置处,取四个字节,去掉符号位(小端序)
TOTP 基于时间
- 协商起始时间 T0 和时间间隔 TX
- 双方分别计算时间计数器 CT
- TOTP value(K) = HOTP value(K, CT)
多重要素验证
Multi-factor authentication, 缩写: MFA
Two-factor authentication, 缩写: 2FA
谷歌身份验证器

Google 身份验证器是一款 TOTP 与 HOTP 的两步验证软件令牌,此软件用于 Google 的认证服务。此项服务所使用的算法已列于 RFC 6238 和 RFC 4226 中。
Google 身份验证器给予用户一个六位到八位的一次性密码用于进行登录 Google 或其他站点时的附加验证。其同样可以给第三方应用生成口令,例如密码管理员或网络硬盘。先前版本的 Google 身份验证器开放源代码,但之后的版本以专有软件的形式公开。
谷歌验证器基于 TOTP,但是更进一步简化,以约定代替了协商过程。
- T0 为 Unix 时间
- TX 为 30 秒
- 哈希算法为 sha1
此外:
虽然不是很大的创新,而且这个软件验证器实现很简单,但是免费、开放(不需要做任何谷歌服务绑定),加上谷歌的强大影响力,这个软件验证器被很多系统采用。
最后,其他提供动态口令的应用都需要来兼容谷歌身份验证器。
PS: RedHat 开发并维护了开源的 FreeOTP 分支项目。
PS: 微软也有一个 Microsoft Authenticator,阿里云 APP 中有一个 虚拟MFA 功能,都是一个意思。
微软家的为自己提供 8 位密码,别人家的就 6 位,区别对待(虽然感觉好像也并没有什么影响)
阿里云 MFA 是需要手机 APP 登录进去之后才能使用的。
Just4Fun
import base64
import hashlib
import hmac
import time
DEFAULT_INTERVAL = 30 # Google Authenticator: 30 秒
DEFAULT_HASH = hashlib.sha1
def get_hotp_token(secret: str, counter: int, hash_algorithm=DEFAULT_HASH, length=6):
padding_len = 8 - len(secret) % 8
if padding_len != 8:
assert 1 <= padding_len <= 7
secret += '=' * padding_len
key = base64.b32decode(secret, True)
message = (counter & 0xffffffffffffffff).to_bytes(8, 'big')
mac = hmac.new(key, message, hash_algorithm).digest()
loc = mac[-1] & 0x0F
token = (int.from_bytes(mac[loc:loc+4], 'big') & 0x7fffffff) % (10 ** length)
return token
def get_totp_token(secret, interval=DEFAULT_INTERVAL):
time_counter = int(time.time()) // interval
return get_hotp_token(secret, time_counter)
if __name__ == '__main__':
print('%06d' % get_totp_token(sys.argv[1]))
参考资料与拓展阅读
Windows CMD
2021-03-07
cmd
- 大小写不敏感
- 参数通常是
/ 开头,而不像 Unix 下是 -
- 帮助:
-help, /?
| 管道、> 输出重定向、>> 输出重定向(追加)、< 输入重定向、<< EOF heredoc、<<< CONTENT 输入重定向(字符串)作用和 Linux 相同
- Ctrl + C 退出执行
help
help | more
dir C:\Windows\System32\*.exe
dir C:\Windows\System32\*.msc
export
echo
cls # 类似 clear
tasklist
taskkill
cd
mkdir / md
del # 类似 rm
del /q anydir
rd # 删除目录(非空目录不可删除)
dir # 类似 ls
tree
find
findstr # 类似 grep
ping
ipconfig
netstat
tracert
route
dig
nslookup
shutdown -s -t 300 # 定时关机
explorer # 文件浏览器
notepad # 记事本
taskmgr # 命令管理器
regedit # 注册表编辑器
services.msc # 服务
注册表
Registry, 港澳台地区称之为登录档。就是一个树形结构的数据库,存放系统和应用程序的配置信息。
Linux 下各个应用程序,甚至操作系统的各组件都采用不同的配置文件存储在不同的地方,但 Windows 却采用了这种集中式存储。
https://zh.wikipedia.org/zh-hans/注册表
| 名称 |
作用 |
| HKEY_CLASSES_ROOT |
存储Windows可识别的文件类型的详细列表,以及相关联的程序。 |
| HKEY_CURRENT_USER |
存储当前用户设置的信息。 |
| HKEY_LOCAL_MACHINE |
包括安装在计算机上的硬件和软件的信息。 |
| HKEY_USERS |
包含使用计算机的用户的信息。 |
| HKEY_CURRENT_CONFIG |
这个分支包含计算机当前的硬件配置信息。 |
常见数据结构:
REG_SZ 字符串
REG_BINARY 二进制
REG_DWORD 32 位二进制值,显示为 8 位的十六进制数
REG_MULTI_SZ 多字符串,nul 隔开,结尾两个 nul
REG_EXPAND_SZ
python 有内置库 winreg 可以用来操作注册表。
import winreg
reg = winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE)
key_name = r'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall'
key = winreg.OpenKey(reg, key_name)
for i in range(1024):
try:
sub_key_name = winreg.EnumKey(key, i)
sub_key = winreg.OpenKey(key, sub_key_name)
value = winreg.QueryValueEx(sub_key, "DisplayName")
print('%s: %s' % (sub_key_name, value))
except EnvironmentError:
break
Services
# 小心 sc 命令中比较另类的等于号后有空格设计
sc create memcached binPath= "c:\memcached.exe -l 0.0.0.0 -m 128 -d" DisplayName= "Memcached" start= auto
PowerShell
虽然使用频率不高,但和 PowerShell 少有的几次接触感觉很好,很强大。其结构化而非文本的数据结构让人印象深刻。
get-alias | findstr /I get-alias
gal | findstr ls
man
help
ls # Get-ChildItem
ps # Get-Process
ps | select Name, Id
ps | ft -Property Id, ProcessName, Handles, VM, WS, CPU -AutoSize
ps | where { $_.Name -eq "explorer" }
curl # Invoke-WebRequest
rm # Remove-Item
rmdir # Remove-Item
ni -ItemType File -Path C:\Users\Administrator\file.txt # New-Item
cp # Copy-Item
cp -Path C:\Users\Administrator\file.txt -Destination D:\Temp\
gcm # Get-Command
shcm # Show-Command
get-volume
工具
GUI
- process explorer
- everything
- HeidiSQL
- PuTTY
- WizTree 目录分析
包管理
- choco (chocolatey)
- scoop
- winget
安装包格式
- MSI 官方出品, Windows Installer
- NSIS Nullsoft Scriptable Install System, zlib license
- WiX
- Inno Setup