lsof
用于列出当前系统打开的文件 (list open files),在 Linux 中,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以比如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因为 lsof
命令需要访问核心内存和各种文件,所以需要 root 用户执行。
比如可以使用 lsof
来查看当前系统中 80 端口是否被占用
sudo lsof -i tcp:80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
docker-pr 14863 root 4u IPv6 38693061 0t0 TCP *:http (LISTEN)
然后获取到 PID 之后可以用 lsof 来查看进程
sudo lsof -p 14863
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
docker-pr 14863 root cwd DIR 8,0 4096 2 /
docker-pr 14863 root rtd DIR 8,0 4096 2 /
docker-pr 14863 root txt REG 8,0 3329080 17531 /usr/bin/docker-proxy
docker-pr 14863 root mem REG 8,0 1868984 20743 /lib/x86_64-linux-gnu/libc-2.23.so
docker-pr 14863 root mem REG 8,0 138696 11625 /lib/x86_64-linux-gnu/libpthread-2.23.so
docker-pr 14863 root mem REG 8,0 162632 10738 /lib/x86_64-linux-gnu/ld-2.23.so
docker-pr 14863 root 0r CHR 1,3 0t0 8085 /dev/null
docker-pr 14863 root 1w CHR 1,3 0t0 8085 /dev/null
docker-pr 14863 root 2w CHR 1,3 0t0 8085 /dev/null
docker-pr 14863 root 4u IPv6 38693061 0t0 TCP *:http (LISTEN)
docker-pr 14863 root 5u a_inode 0,12 0 8082 [eventpoll]
docker-pr 14863 root 12r REG 0,3 0 4026531993 net
由以上的信息就能看出来我的机器中的 80 端口是 docker 占用的,docker 的位置在系统中的 /usr/bin/docker-proxy
lsof
输出各列信息的意义如下:
FD 的取值
一般在标准输出、标准错误、标准输入后还跟着文件状态模式:r、w、u 等
在有了基本的概念之后来看 lsof
的参数
lsof [ -?abChKlnNOPRtUvVX ] [ -A A ] [ -c c ] [ +c c ] [ +|-d d ] [ +|-D D ] [ +|-e s ] [ +|-E ] [ +|-f [cfgGn] ] [ -F [f] ] [ -g [s] ] [ -i [i] ] [ -k k ] [ +|-L [l] ] [ +|-m m
] [ +|-M ] [ -o [o] ] [ -p s ] [ +|-r [t[m<fmt>]] ] [ -s [p:s] ] [ -S [t] ] [ -T [t] ] [ -u s ] [ +|-w ] [ -x [fl] ] [ -z [z] ] [ -Z [Z] ] [ -- ] [names]
能看到非常多的选项,因此也能看到 lsof
的强大。
默认 : 没有选项,lsof 列出活跃进程的所有打开文件
-i : 列出网络连接
使用 lsof -i
来显示所有的链接,可以用来代替 netstat
:
sudo lsof -i
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 2972 root 3u IPv4 18883553 0t0 TCP *:22 (LISTEN)
sshd 2972 root 4u IPv6 18883562 0t0 TCP *:22 (LISTEN)
docker-pr 14852 root 4u IPv6 38693034 0t0 TCP *:https (LISTEN)
docker-pr 14863 root 4u IPv6 38693061 0t0 TCP *:http (LISTEN)
这里输出结果有缩略,但也能看出来 22 的 SSH 端口,然后 http
默认的 80 端口,和 https
使用的 443 端口。如果要查看 IPv6 的流量可以使用 lsof -i 6
。
同样如果要查看 TCP 或者 UDP 连接信息,可以使用 lsof -iTCP
和 lsof -iUDP
。
假如已经知道了端口号,想要查看该端口哪一个进程在使用可以使用:
lsof -i:80
再比如查看和本地 22 端口的连接 lsof -i:22
显示来自特定主机的连接,lsof -i@1.2.3.4
,指定主机和端口 lsof -i@1.2.3.4:22
lsof
还可以使用过滤器来过滤连接状态,比如只查看正在监听 TCP 端口的进程:
lsof -iTCP -sTCP:LISTEN
如果已经知道进程的 PID,可以使用 -p
查看指定进程 ID 已打开的内容
lsof -p 10075
lsof -u einverne
使用 -U
选项来列出系统中正在使用的 Unix 域套接字:
lsof -U
比如说如果系统中依赖的一个 jar 被发现有漏洞,比如说可以查看 fastjson
在系统中有没有使用。
lsof -X | grep fastjson
WEB-INF 是 Java EE Web 程序一个特殊的目录,此目录中的资源不会被列入应用程序根目录可直接访问项。客户端不可直接访问 WEB-INF 中的资源。
根据 Servlet 2.4 specification 中的描述,这个不公开的目录虽然不能被外部访问,但是可以被 servlet 代码 getResource
或者 getResourceAsStream
等方法访问,并且可以暴露给 RequestDispatcher
。
目录 WEB-INF/web.xml
中保存 web 程序配置文件,XML 格式,描述 servlet 和其他应用组件配置和命名规则。
在 Spring MVC 和其他任何 web 程序中一个好的推荐方式是将所有的 views 或者 JSP 文件存放在 WEB-INF 文件夹中。这些放在 WEB-INF 中的 views 就被称为 internal resource view,这些 views 只能被 servlet 或者 Spring Controller 访问。
“听歌识曲” 虽然听起来是一个简单的功能,却还依然发展了很多年。在无数的网站评论中看到求求某某片段中的背景音乐,其实绝大部分情况下都可以通过听歌识曲来找到,剩下的也绝大部分可以通过电视,电影的OST找到。所以这篇文章就是介绍下目前市面上我使用过比较好用的一些听歌识曲的应用,这些应用解决了我95%以上,找到喜欢的背景音乐的需求。
授人以鱼不如授人以渔
在电视、综艺、或者大街上听到一首喜欢的背景音乐却不知道歌名的时候,我下意识的会拿出手机来打开网易云音乐,当然这个能够解决一大半的问题,因为经过多年的使用,其实网易的识别还是有些准确的,至少对于绝大部分流行的中日韩欧美歌曲基本都能够识别出来,更甚至之前看请回答系列,识别出来了上世纪六七十年代发行的歌曲。但是听歌识曲有一些小小的弊端,一般情况下需要环境噪声比较小,并且经验给我的感觉是需要一段较长有歌词的完整的片段才能够快速的找到精确的歌。所以如果周围噪音比较大,或者电影中人物有对白时,尽量记住连续一段完整的歌词,然后通过搜索引擎搜索歌词来获取歌名,一般情况下我会加上 lyrics + 记住的歌词
来搜索,基本也能够找到想要的歌。
还有其他的酷狗,微信摇一摇啊,就不介绍了。
应用名 | 支持平台 | 语种 | 特别功能 |
---|---|---|---|
网易云音乐 | Android/iOS | 中韩英 | 识别出即可播放(当然要排除版权问题) |
SoundHound | Android/iOS | 英中 | 可以通过哼唱来识别 |
Shazam | Android/iOS | 英 | 在低功耗情况下一直识别音乐 |
Siri | iOS | 英 | 随系统自带 |
2021 年更新
到目前为止,我基本上只会使用 Shazam 和 网易云音乐了,Shazam 被苹果收购之后越来越好用,反而是 SoundHound 可能一直没有找到合适的盈利模式而越来越难用。
在一些对精度要求特别高的系统中,比如会计,金融,Java 中的 double,float 已经不能满足精度需求,谁也不愿意再付款或者计价的时候出现付费 4.4 而账单只有 4.0 元的错误。所以在 Java 中为了更高精度的计算我们需要用到 java.math.BigDecimal.
BigDecimal 需要有两个能力:
通常在使用 BigDecimal 时建议使用 传入 String 的构造函数。
BigDecimal bd = new BigDecimal(1.5);
bd = new BigDecimal("1.5");
如果使用 double 的构造函数可能会造成一些问题,比如第一个 bd 可能结果是 1.49999999999999999999
设置小数点(decimal)后面的数字位数,需要使用 .setScale(scale)
方法,与此同时,在设置 scale (数值范围)的时候一并设置 Rounding Mode(舍入模式)被认为是一个比较好的实践方式(Good practice),需要使用 .setScale(scale, roundingMode)
。rounding mode 定义了在损失精度时使用的舍入方式,比如四舍五入,或者 Ceiling 或者 Floor 等等。
为什么需要舍入模式,来看一个例子
bd = new BigDecimal(1.5); // is actually 1.4999....
bd.setScale(1); // throws ArithmeticException
抛出算术异常,因为 BigDecimal 不知道如何处理 1.49999
.
有八种定义好的 Rounding Mode,假设保留小数点后两位
ROUND_CEILING: Ceiling function 向天花板舍入
0.333 -> 0.34
-0.333 -> -0.33
ROUND_DOWN: Round towards zero 向 0 舍入
0.333 -> 0.33
-0.333 -> -0.33
ROUND_FLOOR: Floor function 往小舍入
0.333 -> 0.33
-0.333 -> -0.34
ROUND_HALF_UP: Round up if decimal >= .5
0.5 -> 1.0
0.4 -> 0.0
ROUND_HALF_DOWN: Round up if decimal > .5 最常见的四舍五入
0.5 -> 0.0
0.6 -> 1.0
ROUND_HALF_EVEN: 当需要舍入的数字是 5 时需要特殊处理,需要看 5 左边的数字奇偶性
a = new BigDecimal("2.5"); // digit left of 5 is even, so round down
b = new BigDecimal("1.5"); // digit left of 5 is odd, so round up
a.setScale(0, BigDecimal.ROUND_HALF_EVEN).toString() // => 2
b.setScale(0, BigDecimal.ROUND_HALF_EVEN).toString() // => 2
ROUND_UNNECESSARY: 当需要使用一种舍入方式,但是你知道结果不需要舍入的时候,也就意味着如果使用了这种舍入模式,那么如果出现一个不精确的结果比如 1/3,那么会抛出 ArithmeticException。
BigDecimal 是不可变对象,也就意味这如果创建了一个 BigDecimal 是 2.00 那么这个 BigDecimal 会一直是 2.00。在做算术是比如 add()
或 multiply()
方法时会返回一个新的 BigDecimal 对象。
Never use .equal()
method to compare BigDecimal. Because this equals function will compare the scale. If the scale is different, .equals()
will return false, even if they are the same number mathematically.
BigDecimal a = new BigDecimal("2.00");
BigDecimal b = new BigDecimal("2.0");
print(a.equals(b)); // false
反之,应该使用 .compareTo()
and .signum()
方法
a.compareTo(b); // returns (-1 if a < b), (0 if a == b), (1 if a > b)
a.signum(); // returns (-1 if a < 0), (0 if a == 0), (1 if a > 0)
如果要在计算中使用舍入模式,那么用什么精度呢?答案是打算如何使用结果。一般情况下,会知道最后用户需要的结果的精确度。对于那些中间计算过程中出现的数字,你需要增加一位数字来提高精确度。
比如 0.0144 + 0.0143 最后保留两位小数的话,在结果舍入会得到 0.03,而如果将两个数字加法之前就舍入,那么会得到 0.02.
如果最后的结果是乘法得到,那么你应当保留尽可能多的精度。而 Ratios
比率 和 Unit costs 单位价格,不应当舍入。而应当在做完所有计算之后在对结果进行舍入。
之前一篇文章 主要是使用 mitmproxy 进行抓包,但是其实 mitmproxy 自带的 feature 远远不止于抓包,使用 mitmdump 可以自定义脚本来修改 response 返回,或者将请求结果 dump 到本地以便于之后的分析。
之前的那篇文章在 mitmdump 的时候只是简单的介绍了一下功能,并没有展开,所以有了这篇文章。mitmdump 可以理解为 mitmproxy 的命令行版本,他提供了 tcpdump 类似的功能来查看,记录,甚至编程改写 HTTP 流量。
开启代理模式,并将所有的请求写入文件
mitmdump -w outfile
-n
参数表示不开启代理, -r
表示读入 infile,然后将将所有 match ~m post
POST 流量写入 outfile 文件中。
mitmdump -nr infile -w outfile "~m post"
关于过滤的规则,可以具体参考这里
使用 -n
参数不开启代理,然后 -c filename
参数进行重放。
mitmdump -nc outfile
甚至是可以重放请求,然后将结果保存到另外的文件中
mitmdump -nc srcfile -w dstfile
可以在启动 mitmdump 时添加自定义的脚本用来改写请求。
mitmdump -s examples/add_header.py
如果脚本文件带有参数,则需要在 -s
参数后面增加双引号,比如 mitmdump -s "add_header.py custom_header"
将这些参数组合一起使用
mitmdump -ns examples/add_header.py -r srcfile -w dstfile
从 srcfile 文件中加载流量,然后使用特定的脚本改写,然后将结果写入 dstfile 文件中。
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import os
import sys
from mitmproxy import flowfilter, http, ctx
# events run ordr: start, request, responseheaders, response, error, done
class Filter:
MOVIE_TOP250 = '/api/v2/subject_collection/movie_top250/items'
def __init__(self, path):
self.folder_path = path
# 构造一个 HTTP response code
self.http_code_ok = flowfilter.parse('~c 200')
if not os.path.exists(self.folder_path):
os.makedirs(self.folder_path)
# 构造一个 URL 过滤器
self.douban_path = flowfilter.parse(
'~u frodo.douban.com/api/v2/subject_collection/movie_top250/items')
# @concurrent # Remove this and see what happens
def request(self, flow: http.HTTPFlow):
if flowfilter.match(self.douban_path, flow):
if flow.request.host:
ctx.log(
"handle request: %s%s" % (
flow.request.host, flow.request.path))
def response(self, flow: http.HTTPFlow):
if flowfilter.match(self.http_code_ok, flow):
"""只有 200 状态进入"""
ctx.log('code %s' % flow.response.status_code)
if flowfilter.match(self.MOVIE_TOP250, flow):
if flow.response.content:
pretty_path = str(flow.request.path.rstrip())
pretty_path = pretty_path.replace('/', '_') \
.replace(':', '_') \
.replace('&', '_')
pretty_path = pretty_path[:250] + '.json'
res_content = flow.response.content.decode('utf-8')
path = os.path.join(self.folder_path, pretty_path)
with open(path, 'w+') as f:
f.write(res_content)
def start():
if len(sys.argv) != 2:
raise ValueError('Usage: -s "save_response.py path"')
# 保存结果的 folder 路径
return Filter(sys.argv[1])
将上面的脚本执行
/usr/local/bin/mitmdump -s "save_response.py /tmp/response_result/"
然后在结果路径中就能得到请求的豆瓣 Top250 电影结果,然后再对电影结果进行解析即可。
或者可以将请求的 webp 或者 jpg 的图全都保存到另外的文件夹中
pretty_url = flow.request.pretty_url
if pretty_url.endswith(".webp") or pretty_url.endswith('.jpg'):
# ctx.log('pretty url %s' % flow.request.pretty_url)
filename = os.path.join(self.folder_path,
os.path.basename(pretty_url))
with open(filename, 'wb') as f:
f.write(flow.response.content)
然后只要浏览过的图片就全都保存在本地的文件夹中了。
mitm 的过滤都是依靠 flowfilter.py 来实现的,可以匹配的规则有如下
The following operators are understood:
~q Request
~s Response
Headers:
Patterns are matched against "name: value" strings. Field names are
all-lowercase.
~a Asset content-type in response. Asset content types are:
text/javascript
application/x-javascript
application/javascript
text/css
image/*
application/x-shockwave-flash
~h rex Header line in either request or response
~hq rex Header in request
~hs rex Header in response
~b rex Expression in the body of either request or response
~bq rex Expression in the body of request
~bs rex Expression in the body of response
~t rex Shortcut for content-type header.
~d rex Request domain
~m rex Method
~u rex URL
~c CODE Response code.
rex Equivalent to ~u rex
从这些匹配规则就能看出来过滤规则可以非常精细,比如过滤结果为 500 的请求,比如过滤 header 中 content-type 为某种类型的请求,比如按照正则去匹配 URL 等等。
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import sys
from mitmproxy import flowfilter, http, ctx
# events run ordr: start, request, responseheaders, response, error, done
class Filter:
MOVIE_TOP250 = '/api/v2/subject_collection/movie_top250/items'
def __init__(self):
# 构造一个 URL 过滤器
self.douban_path = flowfilter.parse(
'~u frodo.douban.com/api/v2/elendil/home_timeline')
# 构造一个 HTTP response code
self.http_code_ok = flowfilter.parse('~c 200')
# Domain
self.my_domain = flowfilter.parse('~d douban.com')
# Method
self.filter_mathod = flowfilter.parse('~m POST')
# content-type header
self.filter_content_type = flowfilter.parse('~t json')
# @concurrent # Remove this and see what happens
def request(self, flow: http.HTTPFlow):
if flowfilter.match(self.douban_path, flow):
if flow.request.host:
ctx.log(
"handle request: %s%s" % (
flow.request.host, flow.request.path))
def response(self, flow: http.HTTPFlow):
if flowfilter.match(self.http_code_ok, flow):
"""只有 200 状态进入"""
ctx.log('code %s' % (flow.response.status_code))
if flowfilter.match(self.my_domain, flow):
"""只有匹配域名"""
ctx.log('domain %s' % flow.response.text)
if flowfilter.match(self.douban_path, flow):
"""只有 特定 url 可以进入"""
ctx.log('douban text' + flow.response.text)
ctx.log('douban reason ' + flow.response.reason)
ctx.log('douban http version ' + flow.response.http_version)
pretty_url = flow.request.pretty_url
if flowfilter.match(self.MOVIE_TOP250, flow):
if flow.response.content:
res_content = flow.response.content.decode('utf-8')
ctx.log("content: " + res_content)
def start():
if len(sys.argv) != 2:
raise ValueError('Usage: -s "dump.py"')
return Filter()
今天推荐的网站是 ShortcutWorld,同时也是整理笔记的一篇文章。
推荐网站也可以看看之前的推荐,AlternativeTo 可以寻找各种产品的代替品,现在产品关闭的越来越多了,很好用的产品被关闭非常心疼,还有很多通过图片寻找字体等等,都可以参考。而今天要推荐的是收集和整理了很多桌面应用,网页应用快捷键的 Wiki 网站。
官网地址: https://www.shortcutworld.com/
为什么会知道这个网站的呢?主要是当时寻找 Linux mint 的快捷键搜到了 这个页面 ,然后在这个页面上,竟然发现了看官方文档都没找到的录屏快捷键 Ctrl+Alt+Shift+R</kdb> ,竟然看这个 Wiki 的时候发现了。
不过其实用来找快捷键最快的方法还是官方文档和 Google 啦。这个网站适合不定时看一看来学习一下新的技能。
Openwrt 在 Luci 后台很显眼的位置有三个不断刷新的数字,其实这个数字是“平均负载”(Load Average)的意思,这是 Linux 操作系统衡量系统负载和稳定性的重要参数。
在 Linux 及各种 Linux 衍生版(包括 Openwrt)中,都可以使用如下命令查看系统平均负载。
uptime 命令:
root@OpenWrt:/# uptime
21:22:57 up 19:21, load average: 1.30, 2.44, 2.38
top 命令:
Mem: 119632K used, 6740K free, 0K shrd, 41348K buff, 48152K cached
CPU: 0% usr 0% sys 0% nic 72% idle 0% io 0% irq 27% sirq
Load average: 0.33 1.82 2.17 1/76 16075
w 命令,查看当前系统有谁登录,都在干什么:
$ w
21:25:04 up 3 days, 11:07, 8 users, load average: 0.48, 0.52, 0.59
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
einverne tty7 :0 Tue10 3days 2:19m 2.39s cinnamon-session --session cinnamon
einverne pts/1 ev Tue10 37.00s 2.45s 0.32s ssh root@192.168.1.1
直接查看 load average:
$ cat /proc/loadavg
0.56 0.48 0.56 1/1264 5890
前三个数字表示平均进程数量外,后面一个分数,分子为正在运行进程数,分母表示系统进程总数,最后一个数字表示最近运行进程ID。
load average 显示的3个数字,分别表示:系统在过去1分钟、5分钟、15分钟内运行进程队列中的平均进程数量。 正常情况下的时候就是0到1之间,大于1的时候,表示系统已经没有多余资源了,有些队列就需要等待处理。
短时间大于1是没有影响的,特别是第一个一分钟的数据,但是如果后面两个数据,特别是最后一个,经常大于0.7,就说明,有可能路由器超负荷了。
有一篇 Understanding Linux CPU Load 将负载比喻交通流量,很形象,非常值得一看。
具体来说:
0.00-1.00
之间的数字表示此时路况非常良好,没有拥堵,车辆可以毫无阻碍地通过。1.00-***
表示路况不太好了,如果到达2.00表示有桥上车辆一倍数目的车辆正在等待。这种情况你必须进行检查了。多核CPU的话,满负荷状态的数字为 “1.00 * CPU核数”,即双核CPU为2.00,四核CPU为4.00。
dig 命令是一个用于询问 DNS 域名服务器的灵活的工具。它执行 DNS 搜索,显示从接受请求的域名服务器返回的答复。
查找 www.google.com 的 A 记录
dig www.google.com
输出如下
; <<>> DiG 9.10.3-P4-Ubuntu <<>> google.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 34834
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4000
;; QUESTION SECTION:
;google.com. IN A
;; ANSWER SECTION:
google.com. 75 IN A 172.217.24.206
;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Thu Jun 21 16:52:41 CST 2018
;; MSG SIZE rcvd: 55
命令前两行显示 dig 版本,参数,以及隐式参数 +cmd 意味信息本身会被打印
QUERY
未遇到错误 NOERROR
,还有 事务 id 34834指定 dns 服务器查找 www.google.com 的 A 记录
dig @8.8.8.8 www.google.com
查找 IP 地址对应的主机名 [[PTR]] 反向DNS 记录:
dig -x 8.8.8.8
使用 nslookup
查询域名 A 记录
nslookup www.google.com
在上一篇中讲了如何刷 Openwrt,这一篇主要讲一些 Openwrt 的东西,以及配置相关的内容。我有一个主路由器,设置分配的局域网地址为 192.168.1.x,给内网中分配的地址也是 192.168.1.x 开头。
但是 Openwrt 默认为 AP 模式,我想要从主路由器 LAN 口连出到新的这个 Openwrt 路由器上,那么便得设置 Openwrt 路由器为 Router 模式以便于级联。
在设置路由器模式之前先来看看这几个接口,否则怎么都不会明白怎么配置的。
Openwrt 的接口名字太多,最早接触路由器的时候只知道 WLAN 口,LAN 口,后来接触 Linux 才慢慢知道 eth0, lo 等等接口,但是在 Openwrt 上接口中突然冒出来一堆看着名字熟悉,却不知道什么作用的接口。今天配置 LAN ,WAN 口时还差点把 MR12U 搞砖,幸亏昨天刷了不死 boot。
可以使用 ifconfig
来查看设备,常见的几个端口:
lo
虚拟设备端口,自身回环设备,一般指向 127.0.0.1ra0
rai0
成对出现,无线设备,对应各自的 SSID,分别是 2.4G 和 5Gpppoe-wan
虚拟设备,常见的拨号宽带上网eth0
物理网卡, eth0.1 或者 eth0.2 都是从此设备虚拟而出。br-lan
虚拟设备,用于 LAN 口设备桥接,用来使多个虚拟或物理网络接口的行为好像他们仅有一个网络接口一样。目前路由器普遍将有线 LAN 口(一般四个)和 WIFI 无线接口桥接在一起作为统一的 LAN。可以使用 brctl show
来查看使用情况。eth1
如果路由器有两块网卡,一般 eth1 作为 WAN 口wlan0
一般是无线网卡,无线端口wlan1
另一块无线网卡可以使用如下命令来查看 br-lan
配置
brctl show
bridge name bridge id STP enabled interfaces
br-lan 7fff.64098005e1bb no eth0.1 rai0 ra0
br-lan
= eth0.1 + rai0 + ra0,即将有线 LAN 口和无线网统一划分为 LAN。
下面张图比较直观:
LAN 是设置局域网内的相关属性,可以设置内网的 IP,桥接的端口。比如我们默认使用 192.168.1.1 访问,可以修改为 192.168.9.1,生效后内网分配的 ip 网段就会变成 192.168.9.x 。LAN 口的协议为【静态地址】。下一次访问路由器管理页面就需要使用 192.168.9.1 了。
System->Software->在 Filter 栏里面输入 -zh-cn
点击搜索
找到 luci-i18n-base-zh-cn 点击前面的安装。然后去设置语言即可。
路由器模式也就是最常见的无线模式,通过有线连接路由器 WAN 口至互联网,并发射无线提供局域网络。由于 OpenWrt 默认只有 LAN 接口,我们需要添加 WAN 接口。
Openwrt morning 配置只有上述图片的 LAN 口,下面的 WAN 口通过如下方法添加。
点击下方的“添加新接口”
为了便于区分,接口名称建议使用 WAN。按照网络接入类型,选择 DHCP(从外网自动获取 ip 地址),静态 ip 或者 PPPoE 拨号即可。其它设置如图,请勿选择“在多个接口上创建桥接”,最后点击提交。
提交后选择刚刚创建的 WAN 接口,点击“防火墙设置”,选择 WAN 并保存即可。
这时需要再次回到 LAN 接口,点击编辑。
选择“物理设置”,确保“桥接接口”为选中,接口中不选中“以太网适配器”。确认后保存并应用,至此所有配置完成,连接网线即可使用。
一种需求是将有线网络转为无线 WiFi,使得 WiFi 网络和其他原来在有线网络中的设备在同一子网中,比如说一级路由网段 192.168.2.X,然后添加无线路由器分享 WiFi,使得 WiFi 上的设备网段依然是 192.168.2.X,不产生新子网,没有 NAT,一级路由下面设备可以访问二级路由下任何设备不需要做端口转发。
有线中继的方式下,二级路由不会 DHCP,并且网段相同。如果要实现这种模式,OpenWrt 需要将无线网卡接口和 WAN 划分到一起,路由器 Master 模式 + 无线 AP.
此时连接 WiFi,会发现客户端通过一级路由分配 IP 地址,网关是上一级路由的网关。
有些时候并没有有线网络可以连接到 OpenWrt 路由器 WAN 口,但是有 WiFi 可以连接,那么可以将路由器转变成一个 WiFi 信号放大器,扩展 WiFi 信号覆盖范围。
无线中继模式使用无线网络接入互联网,并生成一个新的 SSID。无线桥接模式无需更改有线连接接口设置。打开无线接口设置,点击搜索。在自动弹出的设置页面中,填写上级无线密码。新网络的名称使用默认 WWAN 即可。防火墙区域选择 WAN,在这里请勿选择“重置无线配置”。在保存并应用后就完成了所有设置。
假如有一台主路由已经接入了互联网(内网网段是 192.168.2.1/24),现在要在一台从路由 (OpenWrt) 上无线桥接到主路由。
luci-proto-relay
和 relayd
无线 AP(接入点) 模式多应用于公共场所,所有无线设备将被桥接至以太网接口,由上级网关负责 DHCP。在设置完成后 AP 所在路由器将无法访问。
首先打开 LAN 接口或者 WAN 接口,选择“物理设置”,确保“桥接接口”为选中。在下方接口选中“以太网适配器”以及“无线网络”,保存并应用即可。
至于无线加密设置以及 DHCP 设置较为简单,自行在“网络”分类下查找即可。
总结性的归纳一下,中继和桥接都可以扩大原来的信号范围。
而无线桥接模式不参与
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ buster main contrib non-free # deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ buster main contrib non-free deb https://mirrors.tuna.tsinghua.edu.cn/debian/ buster-updates main contrib non-free # deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ buster-updates main contrib non-free deb https://mirrors.tuna.tsinghua.edu.cn/debian/ buster-backports main contrib non-free # deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ buster-backports main contrib non-free deb https://mirrors.tuna.tsinghua.edu.cn/debian-security buster/updates main contrib non-free # deb-src https://mirrors.tuna.tsinghua.edu.cn/debian-security buster/updates main contrib non-free 中继模式 (Repeater) 下,路由器会通过无线 方式与一台可以上网的无线路由器建立连接,用来放大可以上网的无线路由器上的无线信号(放大后的无线信号和原来的无线路由器名称一致)。适用于扩大一台可以上网的无线路由器的信号覆盖范围。中继一边接受信号,一边发射自己的无线信号。这种模式下无线路由器以 Client 方式接入主路由,另外新增虚拟接口提供无线接入。
而桥接模式 (Bridge) 下,路由器通过无线方式与可以上网的无线路由器连接,而放大后的无线信号名称可以和原来的不一样。桥接模式下路由器可以设定自己的 DHCP,提供一个自己的局域网。
中继和桥接模式都可以通过无线方式扩大信号,区别在于扩大后的无线信号名字不一样。