树莓派通过docker安装openwrt
打开网络混杂模式
sudo ip link set eth0 promisc on
通过docker安装
- 创建网络, 结合自己的网络情况, 一定要使用有线网卡
eth0
docker network create -d macvlan --subnet=192.168.0.0/24 --gateway=192.168.0.1 -o parent=eth0 macnet
- 拉取镜像
docker pull sulinggg/openwrt:latest
- 创建并启动容器
docker run --restart always --name openwrt -d --network macnet --ip 192.168.0.201 --privileged sulinggg/openwrt:latest /sbin/init
-
进入容器并修改相关参数
进入容器
docker exec -it openwrt bash
修改网络vim /etc/config/network
, 将以下配置中的123, 改为实际的网段和ip地址config interface 'lan' option type 'bridge' option ifname 'eth0' option proto 'static' option ipaddr '192.168.123.100' option netmask '255.255.255.0' option ip6assign '60' option gateway '192.168.123.1' option broadcast '192.168.123.255' option dns '192.168.123.1'
重启网络
/etc/init.d/network restart
进行设置
- 进入控制面板
自定义的ip地址, 端口80, 帐号 root
/password
- 关闭dhcp
网络 - 接口 - Lan - 修改 中, 忽略此接口, 并保存应用
- 验证网络
通过将其他设备网络的网关设置为openwrt的网址, 查看是否能正常上网
- 主路由设置
如果可以正常上网, 配置主路由的dhcp网关为openwrt的网址
- 设备重新连接路由器
其他设备重新连接路由器, 获取新的网关地址
- 配置防火墙
镜像中的防火墙配置可能有问题, 通过注释掉网络 - 防火墙 - 自定义规则中的 iptables -t nat -I POSTROUTING -j MASQUERADE
, 可能会正常
科学上网
- 配置科学上网
通过服务passwall的配置, 配置订阅地址, 自动更新, 上网规则等设置
注意规则列表可能更新失败, 多下载几次, 或者将jsdelivr.net
加入直连列表
备份规则docker cp openwrt:/etc/config/passwall passwall.backup
, 不过可能版本之间不兼容
配置持久化
以上很多设置不能在重启后复用, 或者不能在升级后重复使用, 参考一下配置
使用docker-compose
参考以下配置, 或下载示例文件, unzip openwrt.zip -d ./openwrt; cd openwrt
创建Dockerfile
FROM sulinggg/openwrt:latest
RUN echo "export TERM=xterm-256color" >> ~/.zshrc
COPY ./initconfig/ /etc/
创建initconfig
文件夹, 创建initconfig/config/network
, 修改成自定义的ip地址
config interface 'loopback'
option ifname 'lo'
option proto 'static'
option ipaddr '127.0.0.1'
option netmask '255.0.0.0'
config globals 'globals'
config interface 'lan'
option type 'bridge'
option ifname 'eth0'
option proto 'static'
option netmask '255.255.255.0'
option ip6assign '60'
option ipaddr '192.168.0.201'
option gateway '192.168.0.1'
option dns '192.168.0.1'
config interface 'vpn0'
option ifname 'tun0'
option proto 'none'
创建initconfig/firewall.user
# This file is interpreted as shell script.
# Put your custom iptables rules here, they will
# be executed with each firewall (re-)start.
# Internal uci firewall chains are flushed and recreated on reload, so
# put custom rules into the root chains e.g. INPUT or FORWARD or into the
# special user chains, e.g. input_wan_rule or postrouting_lan_rule.
iptables -t nat -A PREROUTING -p udp --dport 53 -j REDIRECT --to-ports 53
iptables -t nat -A PREROUTING -p tcp --dport 53 -j REDIRECT --to-ports 53
创建docker-compose.yml
version: "2"
# see https://forums.docker.com/t/how-do-i-attach-a-macvlan-network-and-assign-a-static-ip-address-in-compose-file/107419
services:
openwrt:
image: my-openwrt
container_name: openwrt
restart: always
build:
context: .
dockerfile: Dockerfile
volumes:
- ./data/passwall/rules:/usr/share/passwall/rules
- ./data/config:/etc/config
- ./data/xray:/usr/share/xray/
entrypoint: /sbin/init
privileged: true
networks:
macnet:
ipv4_address: 192.168.0.201
networks:
macnet:
driver: macvlan
driver_opts:
parent: eth0
ipam:
config:
- subnet: "192.168.0.0/24"
gateway: "192.168.0.1"
使用docker-compose up -d
启动
持久化开启promisc混合模式
centos持久化promisc混合模式
备份
cp /etc/network/interfaces /etc/network/interfaces.bak # 备份文件
vim /etc/network/interfaces # 使用 vim 编辑文件
文件配置
auto eth0
up ip link set eth0 promisc on
iface eth0 inet manual
auto macvlan
iface macvlan inet static
address 192.168.123.200
netmask 255.255.255.0
gateway 192.168.123.1
dns-nameservers 192.168.123.1
pre-up ip link add macvlan link eth0 type macvlan mode bridge
post-down ip link del macvlan link eth0 type macvlan mode bridge
ubuntu持久化promisc混合模式
可以通过service服务的方式自动开启promisc
, 参考askubuntu中的回答
$ sudo bash -c 'cat > /etc/systemd/system/bridge-promisc.service' <<'EOS'
[Unit]
Description=Makes interfaces run in promiscuous mode at boot
After=network-online.target
[Service]
Type=oneshot
ExecStart=/usr/sbin/ip link set dev eth0 promisc on
TimeoutStartSec=0
RemainAfterExit=yes
[Install]
WantedBy=default.target
EOS
$ sudo systemctl enable bridge-promisc
访问macvlan
宿主机有可能无法上网, 或者无法访问docker中的openwrt
参考docker openwrt 踩坑的几个小问题解决过程分享
ip addr del 192.168.123.2/24 dev eth0; \
ip link add macvlan link eth0 type macvlan mode bridge; \
ip addr add 192.168.123.2/24 dev macvlan; \
ip link set macvlan up; \
ip route del 192.168.123.0/24 dev eth0; \
ip route del default; \
ip route add 192.168.123.0/24 dev macvlan; \
ip route add default via 192.168.123.6 dev macvlan;
centos持久化macvlan访问
修改/etc/network/interfaces
文件
auto eth0
iface eth0 inet manual
auto macvlan
iface macvlan inet static
address 192.168.123.2
netmask 255.255.255.0
gateway 192.168.123.6
dns-nameservers 192.168.123.6
pre-up ip link add macvlan link eth0 type macvlan mode bridge
post-down ip link del macvlan link eth0 type macvlan mode bridge
# 其中192.168.123.0为网段,192.168.123.2为armbian地址,192.168.123.6为docker op地址
ubuntu持久化macvlan访问
参考netplan Support macvlan/macvtap interfaces
通过增加配置修改主机上网方式
vim /etc/networkd-dispatcher/routable.d/10-macvlan-interfaces.sh
文件内容
#! /bin/bash
ip link add macvlan link eth0 type macvlan mode bridge
增加配置
vim /etc/netplan/60-docker.yaml
network:
version: 2
renderer: networkd
ethernets:
macvlan:
addresses:
- 192.168.0.200/24
#gateway4: 192.168.0.201
routes:
- to: 0.0.0.0/0
via: 192.168.0.1
metric: 0
- to: 192.168.0.201/32
via: 0.0.0.0
metric: 0
修改文件权限
chmod o+x,g+x,u+x /etc/networkd-dispatcher/routable.d/10-macvlan-interfaces.sh
应用配置
netplan apply
或者 netplan --debug apply
端口转发
效果和 ssh -L 差不多,都是本地访问远程端口。
通过 SOCKS 代理
socat TCP4-LISTEN:<本地端口>,reuseaddr,fork SOCKS:<代理服务器IP>:<远程地址>:<远程端口>,socksport=<代理服务器端口>
通过 HTTP 代理
socat TCP4-LISTEN:<本地端口>,reuseaddr,fork PROXY:<代理服务器IP>:<远程地址>:<远程端口>,proxyport=<代理服务器端口>
socat作为系统服务
sudo bash -c '
cat <<EOF >/usr/lib/systemd/system/socat.service
[Unit]
Description=Socat Serial Loopback
After=network.target
[Service]
Type=simple
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=socat
ExecStart=socat TCP4-LISTEN:<本地端口>,reuseaddr,fork SOCKS:<代理服务器IP>:<远程地址>:<远程端口>,socksport=<代理服务器端口>
Restart=always
[Install]
WantedBy=multi-user.target
EOF
'
# 其中ExecStart改为自己的命令
sudo systemctl daemon-reload
sudo systemctl enable --now socat
sudo systemctl status socat