Linux防火墙概念理念

默认的iptables表为filter(过滤器)。它包含3个默认链:FORWARD、INPUT和OUTPUT,内核处理的每个包都要经过3个链中的某一个。FORWARD链里的规则用于在一个网络接口收到的、而且需要转发到另一个网络接口的所有包。INPUT和OUTPUT链里的规则分别用于目的是本地主机,或者从本地主机发出的流量。

用到wireguard VPN这个工具,配置中需要防火墙的处理。添加如下配置

# 启动动作, 这里就要把 eth0 替换成之前记下的外网网卡名称 , wg0 是等下创建的虚拟网卡名称
# 配置防火墙规则
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE; ip6tables -A FORWARD -i wg0 -j ACCEPT; ip6tables -A FORWARD -o wg0 -j ACCEPT; ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

# 关闭动作, 操作同上
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE; ip6tables -D FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

对于 PREROUTING 和 POSTROUTING不大好记忆

仔细想想,是这样的。route是公网上的寻址,在内网要发出到公网时,需要将私网IP转换为公网IP,所以是PREROUTING。主要用于IP共享 🙂


参考:鸟哥的 第九章、防火墙与 NAT 服务器

Wireguard配置点滴

听说wg相对其它种类VPN的好处,于是试了试。开始怎么也不能连上。主要是对peer中allowedips没理解。应该先连一下服务器,有了通信。


服务器配置

wg genkey | tee privatekey | wg pubkey > publickey
# 打开转发
echo 1 > /proc/sys/net/ipv4/ip_forward
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf

# 应用规则
sysctl -p
pi@raspberrypi:~ $ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether b8:27:eb:24:16:4a brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.40/24 brd 192.168.1.255 scope global dynamic noprefixroute wlan0
       valid_lft 256571sec preferred_lft 224171sec
    inet6 240e:0:0:0:0:0:0:505/64 scope global dynamic mngtmpaddr noprefixroute
       valid_lft 259001sec preferred_lft 172601sec
    inet6 fe80::0:0:0:0/64 scope link
       valid_lft forever preferred_lft forever
服务器的配置
/etc/wireguard/wgx.conf

关键的一是服务器要配置iptables。按下面这个是好使的。

[Interface]
# 服务器私钥, 就是上面生成的 privatekey
PrivateKey = server_private_key_value

# 绑定地址
Address = 10.0.0.1/24

# 是否保存配置, 可以在运行中通过命令行添加新客户端, 并保存到此配置
SaveConfig = true

# 启动动作, 这里就要把 eth0 替换成之前记下的外网网卡名称 , wg0 是等下创建的虚拟网卡名称
# 配置防火墙规则
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE; ip6tables -A FORWARD -i wg0 -j ACCEPT; ip6tables -A FORWARD -o wg0 -j ACCEPT; ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

# 关闭动作, 操作同上
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE; ip6tables -D FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

# 监听端口
ListenPort = 51820

# 客户端配置
[Peer]
# 客户端公钥, 生成步骤同服务器, 两端都可生成
PublicKey = client_public_key_value

# 分配给客户端的地址, 我这里让他随便选, 你也可以指定给他
AllowedIPs = 10.0.0.0/24,10.0.0.2/32

# 加客户端就在 Peer 节点下加公钥和 IP 就可以了, 操作同上

客户端的配置

[Interface]
PrivateKey = priv

#本机的wg上的IP
Address = 10.0.10.2/32
#MTU = 1300

[Peer]
PublicKey = pubkey

# 要访问的IP。服务器侧,及与wg同网段的机器
AllowedIPs = 10.0.10.0/24, 10.0.24.0/22
# 服务器的IP及wg端口
Endpoint = ip:port

# 内网主机保持连线
PersistentKeepalive = 45

据说MTU的设置也能影响连接。所以上述将MTU设置为了1300

The overhead of WireGuard breaks down as follows:

  • 20-byte IPv4 header or 40 byte IPv6 header
  • 8-byte UDP header
  • 4-byte type
  • 4-byte key index
  • 8-byte nonce
  • N-byte encrypted data
  • 16-byte authentication tag

不是很明白,先贴在这儿

[Interface]
PrivateKey = client_private_key_value

DNS = 114.114.114.114

Address = 10.0.0.3/24
...
# 这里按照最大开销计算, 实际的 mtu 为 1420 - (40 + 8 + 4 + 4 + 8 + 16) = 1344
# 我怕有坑, 再给点余量
MTU = 1300

rosdep init 和 rosdep update出错

在安装ros时,执行rosdep命令时会出现超时或者连接被拒绝的错误。 例如下面的连接超时,就是因为国内网络的原因,

ERROR: unable to process source [https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/osx-homebrew.yaml]:
<urlopen error timed out> https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/osx-homebrew.yaml)

解决办法

1.准备一个代理

2.安装proxychain-ng

https://github.com/rofl0r/proxychains-ng

编译,可以不用安装,

./configure --prefix=/usr --sysconfdir=/etc
 make

proxychains.conf

socks5 127.0.0.1 1080

linux samba 配置

1.配置一个共享目录

[media]
  #comment = share all
  path = /mnt/media
  browseable = yes

  writable = yes
  public = yes
  valid users = media
  force user = media
  available = yes

  create mask=0700
  directory mask=0700

2.创建用户:

现在要添加new这个网络访问帐户。如果系统中当前没有这个帐户,那么

代码:sudo useradd new
要注意,上面只是增加了new这个用户,却没有给用户赋予本机登录密码。所以这个用户将只能从远程访问,不能从本机登录。而且samba的登录密码可以和本机登录密码不一样

现在要新增网络使用者的帐号:

代码:sudo smbpasswd -a new # 设置你的new密码,这个密码不是开机登录时候用的,是你要访问WIN共享文件或者WIN共享文件访问你的时候要填的密码


删除网络使用者的帐号的命令把上面的 -a 改成 -x

sudo smbpasswd -x new

python中列表的切片操作

有拾起了scipy,温习了odeint,但是遇到了之前没想明白的一个python语法,关于列表的切片操作

一个二维数组,要想取每个一级元素的某一位,如一个列表10个元素,每个元素又是包含(x,y)两个元素。

想把每个元素的第一个取出来,需要这样做:

list[:,0]

逗号,分隔出二维数组的维数。

冒号,切片操作。冒号前,起始元素;冒号后终止元素

三维数组同理

python中函数参数的打包和解包

最近学习scipy中的optimize模块的几个函数,包括fsolve,leastsq。注意到里面有几处函数调用,其参数调用不是很了解。于是百度/Google了一下。看了看觉得收益匪浅。

以fsolve为例,其定义如下:

def fsolve(func, x0, args=(), fprime=None, full_output=0, col_deriv=0, xtol=1.49012e-8, maxfev=0, band=None, epsfcn=None, factor=100, diag=None)

Parameters

func : callable “f(x, *args)“
A function that takes at least one (possibly vector) argument.

x0 : ndarray
The starting estimate for the roots of “func(x) = 0“.

args : tuple, optional
Any extra arguments to `func`.

fprime : callable(x), optional
A function to compute the Jacobian of `func` with derivatives across the rows. By default, the Jacobian will be estimated.

其中args参数的传递,一直不太明白,是怎么传的,如何赋值。调用的时候是怎么判断函数需要几个参数的(这个应该是自己定义的,自己清楚)。今天查了一下函数参数的打包与解包才算弄清楚。

摘录关键部分如下:

python中的 * 和 ** ,能够让函数支持任意数量的参数,它们在函数定义和调用中,有着不同的目的。

一、打包参数

* 的作用:在函数定义中,收集所有位置参数到一个新的元组,并将整个元组赋值给变量args。

** 的作用:在函数定义中,收集关键字参数到一个新的字典,并将整个字典赋值给变量kwargs。

二、解包参数

* 的作用:在函数调用中,* 能够将元组或列表解包成不同的参数。

** 的作用:在函数调用中,** 会以键/值的形式解包一个字典,使其成为一个独立的关键字参数。

打包和解包并不能脱离函数而存在!!